tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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";