AttributeCertificateInfoV2.ts (12033B)
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 "../AttributeCertificateV1"; 8 import { V2Form, V2FormJson } from "./V2Form"; 9 import { Holder, HolderJson, HolderSchema } from "./Holder"; 10 import * as Schema from "../Schema"; 11 import { PkiObject, PkiObjectParameters } from "../PkiObject"; 12 import { AsnError } from "../errors"; 13 import { EMPTY_STRING } from "../constants"; 14 15 const VERSION = "version"; 16 const HOLDER = "holder"; 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 HOLDER, 27 ISSUER, 28 SIGNATURE, 29 SERIAL_NUMBER, 30 ATTR_CERT_VALIDITY_PERIOD, 31 ATTRIBUTES, 32 ISSUER_UNIQUE_ID, 33 EXTENSIONS 34 ]; 35 36 export interface IAttributeCertificateInfoV2 { 37 version: number; 38 holder: Holder; 39 issuer: GeneralNames | V2Form; 40 signature: AlgorithmIdentifier; 41 serialNumber: asn1js.Integer; 42 attrCertValidityPeriod: AttCertValidityPeriod; 43 attributes: Attribute[]; 44 issuerUniqueID?: asn1js.BitString; 45 extensions?: Extensions; 46 } 47 48 export type AttributeCertificateInfoV2Parameters = PkiObjectParameters & Partial<AttributeCertificateInfoV2>; 49 50 export type AttributeCertificateInfoV2Schema = Schema.SchemaParameters<{ 51 version?: string; 52 holder?: HolderSchema; 53 issuer?: string; 54 signature?: AlgorithmIdentifierSchema; 55 serialNumber?: string; 56 attrCertValidityPeriod?: AttCertValidityPeriodSchema; 57 attributes?: string; 58 issuerUniqueID?: string; 59 extensions?: ExtensionsSchema; 60 }>; 61 62 export interface AttributeCertificateInfoV2Json { 63 version: number; 64 holder: HolderJson; 65 issuer: GeneralNamesJson | V2FormJson; 66 signature: AlgorithmIdentifierJson; 67 serialNumber: asn1js.IntegerJson; 68 attrCertValidityPeriod: AttCertValidityPeriodJson; 69 attributes: AttributeJson[]; 70 issuerUniqueID?: asn1js.BitStringJson; 71 extensions?: ExtensionsJson; 72 } 73 74 /** 75 * Represents the AttributeCertificateInfoV2 structure described in [RFC5755](https://datatracker.ietf.org/doc/html/rfc5755) 76 */ 77 export class AttributeCertificateInfoV2 extends PkiObject implements IAttributeCertificateInfoV2 { 78 79 public static override CLASS_NAME = "AttributeCertificateInfoV2"; 80 81 public version!: number; 82 public holder!: Holder; 83 public issuer!: GeneralNames | V2Form; 84 public signature!: AlgorithmIdentifier; 85 public serialNumber!: asn1js.Integer; 86 public attrCertValidityPeriod!: AttCertValidityPeriod; 87 public attributes!: Attribute[]; 88 public issuerUniqueID?: asn1js.BitString; 89 public extensions?: Extensions; 90 91 /** 92 * Initializes a new instance of the {@link AttributeCertificateInfoV2} class 93 * @param parameters Initialization parameters 94 */ 95 constructor(parameters: AttributeCertificateInfoV2Parameters = {}) { 96 super(); 97 98 this.version = pvutils.getParametersValue(parameters, VERSION, AttributeCertificateInfoV2.defaultValues(VERSION)); 99 this.holder = pvutils.getParametersValue(parameters, HOLDER, AttributeCertificateInfoV2.defaultValues(HOLDER)); 100 this.issuer = pvutils.getParametersValue(parameters, ISSUER, AttributeCertificateInfoV2.defaultValues(ISSUER)); 101 this.signature = pvutils.getParametersValue(parameters, SIGNATURE, AttributeCertificateInfoV2.defaultValues(SIGNATURE)); 102 this.serialNumber = pvutils.getParametersValue(parameters, SERIAL_NUMBER, AttributeCertificateInfoV2.defaultValues(SERIAL_NUMBER)); 103 this.attrCertValidityPeriod = pvutils.getParametersValue(parameters, ATTR_CERT_VALIDITY_PERIOD, AttributeCertificateInfoV2.defaultValues(ATTR_CERT_VALIDITY_PERIOD)); 104 this.attributes = pvutils.getParametersValue(parameters, ATTRIBUTES, AttributeCertificateInfoV2.defaultValues(ATTRIBUTES)); 105 if (ISSUER_UNIQUE_ID in parameters) { 106 this.issuerUniqueID = pvutils.getParametersValue(parameters, ISSUER_UNIQUE_ID, AttributeCertificateInfoV2.defaultValues(ISSUER_UNIQUE_ID)); 107 } 108 if (EXTENSIONS in parameters) { 109 this.extensions = pvutils.getParametersValue(parameters, EXTENSIONS, AttributeCertificateInfoV2.defaultValues(EXTENSIONS)); 110 } 111 112 if (parameters.schema) { 113 this.fromSchema(parameters.schema); 114 } 115 } 116 117 /** 118 * Returns default values for all class members 119 * @param memberName String name for a class member 120 * @returns Default value 121 */ 122 public static override defaultValues(memberName: typeof VERSION): number; 123 public static override defaultValues(memberName: typeof HOLDER): Holder; 124 public static override defaultValues(memberName: typeof ISSUER): GeneralNames | V2Form; 125 public static override defaultValues(memberName: typeof SIGNATURE): AlgorithmIdentifier; 126 public static override defaultValues(memberName: typeof SERIAL_NUMBER): asn1js.Integer; 127 public static override defaultValues(memberName: typeof ATTR_CERT_VALIDITY_PERIOD): AttCertValidityPeriod; 128 public static override defaultValues(memberName: typeof ATTRIBUTES): Attribute[]; 129 public static override defaultValues(memberName: typeof ISSUER_UNIQUE_ID): asn1js.BitString; 130 public static override defaultValues(memberName: typeof EXTENSIONS): Extensions; 131 public static override defaultValues(memberName: string): any { 132 switch (memberName) { 133 case VERSION: 134 return 1; 135 case HOLDER: 136 return new Holder(); 137 case ISSUER: 138 return {}; 139 case SIGNATURE: 140 return new AlgorithmIdentifier(); 141 case SERIAL_NUMBER: 142 return new asn1js.Integer(); 143 case ATTR_CERT_VALIDITY_PERIOD: 144 return new AttCertValidityPeriod(); 145 case ATTRIBUTES: 146 return []; 147 case ISSUER_UNIQUE_ID: 148 return new asn1js.BitString(); 149 case EXTENSIONS: 150 return new Extensions(); 151 default: 152 return super.defaultValues(memberName); 153 } 154 } 155 156 /** 157 * @inheritdoc 158 * @asn ASN.1 schema 159 * ```asn 160 * AttributeCertificateInfoV2 ::= SEQUENCE { 161 * version AttCertVersion, -- version is v2 162 * holder Holder, 163 * issuer AttCertIssuer, 164 * signature AlgorithmIdentifier, 165 * serialNumber CertificateSerialNumber, 166 * attrCertValidityPeriod AttCertValidityPeriod, 167 * attributes SEQUENCE OF Attribute, 168 * issuerUniqueID UniqueIdentifier OPTIONAL, 169 * extensions Extensions OPTIONAL 170 * } 171 *``` 172 */ 173 public static override schema(parameters: AttributeCertificateInfoV2Schema = {}): Schema.SchemaType { 174 const names = pvutils.getParametersValue<NonNullable<typeof parameters.names>>(parameters, "names", {}); 175 176 return (new asn1js.Sequence({ 177 name: (names.blockName || EMPTY_STRING), 178 value: [ 179 new asn1js.Integer({ name: (names.version || EMPTY_STRING) }), 180 Holder.schema(names.holder || {}), 181 new asn1js.Choice({ 182 value: [ 183 GeneralNames.schema({ 184 names: { 185 blockName: (names.issuer || EMPTY_STRING) 186 } 187 }), 188 new asn1js.Constructed({ 189 name: (names.issuer || EMPTY_STRING), 190 idBlock: { 191 tagClass: 3, 192 tagNumber: 0 // [0] 193 }, 194 value: V2Form.schema().valueBlock.value 195 }) 196 ] 197 }), 198 AlgorithmIdentifier.schema(names.signature || {}), 199 new asn1js.Integer({ name: (names.serialNumber || EMPTY_STRING) }), 200 AttCertValidityPeriod.schema(names.attrCertValidityPeriod || {}), 201 new asn1js.Sequence({ 202 name: (names.attributes || EMPTY_STRING), 203 value: [ 204 new asn1js.Repeated({ 205 value: Attribute.schema() 206 }) 207 ] 208 }), 209 new asn1js.BitString({ 210 optional: true, 211 name: (names.issuerUniqueID || EMPTY_STRING) 212 }), 213 Extensions.schema(names.extensions || {}, true) 214 ] 215 })); 216 } 217 218 public fromSchema(schema: Schema.SchemaType): void { 219 // Clear input data first 220 pvutils.clearProps(schema, CLEAR_PROPS); 221 222 // Check the schema is valid 223 const asn1 = asn1js.compareSchema(schema, 224 schema, 225 AttributeCertificateInfoV2.schema({ 226 names: { 227 version: VERSION, 228 holder: { 229 names: { 230 blockName: HOLDER 231 } 232 }, 233 issuer: ISSUER, 234 signature: { 235 names: { 236 blockName: SIGNATURE 237 } 238 }, 239 serialNumber: SERIAL_NUMBER, 240 attrCertValidityPeriod: { 241 names: { 242 blockName: ATTR_CERT_VALIDITY_PERIOD 243 } 244 }, 245 attributes: ATTRIBUTES, 246 issuerUniqueID: ISSUER_UNIQUE_ID, 247 extensions: { 248 names: { 249 blockName: EXTENSIONS 250 } 251 } 252 } 253 }) 254 ); 255 AsnError.assertSchema(asn1, this.className); 256 257 //#region Get internal properties from parsed schema 258 this.version = asn1.result.version.valueBlock.valueDec; 259 this.holder = new Holder({ schema: asn1.result.holder }); 260 261 switch (asn1.result.issuer.idBlock.tagClass) { 262 case 3: // V2Form 263 this.issuer = new V2Form({ 264 schema: new asn1js.Sequence({ 265 value: asn1.result.issuer.valueBlock.value 266 }) 267 }); 268 break; 269 case 1: // GeneralNames (should not be used) 270 default: 271 throw new Error("Incorrect value for 'issuer' in AttributeCertificateInfoV2"); 272 } 273 274 this.signature = new AlgorithmIdentifier({ schema: asn1.result.signature }); 275 this.serialNumber = asn1.result.serialNumber; 276 this.attrCertValidityPeriod = new AttCertValidityPeriod({ schema: asn1.result.attrCertValidityPeriod }); 277 this.attributes = Array.from(asn1.result.attributes.valueBlock.value, element => new Attribute({ schema: element })); 278 279 if (ISSUER_UNIQUE_ID in asn1.result) { 280 this.issuerUniqueID = asn1.result.issuerUniqueID; 281 } 282 283 if (EXTENSIONS in asn1.result) { 284 this.extensions = new Extensions({ schema: asn1.result.extensions }); 285 } 286 //#endregion 287 } 288 289 public toSchema(): asn1js.Sequence { 290 const result = new asn1js.Sequence({ 291 value: [ 292 new asn1js.Integer({ value: this.version }), 293 this.holder.toSchema(), 294 new asn1js.Constructed({ 295 idBlock: { 296 tagClass: 3, 297 tagNumber: 0 // [0] 298 }, 299 value: this.issuer.toSchema().valueBlock.value 300 }), 301 this.signature.toSchema(), 302 this.serialNumber, 303 this.attrCertValidityPeriod.toSchema(), 304 new asn1js.Sequence({ 305 value: Array.from(this.attributes, o => o.toSchema()) 306 }) 307 ] 308 }); 309 310 if (this.issuerUniqueID) { 311 result.valueBlock.value.push(this.issuerUniqueID); 312 } 313 if (this.extensions) { 314 result.valueBlock.value.push(this.extensions.toSchema()); 315 } 316 317 return result; 318 } 319 320 public toJSON(): AttributeCertificateInfoV2Json { 321 const result: AttributeCertificateInfoV2Json = { 322 version: this.version, 323 holder: this.holder.toJSON(), 324 issuer: this.issuer.toJSON(), 325 signature: this.signature.toJSON(), 326 serialNumber: this.serialNumber.toJSON(), 327 attrCertValidityPeriod: this.attrCertValidityPeriod.toJSON(), 328 attributes: Array.from(this.attributes, o => o.toJSON()) 329 }; 330 331 if (this.issuerUniqueID) { 332 result.issuerUniqueID = this.issuerUniqueID.toJSON(); 333 } 334 if (this.extensions) { 335 result.extensions = this.extensions.toJSON(); 336 } 337 338 return result; 339 } 340 341 }