diff options
Diffstat (limited to 'third_party/js/PKI.js/src/ExtensionValueFactory.ts')
-rw-r--r-- | third_party/js/PKI.js/src/ExtensionValueFactory.ts | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/third_party/js/PKI.js/src/ExtensionValueFactory.ts b/third_party/js/PKI.js/src/ExtensionValueFactory.ts new file mode 100644 index 0000000000..a74cb00e53 --- /dev/null +++ b/third_party/js/PKI.js/src/ExtensionValueFactory.ts @@ -0,0 +1,106 @@ +import * as asn1js from "asn1js"; +import * as OID from "./ObjectIdentifiers"; +import * as Schema from "./Schema"; + +export type ExtensionParsedValue = (Schema.SchemaCompatible & { + parsingError?: string; +}) | Schema.SchemaType; + +export interface ExtensionValueType { + name: string; + type: ExtensionValueConstructor; +} + +export interface ExtensionValueConstructor { + new(params?: { schema: any; }): Schema.SchemaCompatible; +} + +export class ExtensionValueFactory { + + public static types?: Record<string, ExtensionValueType>; + + private static getItems(): Record<string, ExtensionValueType> { + if (!this.types) { + this.types = {}; + + // Register wellknown extensions + ExtensionValueFactory.register(OID.id_SubjectAltName, "SubjectAltName", AltName); + ExtensionValueFactory.register(OID.id_IssuerAltName, "IssuerAltName", AltName); + ExtensionValueFactory.register(OID.id_AuthorityKeyIdentifier, "AuthorityKeyIdentifier", AuthorityKeyIdentifier); + ExtensionValueFactory.register(OID.id_BasicConstraints, "BasicConstraints", BasicConstraints); + ExtensionValueFactory.register(OID.id_MicrosoftCaVersion, "MicrosoftCaVersion", CAVersion); + ExtensionValueFactory.register(OID.id_CertificatePolicies, "CertificatePolicies", CertificatePolicies); + ExtensionValueFactory.register(OID.id_MicrosoftAppPolicies, "CertificatePoliciesMicrosoft", CertificatePolicies); + ExtensionValueFactory.register(OID.id_MicrosoftCertTemplateV2, "MicrosoftCertTemplateV2", CertificateTemplate); + ExtensionValueFactory.register(OID.id_CRLDistributionPoints, "CRLDistributionPoints", CRLDistributionPoints); + ExtensionValueFactory.register(OID.id_FreshestCRL, "FreshestCRL", CRLDistributionPoints); + ExtensionValueFactory.register(OID.id_ExtKeyUsage, "ExtKeyUsage", ExtKeyUsage); + ExtensionValueFactory.register(OID.id_CertificateIssuer, "CertificateIssuer", GeneralNames); + ExtensionValueFactory.register(OID.id_AuthorityInfoAccess, "AuthorityInfoAccess", InfoAccess); + ExtensionValueFactory.register(OID.id_SubjectInfoAccess, "SubjectInfoAccess", InfoAccess); + ExtensionValueFactory.register(OID.id_IssuingDistributionPoint, "IssuingDistributionPoint", IssuingDistributionPoint); + ExtensionValueFactory.register(OID.id_NameConstraints, "NameConstraints", NameConstraints); + ExtensionValueFactory.register(OID.id_PolicyConstraints, "PolicyConstraints", PolicyConstraints); + ExtensionValueFactory.register(OID.id_PolicyMappings, "PolicyMappings", PolicyMappings); + ExtensionValueFactory.register(OID.id_PrivateKeyUsagePeriod, "PrivateKeyUsagePeriod", PrivateKeyUsagePeriod); + ExtensionValueFactory.register(OID.id_QCStatements, "QCStatements", QCStatements); + ExtensionValueFactory.register(OID.id_SignedCertificateTimestampList, "SignedCertificateTimestampList", SignedCertificateTimestampList); + ExtensionValueFactory.register(OID.id_SubjectDirectoryAttributes, "SubjectDirectoryAttributes", SubjectDirectoryAttributes); + } + + return this.types; + } + + public static fromBER(id: string, raw: BufferSource): ExtensionParsedValue | null { + const asn1 = asn1js.fromBER(raw); + if (asn1.offset === -1) { + return null; + } + + const item = this.find(id); + if (item) { + try { + return new item.type({ schema: asn1.result }); + } catch (ex) { + const res: ExtensionParsedValue = new item.type(); + res.parsingError = `Incorrectly formatted value of extension ${item.name} (${id})`; + + return res; + } + } + + return asn1.result; + } + + public static find(id: string): ExtensionValueType | null { + const types = this.getItems(); + + return types[id] || null; + } + + public static register(id: string, name: string, type: ExtensionValueConstructor) { + this.getItems()[id] = { name, type }; + } + +} + +import { AltName } from "./AltName"; +import { AuthorityKeyIdentifier } from "./AuthorityKeyIdentifier"; +import { BasicConstraints } from "./BasicConstraints"; +import { CAVersion } from "./CAVersion"; +import { CertificatePolicies } from "./CertificatePolicies"; +import { CertificateTemplate } from "./CertificateTemplate"; +import { CRLDistributionPoints } from "./CRLDistributionPoints"; +import { ExtKeyUsage } from "./ExtKeyUsage"; +import { GeneralNames } from "./GeneralNames"; +import { InfoAccess } from "./InfoAccess"; +import { IssuingDistributionPoint } from "./IssuingDistributionPoint"; +import { NameConstraints } from "./NameConstraints"; +import { PolicyConstraints } from "./PolicyConstraints"; +import { PolicyMappings } from "./PolicyMappings"; +import { PrivateKeyUsagePeriod } from "./PrivateKeyUsagePeriod"; +import { QCStatements } from "./QCStatements"; +import { SignedCertificateTimestampList } from "./SignedCertificateTimestampList"; +import { SubjectDirectoryAttributes } from "./SubjectDirectoryAttributes"; + + |