tor-browser

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

IssuerSerial.ts (5085B)


      1 import * as asn1js from "asn1js";
      2 import * as pvutils from "pvutils";
      3 import { EMPTY_STRING } from "../constants";
      4 import { AsnError } from "../errors";
      5 import { GeneralNames, GeneralNamesJson, GeneralNamesSchema } from "../GeneralNames";
      6 import { PkiObject, PkiObjectParameters } from "../PkiObject";
      7 import * as Schema from "../Schema";
      8 
      9 const ISSUER = "issuer";
     10 const SERIAL_NUMBER = "serialNumber";
     11 const ISSUER_UID = "issuerUID";
     12 const CLEAR_PROPS = [
     13  ISSUER,
     14  SERIAL_NUMBER,
     15  ISSUER_UID,
     16 ];
     17 
     18 export interface IIssuerSerial {
     19  /**
     20   * Issuer name
     21   */
     22  issuer: GeneralNames;
     23  /**
     24   * Serial number
     25   */
     26  serialNumber: asn1js.Integer;
     27  /**
     28   * Issuer unique identifier
     29   */
     30  issuerUID?: asn1js.BitString;
     31 }
     32 
     33 export type IssuerSerialParameters = PkiObjectParameters & Partial<IIssuerSerial>;
     34 
     35 export interface IssuerSerialJson {
     36  issuer: GeneralNamesJson;
     37  serialNumber: asn1js.IntegerJson;
     38  issuerUID?: asn1js.BitStringJson;
     39 }
     40 
     41 /**
     42 * Represents the IssuerSerial structure described in [RFC5755](https://datatracker.ietf.org/doc/html/rfc5755)
     43 */
     44 export class IssuerSerial extends PkiObject implements IIssuerSerial {
     45 
     46  public static override CLASS_NAME = "IssuerSerial";
     47 
     48  public issuer!: GeneralNames;
     49  public serialNumber!: asn1js.Integer;
     50  public issuerUID?: asn1js.BitString;
     51 
     52  /**
     53   * Initializes a new instance of the {@link IssuerSerial} class
     54   * @param parameters Initialization parameters
     55   */
     56  constructor(parameters: IssuerSerialParameters = {}) {
     57    super();
     58 
     59    this.issuer = pvutils.getParametersValue(parameters, ISSUER, IssuerSerial.defaultValues(ISSUER));
     60    this.serialNumber = pvutils.getParametersValue(parameters, SERIAL_NUMBER, IssuerSerial.defaultValues(SERIAL_NUMBER));
     61    if (ISSUER_UID in parameters) {
     62      this.issuerUID = pvutils.getParametersValue(parameters, ISSUER_UID, IssuerSerial.defaultValues(ISSUER_UID));
     63    }
     64 
     65    if (parameters.schema) {
     66      this.fromSchema(parameters.schema);
     67    }
     68  }
     69 
     70  /**
     71   * Returns default values for all class members
     72   * @param memberName String name for a class member
     73   * @returns Default value
     74   */
     75  public static override defaultValues(memberName: typeof ISSUER): GeneralNames;
     76  public static override defaultValues(memberName: typeof SERIAL_NUMBER): asn1js.Integer;
     77  public static override defaultValues(memberName: typeof ISSUER_UID): asn1js.BitString;
     78  public static override defaultValues(memberName: string): any {
     79    switch (memberName) {
     80      case ISSUER:
     81        return new GeneralNames();
     82      case SERIAL_NUMBER:
     83        return new asn1js.Integer();
     84      case ISSUER_UID:
     85        return new asn1js.BitString();
     86      default:
     87        return super.defaultValues(memberName);
     88    }
     89  }
     90 
     91  /**
     92   * @inheritdoc
     93   * @asn ASN.1 schema
     94   * ```asn
     95   * IssuerSerial ::= SEQUENCE {
     96   *     issuer         GeneralNames,
     97   *     serial         CertificateSerialNumber,
     98   *     issuerUID      UniqueIdentifier OPTIONAL
     99   * }
    100   *
    101   * CertificateSerialNumber ::= INTEGER
    102   * UniqueIdentifier ::= BIT STRING
    103   *```
    104   */
    105  public static override schema(parameters: Schema.SchemaParameters<{
    106    issuer?: GeneralNamesSchema;
    107    serialNumber?: string;
    108    issuerUID?: string;
    109  }> = {}): Schema.SchemaType {
    110    const names = pvutils.getParametersValue<NonNullable<typeof parameters.names>>(parameters, "names", {});
    111 
    112    return (new asn1js.Sequence({
    113      name: (names.blockName || EMPTY_STRING),
    114      value: [
    115        GeneralNames.schema(names.issuer || {}),
    116        new asn1js.Integer({ name: (names.serialNumber || EMPTY_STRING) }),
    117        new asn1js.BitString({
    118          optional: true,
    119          name: (names.issuerUID || EMPTY_STRING)
    120        })
    121      ]
    122    }));
    123  }
    124 
    125  public fromSchema(schema: Schema.SchemaType): void {
    126    // Clear input data first
    127    pvutils.clearProps(schema, CLEAR_PROPS);
    128    //#region Check the schema is valid
    129    const asn1 = asn1js.compareSchema(schema,
    130      schema,
    131      IssuerSerial.schema({
    132        names: {
    133          issuer: {
    134            names: {
    135              blockName: ISSUER
    136            }
    137          },
    138          serialNumber: SERIAL_NUMBER,
    139          issuerUID: ISSUER_UID
    140        }
    141      })
    142    );
    143 
    144    AsnError.assertSchema(asn1, this.className);
    145    //#endregion
    146    //#region Get internal properties from parsed schema
    147    this.issuer = new GeneralNames({ schema: asn1.result.issuer });
    148    this.serialNumber = asn1.result.serialNumber;
    149 
    150    if (ISSUER_UID in asn1.result)
    151      this.issuerUID = asn1.result.issuerUID;
    152    //#endregion
    153  }
    154 
    155  public toSchema(): asn1js.Sequence {
    156    const result = new asn1js.Sequence({
    157      value: [
    158        this.issuer.toSchema(),
    159        this.serialNumber
    160      ]
    161    });
    162 
    163    if (this.issuerUID) {
    164      result.valueBlock.value.push(this.issuerUID);
    165    }
    166 
    167    return result;
    168  }
    169 
    170  public toJSON(): IssuerSerialJson {
    171    const result = {
    172      issuer: this.issuer.toJSON(),
    173      serialNumber: this.serialNumber.toJSON()
    174    } as IssuerSerialJson;
    175 
    176    if (this.issuerUID) {
    177      result.issuerUID = this.issuerUID.toJSON();
    178    }
    179 
    180    return result;
    181  }
    182 
    183 }