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 }