PolicyMapping.ts (4167B)
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 ISSUER_DOMAIN_POLICY = "issuerDomainPolicy"; 9 const SUBJECT_DOMAIN_POLICY = "subjectDomainPolicy"; 10 const CLEAR_PROPS = [ 11 ISSUER_DOMAIN_POLICY, 12 SUBJECT_DOMAIN_POLICY 13 ]; 14 15 export interface IPolicyMapping { 16 issuerDomainPolicy: string; 17 subjectDomainPolicy: string; 18 } 19 20 export interface PolicyMappingJson { 21 issuerDomainPolicy: string; 22 subjectDomainPolicy: string; 23 } 24 25 export type PolicyMappingParameters = PkiObjectParameters & Partial<IPolicyMapping>; 26 27 /** 28 * Represents the PolicyMapping structure described in [RFC5280](https://datatracker.ietf.org/doc/html/rfc5280) 29 */ 30 export class PolicyMapping extends PkiObject implements IPolicyMapping { 31 32 public static override CLASS_NAME = "PolicyMapping"; 33 34 public issuerDomainPolicy!: string; 35 public subjectDomainPolicy!: string; 36 37 /** 38 * Initializes a new instance of the {@link PolicyMapping} class 39 * @param parameters Initialization parameters 40 */ 41 constructor(parameters: PolicyMappingParameters = {}) { 42 super(); 43 44 this.issuerDomainPolicy = pvutils.getParametersValue(parameters, ISSUER_DOMAIN_POLICY, PolicyMapping.defaultValues(ISSUER_DOMAIN_POLICY)); 45 this.subjectDomainPolicy = pvutils.getParametersValue(parameters, SUBJECT_DOMAIN_POLICY, PolicyMapping.defaultValues(SUBJECT_DOMAIN_POLICY)); 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 ISSUER_DOMAIN_POLICY): string; 58 public static override defaultValues(memberName: typeof SUBJECT_DOMAIN_POLICY): string; 59 public static override defaultValues(memberName: string): any { 60 switch (memberName) { 61 case ISSUER_DOMAIN_POLICY: 62 return EMPTY_STRING; 63 case SUBJECT_DOMAIN_POLICY: 64 return EMPTY_STRING; 65 default: 66 return super.defaultValues(memberName); 67 } 68 } 69 70 /** 71 * @inheritdoc 72 * @asn ASN.1 schema 73 * ```asn 74 * PolicyMapping ::= SEQUENCE { 75 * issuerDomainPolicy CertPolicyId, 76 * subjectDomainPolicy CertPolicyId } 77 *``` 78 */ 79 public static override schema(parameters: Schema.SchemaParameters<{ 80 issuerDomainPolicy?: string; 81 subjectDomainPolicy?: string; 82 }> = {}): Schema.SchemaType { 83 const names = pvutils.getParametersValue<NonNullable<typeof parameters.names>>(parameters, "names", {}); 84 85 return (new asn1js.Sequence({ 86 name: (names.blockName || EMPTY_STRING), 87 value: [ 88 new asn1js.ObjectIdentifier({ name: (names.issuerDomainPolicy || EMPTY_STRING) }), 89 new asn1js.ObjectIdentifier({ name: (names.subjectDomainPolicy || EMPTY_STRING) }) 90 ] 91 })); 92 } 93 94 public fromSchema(schema: Schema.SchemaType): void { 95 // Clear input data first 96 pvutils.clearProps(schema, CLEAR_PROPS); 97 98 // Check the schema is valid 99 const asn1 = asn1js.compareSchema(schema, 100 schema, 101 PolicyMapping.schema({ 102 names: { 103 issuerDomainPolicy: ISSUER_DOMAIN_POLICY, 104 subjectDomainPolicy: SUBJECT_DOMAIN_POLICY 105 } 106 }) 107 ); 108 AsnError.assertSchema(asn1, this.className); 109 110 // Get internal properties from parsed schema 111 this.issuerDomainPolicy = asn1.result.issuerDomainPolicy.valueBlock.toString(); 112 this.subjectDomainPolicy = asn1.result.subjectDomainPolicy.valueBlock.toString(); 113 } 114 115 public toSchema(): asn1js.Sequence { 116 // Construct and return new ASN.1 schema for this object 117 return (new asn1js.Sequence({ 118 value: [ 119 new asn1js.ObjectIdentifier({ value: this.issuerDomainPolicy }), 120 new asn1js.ObjectIdentifier({ value: this.subjectDomainPolicy }) 121 ] 122 })); 123 } 124 125 public toJSON(): PolicyMappingJson { 126 return { 127 issuerDomainPolicy: this.issuerDomainPolicy, 128 subjectDomainPolicy: this.subjectDomainPolicy 129 }; 130 } 131 132 }