tor-browser

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

AttributeCertificateInfoV1.ts (14098B)


      1 import * as asn1js from "asn1js";
      2 import * as pvutils from "pvutils";
      3 import { GeneralNames, GeneralNamesJson } from "../GeneralNames";
      4 import { AlgorithmIdentifier, AlgorithmIdentifierJson, AlgorithmIdentifierSchema } from "../AlgorithmIdentifier";
      5 import { Attribute, AttributeJson } from "../Attribute";
      6 import { Extensions, ExtensionsJson, ExtensionsSchema } from "../Extensions";
      7 import { AttCertValidityPeriod, AttCertValidityPeriodJson, AttCertValidityPeriodSchema } from "./AttCertValidityPeriod";
      8 import { IssuerSerial, IssuerSerialJson } from "./IssuerSerial";
      9 import * as Schema from "../Schema";
     10 import { PkiObject, PkiObjectParameters } from "../PkiObject";
     11 import { AsnError } from "../errors";
     12 import { EMPTY_STRING } from "../constants";
     13 
     14 const VERSION = "version";
     15 const BASE_CERTIFICATE_ID = "baseCertificateID";
     16 const SUBJECT_NAME = "subjectName";
     17 const ISSUER = "issuer";
     18 const SIGNATURE = "signature";
     19 const SERIAL_NUMBER = "serialNumber";
     20 const ATTR_CERT_VALIDITY_PERIOD = "attrCertValidityPeriod";
     21 const ATTRIBUTES = "attributes";
     22 const ISSUER_UNIQUE_ID = "issuerUniqueID";
     23 const EXTENSIONS = "extensions";
     24 const CLEAR_PROPS = [
     25  VERSION,
     26  BASE_CERTIFICATE_ID,
     27  SUBJECT_NAME,
     28  ISSUER,
     29  SIGNATURE,
     30  SERIAL_NUMBER,
     31  ATTR_CERT_VALIDITY_PERIOD,
     32  ATTRIBUTES,
     33  ISSUER_UNIQUE_ID,
     34  EXTENSIONS,
     35 ];
     36 
     37 export interface IAttributeCertificateInfoV1 {
     38  /**
     39   * The version field MUST have the value of v2
     40   */
     41  version: number;
     42  baseCertificateID?: IssuerSerial;
     43  subjectName?: GeneralNames;
     44  issuer: GeneralNames;
     45  /**
     46   * Contains the algorithm identifier used to validate the AC signature
     47   */
     48  signature: AlgorithmIdentifier;
     49  serialNumber: asn1js.Integer;
     50  /**
     51   * Specifies the period for which the AC issuer certifies that the binding between
     52   * the holder and the attributes fields will be valid
     53   */
     54  attrCertValidityPeriod: AttCertValidityPeriod;
     55  /**
     56   * The attributes field gives information about the AC holder
     57   */
     58  attributes: Attribute[];
     59 
     60  /**
     61   * Issuer unique identifier
     62   */
     63  issuerUniqueID?: asn1js.BitString;
     64  /**
     65   * The extensions field generally gives information about the AC as opposed
     66   * to information about the AC holder
     67   */
     68  extensions?: Extensions;
     69 }
     70 
     71 export interface AttributeCertificateInfoV1Json {
     72  version: number;
     73  baseCertificateID?: IssuerSerialJson;
     74  subjectName?: GeneralNamesJson;
     75  issuer: GeneralNamesJson;
     76  signature: AlgorithmIdentifierJson;
     77  serialNumber: asn1js.IntegerJson;
     78  attrCertValidityPeriod: AttCertValidityPeriodJson;
     79  attributes: AttributeJson[];
     80  issuerUniqueID: asn1js.BitStringJson;
     81  extensions: ExtensionsJson;
     82 }
     83 
     84 export type AttributeCertificateInfoV1Parameters = PkiObjectParameters & Partial<IAttributeCertificateInfoV1>;
     85 
     86 export type AttributeCertificateInfoV1Schema = Schema.SchemaParameters<{
     87  version?: string;
     88  baseCertificateID?: string;
     89  subjectName?: string;
     90  signature?: AlgorithmIdentifierSchema;
     91  issuer?: string;
     92  attrCertValidityPeriod?: AttCertValidityPeriodSchema;
     93  serialNumber?: string;
     94  attributes?: string;
     95  issuerUniqueID?: string;
     96  extensions?: ExtensionsSchema;
     97 }>;
     98 
     99 /**
    100 * Represents the AttributeCertificateInfoV1 structure described in [RFC5755](https://datatracker.ietf.org/doc/html/rfc5755)
    101 */
    102 export class AttributeCertificateInfoV1 extends PkiObject implements IAttributeCertificateInfoV1 {
    103 
    104  public static override CLASS_NAME = "AttributeCertificateInfoV1";
    105 
    106  version!: number;
    107  baseCertificateID?: IssuerSerial;
    108  subjectName?: GeneralNames;
    109  issuer!: GeneralNames;
    110  signature!: AlgorithmIdentifier;
    111  serialNumber!: asn1js.Integer;
    112  attrCertValidityPeriod!: AttCertValidityPeriod;
    113  attributes!: Attribute[];
    114  issuerUniqueID?: asn1js.BitString;
    115  extensions?: Extensions;
    116 
    117  /**
    118   * Initializes a new instance of the {@link AttributeCertificateInfoV1} class
    119   * @param parameters Initialization parameters
    120   */
    121  constructor(parameters: AttributeCertificateInfoV1Parameters = {}) {
    122    super();
    123 
    124    this.version = pvutils.getParametersValue(parameters, VERSION, AttributeCertificateInfoV1.defaultValues(VERSION));
    125    if (BASE_CERTIFICATE_ID in parameters) {
    126      this.baseCertificateID = pvutils.getParametersValue(parameters, BASE_CERTIFICATE_ID, AttributeCertificateInfoV1.defaultValues(BASE_CERTIFICATE_ID));
    127    }
    128    if (SUBJECT_NAME in parameters) {
    129      this.subjectName = pvutils.getParametersValue(parameters, SUBJECT_NAME, AttributeCertificateInfoV1.defaultValues(SUBJECT_NAME));
    130    }
    131    this.issuer = pvutils.getParametersValue(parameters, ISSUER, AttributeCertificateInfoV1.defaultValues(ISSUER));
    132    this.signature = pvutils.getParametersValue(parameters, SIGNATURE, AttributeCertificateInfoV1.defaultValues(SIGNATURE));
    133    this.serialNumber = pvutils.getParametersValue(parameters, SERIAL_NUMBER, AttributeCertificateInfoV1.defaultValues(SERIAL_NUMBER));
    134    this.attrCertValidityPeriod = pvutils.getParametersValue(parameters, ATTR_CERT_VALIDITY_PERIOD, AttributeCertificateInfoV1.defaultValues(ATTR_CERT_VALIDITY_PERIOD));
    135    this.attributes = pvutils.getParametersValue(parameters, ATTRIBUTES, AttributeCertificateInfoV1.defaultValues(ATTRIBUTES));
    136    if (ISSUER_UNIQUE_ID in parameters)
    137      this.issuerUniqueID = pvutils.getParametersValue(parameters, ISSUER_UNIQUE_ID, AttributeCertificateInfoV1.defaultValues(ISSUER_UNIQUE_ID));
    138 
    139    if (EXTENSIONS in parameters) {
    140      this.extensions = pvutils.getParametersValue(parameters, EXTENSIONS, AttributeCertificateInfoV1.defaultValues(EXTENSIONS));
    141    }
    142 
    143    if (parameters.schema) {
    144      this.fromSchema(parameters.schema);
    145    }
    146  }
    147 
    148  /**
    149   * Returns default values for all class members
    150   * @param memberName String name for a class member
    151   * @returns Default value
    152   */
    153  public static override defaultValues(memberName: typeof VERSION): number;
    154  public static override defaultValues(memberName: typeof BASE_CERTIFICATE_ID): IssuerSerial;
    155  public static override defaultValues(memberName: typeof SUBJECT_NAME): GeneralNames;
    156  public static override defaultValues(memberName: typeof ISSUER): GeneralNames;
    157  public static override defaultValues(memberName: typeof SIGNATURE): AlgorithmIdentifier;
    158  public static override defaultValues(memberName: typeof SERIAL_NUMBER): asn1js.Integer;
    159  public static override defaultValues(memberName: typeof ATTR_CERT_VALIDITY_PERIOD): AttCertValidityPeriod;
    160  public static override defaultValues(memberName: typeof ATTRIBUTES): Attribute[];
    161  public static override defaultValues(memberName: typeof ISSUER_UNIQUE_ID): asn1js.BitString;
    162  public static override defaultValues(memberName: typeof EXTENSIONS): Extensions;
    163  public static override defaultValues(memberName: string): any {
    164    switch (memberName) {
    165      case VERSION:
    166        return 0;
    167      case BASE_CERTIFICATE_ID:
    168        return new IssuerSerial();
    169      case SUBJECT_NAME:
    170        return new GeneralNames();
    171      case ISSUER:
    172        return new GeneralNames();
    173      case SIGNATURE:
    174        return new AlgorithmIdentifier();
    175      case SERIAL_NUMBER:
    176        return new asn1js.Integer();
    177      case ATTR_CERT_VALIDITY_PERIOD:
    178        return new AttCertValidityPeriod();
    179      case ATTRIBUTES:
    180        return [];
    181      case ISSUER_UNIQUE_ID:
    182        return new asn1js.BitString();
    183      case EXTENSIONS:
    184        return new Extensions();
    185      default:
    186        return super.defaultValues(memberName);
    187    }
    188  }
    189 
    190  /**
    191   * @inheritdoc
    192   * @asn ASN.1 schema
    193   * ```asn
    194   * AttributeCertificateInfo ::= SEQUENCE {
    195   *   version Version DEFAULT v1,
    196   *   subject CHOICE {
    197   *     baseCertificateID [0] IssuerSerial, -- associated with a Public Key Certificate
    198   *     subjectName [1] GeneralNames }, -- associated with a name
    199   *   issuer GeneralNames, -- CA issuing the attribute certificate
    200   *   signature AlgorithmIdentifier,
    201   *   serialNumber CertificateSerialNumber,
    202   *   attrCertValidityPeriod AttCertValidityPeriod,
    203   *   attributes SEQUENCE OF Attribute,
    204   *   issuerUniqueID UniqueIdentifier OPTIONAL,
    205   *   extensions Extensions OPTIONAL
    206   * }
    207   *```
    208   */
    209  public static override schema(parameters: AttributeCertificateInfoV1Schema = {}): Schema.SchemaType {
    210    const names = pvutils.getParametersValue<NonNullable<typeof parameters.names>>(parameters, "names", {});
    211 
    212    return (new asn1js.Sequence({
    213      name: (names.blockName || EMPTY_STRING),
    214      value: [
    215        new asn1js.Integer({ name: (names.version || EMPTY_STRING) }),
    216        new asn1js.Choice({
    217          value: [
    218            new asn1js.Constructed({
    219              name: (names.baseCertificateID || EMPTY_STRING),
    220              idBlock: {
    221                tagClass: 3,
    222                tagNumber: 0 // [0]
    223              },
    224              value: IssuerSerial.schema().valueBlock.value
    225            }),
    226            new asn1js.Constructed({
    227              name: (names.subjectName || EMPTY_STRING),
    228              idBlock: {
    229                tagClass: 3,
    230                tagNumber: 1 // [2]
    231              },
    232              value: GeneralNames.schema().valueBlock.value
    233            }),
    234          ]
    235        }),
    236        GeneralNames.schema({
    237          names: {
    238            blockName: (names.issuer || EMPTY_STRING)
    239          }
    240        }),
    241        AlgorithmIdentifier.schema(names.signature || {}),
    242        new asn1js.Integer({ name: (names.serialNumber || EMPTY_STRING) }),
    243        AttCertValidityPeriod.schema(names.attrCertValidityPeriod || {}),
    244        new asn1js.Sequence({
    245          name: (names.attributes || EMPTY_STRING),
    246          value: [
    247            new asn1js.Repeated({
    248              value: Attribute.schema()
    249            })
    250          ]
    251        }),
    252        new asn1js.BitString({
    253          optional: true,
    254          name: (names.issuerUniqueID || EMPTY_STRING)
    255        }),
    256        Extensions.schema(names.extensions || {}, true)
    257      ]
    258    }));
    259  }
    260 
    261  public fromSchema(schema: Schema.SchemaType): void {
    262    // Clear input data first
    263    pvutils.clearProps(schema, CLEAR_PROPS);
    264    //#region Check the schema is valid
    265    const asn1 = asn1js.compareSchema(schema,
    266      schema,
    267      AttributeCertificateInfoV1.schema({
    268        names: {
    269          version: VERSION,
    270          baseCertificateID: BASE_CERTIFICATE_ID,
    271          subjectName: SUBJECT_NAME,
    272          issuer: ISSUER,
    273          signature: {
    274            names: {
    275              blockName: SIGNATURE
    276            }
    277          },
    278          serialNumber: SERIAL_NUMBER,
    279          attrCertValidityPeriod: {
    280            names: {
    281              blockName: ATTR_CERT_VALIDITY_PERIOD
    282            }
    283          },
    284          attributes: ATTRIBUTES,
    285          issuerUniqueID: ISSUER_UNIQUE_ID,
    286          extensions: {
    287            names: {
    288              blockName: EXTENSIONS
    289            }
    290          }
    291        }
    292      })
    293    );
    294 
    295    AsnError.assertSchema(asn1, this.className);
    296    //#endregion
    297 
    298    //#region Get internal properties from parsed schema
    299    this.version = asn1.result.version.valueBlock.valueDec;
    300 
    301    if (BASE_CERTIFICATE_ID in asn1.result) {
    302      this.baseCertificateID = new IssuerSerial({
    303        schema: new asn1js.Sequence({
    304          value: asn1.result.baseCertificateID.valueBlock.value
    305        })
    306      });
    307    }
    308 
    309    if (SUBJECT_NAME in asn1.result) {
    310      this.subjectName = new GeneralNames({
    311        schema: new asn1js.Sequence({
    312          value: asn1.result.subjectName.valueBlock.value
    313        })
    314      });
    315    }
    316 
    317    this.issuer = asn1.result.issuer;
    318    this.signature = new AlgorithmIdentifier({ schema: asn1.result.signature });
    319    this.serialNumber = asn1.result.serialNumber;
    320    this.attrCertValidityPeriod = new AttCertValidityPeriod({ schema: asn1.result.attrCertValidityPeriod });
    321    this.attributes = Array.from(asn1.result.attributes.valueBlock.value, element => new Attribute({ schema: element }));
    322 
    323    if (ISSUER_UNIQUE_ID in asn1.result) {
    324      this.issuerUniqueID = asn1.result.issuerUniqueID;
    325    }
    326 
    327    if (EXTENSIONS in asn1.result) {
    328      this.extensions = new Extensions({ schema: asn1.result.extensions });
    329    }
    330    //#endregion
    331  }
    332 
    333  public toSchema(): asn1js.Sequence {
    334    const result = new asn1js.Sequence({
    335      value: [new asn1js.Integer({ value: this.version })]
    336    });
    337 
    338    if (this.baseCertificateID) {
    339      result.valueBlock.value.push(new asn1js.Constructed({
    340        idBlock: {
    341          tagClass: 3,
    342          tagNumber: 0 // [0]
    343        },
    344        value: this.baseCertificateID.toSchema().valueBlock.value
    345      }));
    346    }
    347 
    348    if (this.subjectName) {
    349      result.valueBlock.value.push(new asn1js.Constructed({
    350        idBlock: {
    351          tagClass: 3,
    352          tagNumber: 1 // [1]
    353        },
    354        value: this.subjectName.toSchema().valueBlock.value
    355      }));
    356    }
    357 
    358    result.valueBlock.value.push(this.issuer.toSchema());
    359    result.valueBlock.value.push(this.signature.toSchema());
    360    result.valueBlock.value.push(this.serialNumber);
    361    result.valueBlock.value.push(this.attrCertValidityPeriod.toSchema());
    362    result.valueBlock.value.push(new asn1js.Sequence({
    363      value: Array.from(this.attributes, o => o.toSchema())
    364    }));
    365 
    366    if (this.issuerUniqueID) {
    367      result.valueBlock.value.push(this.issuerUniqueID);
    368    }
    369 
    370    if (this.extensions) {
    371      result.valueBlock.value.push(this.extensions.toSchema());
    372    }
    373 
    374    return result;
    375  }
    376 
    377  public toJSON(): AttributeCertificateInfoV1Json {
    378    const result = {
    379      version: this.version
    380    } as AttributeCertificateInfoV1Json;
    381 
    382    if (this.baseCertificateID) {
    383      result.baseCertificateID = this.baseCertificateID.toJSON();
    384    }
    385 
    386    if (this.subjectName) {
    387      result.subjectName = this.subjectName.toJSON();
    388    }
    389 
    390    result.issuer = this.issuer.toJSON();
    391    result.signature = this.signature.toJSON();
    392    result.serialNumber = this.serialNumber.toJSON();
    393    result.attrCertValidityPeriod = this.attrCertValidityPeriod.toJSON();
    394    result.attributes = Array.from(this.attributes, o => o.toJSON());
    395 
    396    if (this.issuerUniqueID) {
    397      result.issuerUniqueID = this.issuerUniqueID.toJSON();
    398    }
    399 
    400    if (this.extensions) {
    401      result.extensions = this.extensions.toJSON();
    402    }
    403 
    404    return result;
    405  }
    406 
    407 }