PolicyQualifierInfo.ts (4150B)
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 { PkiObject, PkiObjectParameters } from "./PkiObject"; 6 import * as Schema from "./Schema"; 7 8 const POLICY_QUALIFIER_ID = "policyQualifierId"; 9 const QUALIFIER = "qualifier"; 10 const CLEAR_PROPS = [ 11 POLICY_QUALIFIER_ID, 12 QUALIFIER 13 ]; 14 15 export interface IPolicyQualifierInfo { 16 policyQualifierId: string; 17 qualifier: Schema.SchemaType; 18 } 19 20 export type PolicyQualifierInfoParameters = PkiObjectParameters & Partial<IPolicyQualifierInfo>; 21 22 export interface PolicyQualifierInfoJson { 23 policyQualifierId: string; 24 qualifier: any; 25 } 26 27 /** 28 * Represents the PolicyQualifierInfo structure described in [RFC5280](https://datatracker.ietf.org/doc/html/rfc5280) 29 */ 30 export class PolicyQualifierInfo extends PkiObject implements IPolicyQualifierInfo { 31 32 public static override CLASS_NAME = "PolicyQualifierInfo"; 33 34 public policyQualifierId!: string; 35 public qualifier: Schema.SchemaType; 36 37 /** 38 * Initializes a new instance of the {@link PolicyQualifierInfo} class 39 * @param parameters Initialization parameters 40 */ 41 constructor(parameters: PolicyQualifierInfoParameters = {}) { 42 super(); 43 44 this.policyQualifierId = pvutils.getParametersValue(parameters, POLICY_QUALIFIER_ID, PolicyQualifierInfo.defaultValues(POLICY_QUALIFIER_ID)); 45 this.qualifier = pvutils.getParametersValue(parameters, QUALIFIER, PolicyQualifierInfo.defaultValues(QUALIFIER)); 46 47 if (parameters.schema) { 48 this.fromSchema(parameters.schema); 49 } 50 } 51 52 /** 53 * Returns default values for all class members 54 * @param memberName String name for a class member 55 * @returns Default value 56 */ 57 public static override defaultValues(memberName: typeof POLICY_QUALIFIER_ID): string; 58 public static override defaultValues(memberName: typeof QUALIFIER): asn1js.Any; 59 public static override defaultValues(memberName: string): any { 60 switch (memberName) { 61 case POLICY_QUALIFIER_ID: 62 return EMPTY_STRING; 63 case QUALIFIER: 64 return new asn1js.Any(); 65 default: 66 return super.defaultValues(memberName); 67 } 68 } 69 70 /** 71 * @inheritdoc 72 * @asn ASN.1 schema 73 * ```asn 74 * PolicyQualifierInfo ::= SEQUENCE { 75 * policyQualifierId PolicyQualifierId, 76 * qualifier ANY DEFINED BY policyQualifierId } 77 * 78 * id-qt OBJECT IDENTIFIER ::= { id-pkix 2 } 79 * id-qt-cps OBJECT IDENTIFIER ::= { id-qt 1 } 80 * id-qt-unotice OBJECT IDENTIFIER ::= { id-qt 2 } 81 * 82 * PolicyQualifierId ::= OBJECT IDENTIFIER ( id-qt-cps | id-qt-unotice ) 83 *``` 84 */ 85 static override schema(parameters: Schema.SchemaParameters<{ policyQualifierId?: string; qualifier?: string; }> = {}) { 86 const names = pvutils.getParametersValue<NonNullable<typeof parameters.names>>(parameters, "names", {}); 87 88 return (new asn1js.Sequence({ 89 name: (names.blockName || EMPTY_STRING), 90 value: [ 91 new asn1js.ObjectIdentifier({ name: (names.policyQualifierId || EMPTY_STRING) }), 92 new asn1js.Any({ name: (names.qualifier || EMPTY_STRING) }) 93 ] 94 })); 95 } 96 97 public fromSchema(schema: Schema.SchemaType): void { 98 // Clear input data first 99 pvutils.clearProps(schema, CLEAR_PROPS); 100 101 // Check the schema is valid 102 const asn1 = asn1js.compareSchema(schema, 103 schema, 104 PolicyQualifierInfo.schema({ 105 names: { 106 policyQualifierId: POLICY_QUALIFIER_ID, 107 qualifier: QUALIFIER 108 } 109 }) 110 ); 111 AsnError.assertSchema(asn1, this.className); 112 113 // Get internal properties from parsed schema 114 this.policyQualifierId = asn1.result.policyQualifierId.valueBlock.toString(); 115 this.qualifier = asn1.result.qualifier; 116 } 117 118 public toSchema(): asn1js.Sequence { 119 return (new asn1js.Sequence({ 120 value: [ 121 new asn1js.ObjectIdentifier({ value: this.policyQualifierId }), 122 this.qualifier 123 ] 124 })); 125 } 126 127 public toJSON(): PolicyQualifierInfoJson { 128 return { 129 policyQualifierId: this.policyQualifierId, 130 qualifier: this.qualifier.toJSON() 131 }; 132 } 133 134 }