tor-browser

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

AttributeCertificateV1.ts (5440B)


      1 import * as asn1js from "asn1js";
      2 import * as pvutils from "pvutils";
      3 import { AlgorithmIdentifier, AlgorithmIdentifierJson, AlgorithmIdentifierSchema } from "../AlgorithmIdentifier";
      4 import { AttributeCertificateInfoV1, AttributeCertificateInfoV1Json, AttributeCertificateInfoV1Schema } from "./AttributeCertificateInfoV1";
      5 import * as Schema from "../Schema";
      6 import { PkiObject, PkiObjectParameters } from "../PkiObject";
      7 import { AsnError } from "../errors";
      8 import { EMPTY_STRING } from "../constants";
      9 
     10 const ACINFO = "acinfo";
     11 const SIGNATURE_ALGORITHM = "signatureAlgorithm";
     12 const SIGNATURE_VALUE = "signatureValue";
     13 const CLEAR_PROPS = [
     14  ACINFO,
     15  SIGNATURE_VALUE,
     16  SIGNATURE_ALGORITHM
     17 ];
     18 
     19 export interface IAttributeCertificateV1 {
     20  /**
     21   * Attribute certificate information
     22   */
     23  acinfo: AttributeCertificateInfoV1;
     24  /**
     25   * Signature algorithm
     26   */
     27  signatureAlgorithm: AlgorithmIdentifier;
     28  /**
     29   * Signature value
     30   */
     31  signatureValue: asn1js.BitString;
     32 }
     33 
     34 export interface AttributeCertificateV1Json {
     35  acinfo: AttributeCertificateInfoV1Json;
     36  signatureAlgorithm: AlgorithmIdentifierJson;
     37  signatureValue: asn1js.BitStringJson;
     38 }
     39 
     40 export type AttributeCertificateV1Parameters = PkiObjectParameters & Partial<IAttributeCertificateV1>;
     41 
     42 /**
     43 * Class from X.509:1997
     44 */
     45 export class AttributeCertificateV1 extends PkiObject implements IAttributeCertificateV1 {
     46 
     47  public static override CLASS_NAME = "AttributeCertificateV1";
     48 
     49  public acinfo!: AttributeCertificateInfoV1;
     50  public signatureAlgorithm!: AlgorithmIdentifier;
     51  public signatureValue!: asn1js.BitString;
     52 
     53  /**
     54   * Initializes a new instance of the {@link AttributeCertificateV1} class
     55   * @param parameters Initialization parameters
     56   */
     57  constructor(parameters: AttributeCertificateV1Parameters = {}) {
     58    super();
     59 
     60    this.acinfo = pvutils.getParametersValue(parameters, ACINFO, AttributeCertificateV1.defaultValues(ACINFO));
     61    this.signatureAlgorithm = pvutils.getParametersValue(parameters, SIGNATURE_ALGORITHM, AttributeCertificateV1.defaultValues(SIGNATURE_ALGORITHM));
     62    this.signatureValue = pvutils.getParametersValue(parameters, SIGNATURE_VALUE, AttributeCertificateV1.defaultValues(SIGNATURE_VALUE));
     63 
     64    if (parameters.schema) {
     65      this.fromSchema(parameters.schema);
     66    }
     67  }
     68 
     69  /**
     70   * Returns default values for all class members
     71   * @param memberName String name for a class member
     72   * @returns Default value
     73   */
     74  public static override defaultValues(memberName: typeof ACINFO): AttributeCertificateInfoV1;
     75  public static override defaultValues(memberName: typeof SIGNATURE_ALGORITHM): AlgorithmIdentifier;
     76  public static override defaultValues(memberName: typeof SIGNATURE_VALUE): asn1js.BitString;
     77  public static override defaultValues(memberName: string): any {
     78    switch (memberName) {
     79      case ACINFO:
     80        return new AttributeCertificateInfoV1();
     81      case SIGNATURE_ALGORITHM:
     82        return new AlgorithmIdentifier();
     83      case SIGNATURE_VALUE:
     84        return new asn1js.BitString();
     85      default:
     86        return super.defaultValues(memberName);
     87    }
     88  }
     89 
     90  /**
     91   * @inheritdoc
     92   * @asn ASN.1 schema
     93   * ```asn
     94   * AttributeCertificate ::= SEQUENCE {
     95   *   acinfo               AttributeCertificateInfoV1,
     96   *   signatureAlgorithm   AlgorithmIdentifier,
     97   *   signatureValue       BIT STRING
     98   * }
     99   *```
    100   */
    101  public static override schema(parameters: Schema.SchemaParameters<{
    102    acinfo?: AttributeCertificateInfoV1Schema;
    103    signatureAlgorithm?: AlgorithmIdentifierSchema;
    104    signatureValue?: string;
    105  }> = {}): Schema.SchemaType {
    106    const names = pvutils.getParametersValue<NonNullable<typeof parameters.names>>(parameters, "names", {});
    107 
    108    return (new asn1js.Sequence({
    109      name: (names.blockName || EMPTY_STRING),
    110      value: [
    111        AttributeCertificateInfoV1.schema(names.acinfo || {}),
    112        AlgorithmIdentifier.schema(names.signatureAlgorithm || {}),
    113        new asn1js.BitString({ name: (names.signatureValue || EMPTY_STRING) })
    114      ]
    115    }));
    116  }
    117 
    118  public fromSchema(schema: Schema.SchemaType): void {
    119    // Clear input data first
    120    pvutils.clearProps(schema, CLEAR_PROPS);
    121 
    122    //#region Check the schema is valid
    123    const asn1 = asn1js.compareSchema(schema,
    124      schema,
    125      AttributeCertificateV1.schema({
    126        names: {
    127          acinfo: {
    128            names: {
    129              blockName: ACINFO
    130            }
    131          },
    132          signatureAlgorithm: {
    133            names: {
    134              blockName: SIGNATURE_ALGORITHM
    135            }
    136          },
    137          signatureValue: SIGNATURE_VALUE
    138        }
    139      })
    140    );
    141    AsnError.assertSchema(asn1, this.className);
    142    //#endregion
    143 
    144    //#region Get internal properties from parsed schema
    145    this.acinfo = new AttributeCertificateInfoV1({ schema: asn1.result.acinfo });
    146    this.signatureAlgorithm = new AlgorithmIdentifier({ schema: asn1.result.signatureAlgorithm });
    147    this.signatureValue = asn1.result.signatureValue;
    148    //#endregion
    149  }
    150 
    151  public toSchema(): asn1js.Sequence {
    152    return (new asn1js.Sequence({
    153      value: [
    154        this.acinfo.toSchema(),
    155        this.signatureAlgorithm.toSchema(),
    156        this.signatureValue
    157      ]
    158    }));
    159  }
    160 
    161  public toJSON(): AttributeCertificateV1Json {
    162    return {
    163      acinfo: this.acinfo.toJSON(),
    164      signatureAlgorithm: this.signatureAlgorithm.toJSON(),
    165      signatureValue: this.signatureValue.toJSON(),
    166    };
    167  }
    168 
    169 }