ExtensionValueFactory.ts (4872B)
1 import * as asn1js from "asn1js"; 2 import * as OID from "./ObjectIdentifiers"; 3 import * as Schema from "./Schema"; 4 5 export type ExtensionParsedValue = (Schema.SchemaCompatible & { 6 parsingError?: string; 7 }) | Schema.SchemaType; 8 9 export interface ExtensionValueType { 10 name: string; 11 type: ExtensionValueConstructor; 12 } 13 14 export interface ExtensionValueConstructor { 15 new(params?: { schema: any; }): Schema.SchemaCompatible; 16 } 17 18 export class ExtensionValueFactory { 19 20 public static types?: Record<string, ExtensionValueType>; 21 22 private static getItems(): Record<string, ExtensionValueType> { 23 if (!this.types) { 24 this.types = {}; 25 26 // Register wellknown extensions 27 ExtensionValueFactory.register(OID.id_SubjectAltName, "SubjectAltName", AltName); 28 ExtensionValueFactory.register(OID.id_IssuerAltName, "IssuerAltName", AltName); 29 ExtensionValueFactory.register(OID.id_AuthorityKeyIdentifier, "AuthorityKeyIdentifier", AuthorityKeyIdentifier); 30 ExtensionValueFactory.register(OID.id_BasicConstraints, "BasicConstraints", BasicConstraints); 31 ExtensionValueFactory.register(OID.id_MicrosoftCaVersion, "MicrosoftCaVersion", CAVersion); 32 ExtensionValueFactory.register(OID.id_CertificatePolicies, "CertificatePolicies", CertificatePolicies); 33 ExtensionValueFactory.register(OID.id_MicrosoftAppPolicies, "CertificatePoliciesMicrosoft", CertificatePolicies); 34 ExtensionValueFactory.register(OID.id_MicrosoftCertTemplateV2, "MicrosoftCertTemplateV2", CertificateTemplate); 35 ExtensionValueFactory.register(OID.id_CRLDistributionPoints, "CRLDistributionPoints", CRLDistributionPoints); 36 ExtensionValueFactory.register(OID.id_FreshestCRL, "FreshestCRL", CRLDistributionPoints); 37 ExtensionValueFactory.register(OID.id_ExtKeyUsage, "ExtKeyUsage", ExtKeyUsage); 38 ExtensionValueFactory.register(OID.id_CertificateIssuer, "CertificateIssuer", GeneralNames); 39 ExtensionValueFactory.register(OID.id_AuthorityInfoAccess, "AuthorityInfoAccess", InfoAccess); 40 ExtensionValueFactory.register(OID.id_SubjectInfoAccess, "SubjectInfoAccess", InfoAccess); 41 ExtensionValueFactory.register(OID.id_IssuingDistributionPoint, "IssuingDistributionPoint", IssuingDistributionPoint); 42 ExtensionValueFactory.register(OID.id_NameConstraints, "NameConstraints", NameConstraints); 43 ExtensionValueFactory.register(OID.id_PolicyConstraints, "PolicyConstraints", PolicyConstraints); 44 ExtensionValueFactory.register(OID.id_PolicyMappings, "PolicyMappings", PolicyMappings); 45 ExtensionValueFactory.register(OID.id_PrivateKeyUsagePeriod, "PrivateKeyUsagePeriod", PrivateKeyUsagePeriod); 46 ExtensionValueFactory.register(OID.id_QCStatements, "QCStatements", QCStatements); 47 ExtensionValueFactory.register(OID.id_SignedCertificateTimestampList, "SignedCertificateTimestampList", SignedCertificateTimestampList); 48 ExtensionValueFactory.register(OID.id_SubjectDirectoryAttributes, "SubjectDirectoryAttributes", SubjectDirectoryAttributes); 49 } 50 51 return this.types; 52 } 53 54 public static fromBER(id: string, raw: BufferSource): ExtensionParsedValue | null { 55 const asn1 = asn1js.fromBER(raw); 56 if (asn1.offset === -1) { 57 return null; 58 } 59 60 const item = this.find(id); 61 if (item) { 62 try { 63 return new item.type({ schema: asn1.result }); 64 } catch { 65 const res: ExtensionParsedValue = new item.type(); 66 res.parsingError = `Incorrectly formatted value of extension ${item.name} (${id})`; 67 68 return res; 69 } 70 } 71 72 return asn1.result; 73 } 74 75 public static find(id: string): ExtensionValueType | null { 76 const types = this.getItems(); 77 78 return types[id] || null; 79 } 80 81 public static register(id: string, name: string, type: ExtensionValueConstructor) { 82 this.getItems()[id] = { name, type }; 83 } 84 85 } 86 87 import { AltName } from "./AltName"; 88 import { AuthorityKeyIdentifier } from "./AuthorityKeyIdentifier"; 89 import { BasicConstraints } from "./BasicConstraints"; 90 import { CAVersion } from "./CAVersion"; 91 import { CertificatePolicies } from "./CertificatePolicies"; 92 import { CertificateTemplate } from "./CertificateTemplate"; 93 import { CRLDistributionPoints } from "./CRLDistributionPoints"; 94 import { ExtKeyUsage } from "./ExtKeyUsage"; 95 import { GeneralNames } from "./GeneralNames"; 96 import { InfoAccess } from "./InfoAccess"; 97 import { IssuingDistributionPoint } from "./IssuingDistributionPoint"; 98 import { NameConstraints } from "./NameConstraints"; 99 import { PolicyConstraints } from "./PolicyConstraints"; 100 import { PolicyMappings } from "./PolicyMappings"; 101 import { PrivateKeyUsagePeriod } from "./PrivateKeyUsagePeriod"; 102 import { QCStatements } from "./QCStatements"; 103 import { SignedCertificateTimestampList } from "./SignedCertificateTimestampList"; 104 import { SubjectDirectoryAttributes } from "./SubjectDirectoryAttributes";