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 }