add validation, helpers, tests

This commit is contained in:
Alex Holliday committed 2026-09-10 12:23:20 -07:00
1 parent 131fd1a6b0
commit 5eb16fdbdb
13 files changed
+249 -13

No files matched your search

+5
View File
@@ -0,0 +1,5 @@
export const DOCKER_TLS_URL = /^(tcp|https):\/\/([^/\s:]+)(?::(\d+))?\/?$/;
export const DOCKER_SOCKET_URL = /^(?:unix:\/\/\/\S+|\/\S+)$/;
export const isDockerTlsUrl = (url: string | undefined): boolean => DOCKER_TLS_URL.test(url?.trim() ?? "");
export const isDockerSocketUrl = (url: string | undefined): boolean => DOCKER_SOCKET_URL.test(url?.trim() ?? "");
+28
View File
@@ -0,0 +1,28 @@
import { createPrivateKey, KeyObject, X509Certificate } from "node:crypto";
const PEM_CERT_BLOCK = /-----BEGIN CERTIFICATE-----[\s\S]*?-----END CERTIFICATE-----/g;
export const splitCertificateBundle = (pem: string): string[] => pem.match(PEM_CERT_BLOCK) ?? [];
export const parseCertificates = (pem: string): X509Certificate[] => {
const blocks = splitCertificateBundle(pem);
if (blocks.length === 0) throw new Error("No certificate found; expected one or more PEM CERTIFICATE blocks");
try {
return blocks.map((block) => new X509Certificate(block));
} catch {
throw new Error("Certificate is not valid PEM");
}
};
export const parsePrivateKey = (pem: string): KeyObject => {
if (/^-----BEGIN ENCRYPTED PRIVATE KEY-----/m.test(pem) || /^Proc-Type: 4,ENCRYPTED/m.test(pem)) {
throw new Error("Encrypted private keys are not supported; remove the passphrase first");
}
try {
return createPrivateKey(pem);
} catch {
throw new Error("Private key is not valid PEM");
}
};
export const keyMatchesCertificate = (key: KeyObject, certificate: X509Certificate): boolean => certificate.checkPrivateKey(key);