AttributeCertificateV2.ts (5514B)
1 import * as asn1js from "asn1js"; 2 import * as pvutils from "pvutils"; 3 import { AlgorithmIdentifier, AlgorithmIdentifierJson, AlgorithmIdentifierSchema } from "../AlgorithmIdentifier"; 4 import { AttributeCertificateInfoV2, AttributeCertificateInfoV2Json, AttributeCertificateInfoV2Schema } from "./AttributeCertificateInfoV2"; 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_ALGORITHM, 16 SIGNATURE_VALUE, 17 ]; 18 19 export interface IAttributeCertificateV2 { 20 /** 21 * Attribute certificate information 22 */ 23 acinfo: AttributeCertificateInfoV2; 24 /** 25 * Signature algorithm 26 */ 27 signatureAlgorithm: AlgorithmIdentifier; 28 /** 29 * Signature value 30 */ 31 signatureValue: asn1js.BitString; 32 } 33 34 export type AttributeCertificateV2Parameters = PkiObjectParameters & Partial<IAttributeCertificateV2>; 35 36 export interface AttributeCertificateV2Json { 37 acinfo: AttributeCertificateInfoV2Json; 38 signatureAlgorithm: AlgorithmIdentifierJson; 39 signatureValue: asn1js.BitStringJson; 40 } 41 42 /** 43 * Represents the AttributeCertificateV2 structure described in [RFC5755](https://datatracker.ietf.org/doc/html/rfc5755) 44 */ 45 export class AttributeCertificateV2 extends PkiObject implements IAttributeCertificateV2 { 46 47 public static override CLASS_NAME = "AttributeCertificateV2"; 48 49 public acinfo!: AttributeCertificateInfoV2; 50 public signatureAlgorithm!: AlgorithmIdentifier; 51 public signatureValue!: asn1js.BitString; 52 53 /** 54 * Initializes a new instance of the {@link AttributeCertificateV2} class 55 * @param parameters Initialization parameters 56 */ 57 constructor(parameters: AttributeCertificateV2Parameters = {}) { 58 super(); 59 60 this.acinfo = pvutils.getParametersValue(parameters, ACINFO, AttributeCertificateV2.defaultValues(ACINFO)); 61 this.signatureAlgorithm = pvutils.getParametersValue(parameters, SIGNATURE_ALGORITHM, AttributeCertificateV2.defaultValues(SIGNATURE_ALGORITHM)); 62 this.signatureValue = pvutils.getParametersValue(parameters, SIGNATURE_VALUE, AttributeCertificateV2.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): AttributeCertificateInfoV2; 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 AttributeCertificateInfoV2(); 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 AttributeCertificateInfoV2, 96 * signatureAlgorithm AlgorithmIdentifier, 97 * signatureValue BIT STRING 98 * } 99 *``` 100 */ 101 public static override schema(parameters: Schema.SchemaParameters<{ 102 acinfo?: AttributeCertificateInfoV2Schema; 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 AttributeCertificateInfoV2.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 AttributeCertificateV2.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 // Get internal properties from parsed schema 145 this.acinfo = new AttributeCertificateInfoV2({ schema: asn1.result.acinfo }); 146 this.signatureAlgorithm = new AlgorithmIdentifier({ schema: asn1.result.signatureAlgorithm }); 147 this.signatureValue = asn1.result.signatureValue; 148 } 149 150 public toSchema(): asn1js.Sequence { 151 return (new asn1js.Sequence({ 152 value: [ 153 this.acinfo.toSchema(), 154 this.signatureAlgorithm.toSchema(), 155 this.signatureValue 156 ] 157 })); 158 } 159 160 public toJSON(): AttributeCertificateV2Json { 161 return { 162 acinfo: this.acinfo.toJSON(), 163 signatureAlgorithm: this.signatureAlgorithm.toJSON(), 164 signatureValue: this.signatureValue.toJSON(), 165 }; 166 } 167 168 }