CAVersion.ts (5061B)
1 import * as asn1js from "asn1js"; 2 import * as pvutils from "pvutils"; 3 import { PkiObject, PkiObjectParameters } from "./PkiObject"; 4 import * as Schema from "./Schema"; 5 6 const CERTIFICATE_INDEX = "certificateIndex"; 7 const KEY_INDEX = "keyIndex"; 8 9 export interface ICAVersion { 10 certificateIndex: number; 11 keyIndex: number; 12 } 13 14 export type CAVersionParameters = PkiObjectParameters & Partial<ICAVersion>; 15 16 export interface CAVersionJson { 17 certificateIndex: number; 18 keyIndex: number; 19 } 20 21 /** 22 * Represents an CAVersion described in [Certification Authority Renewal](https://docs.microsoft.com/en-us/windows/desktop/seccrypto/certification-authority-renewal) 23 */ 24 export class CAVersion extends PkiObject implements ICAVersion { 25 26 public static override CLASS_NAME = "CAVersion"; 27 28 public certificateIndex!: number; 29 public keyIndex!: number; 30 31 /** 32 * Initializes a new instance of the {@link CAVersion} class 33 * @param parameters Initialization parameters 34 */ 35 constructor(parameters: CAVersionParameters = {}) { 36 super(); 37 38 this.certificateIndex = pvutils.getParametersValue(parameters, CERTIFICATE_INDEX, CAVersion.defaultValues(CERTIFICATE_INDEX)); 39 this.keyIndex = pvutils.getParametersValue(parameters, KEY_INDEX, CAVersion.defaultValues(KEY_INDEX)); 40 41 if (parameters.schema) { 42 this.fromSchema(parameters.schema); 43 } 44 } 45 46 /** 47 * Returns default values for all class members 48 * @param memberName String name for a class member 49 * @returns Default value 50 */ 51 public static override defaultValues(memberName: typeof CERTIFICATE_INDEX): number; 52 public static override defaultValues(memberName: typeof KEY_INDEX): number; 53 public static override defaultValues(memberName: string): any { 54 switch (memberName) { 55 case CERTIFICATE_INDEX: 56 case KEY_INDEX: 57 return 0; 58 default: 59 return super.defaultValues(memberName); 60 } 61 } 62 63 /** 64 * @inheritdoc 65 * @asn ASN.1 schema 66 * ```asn 67 * CAVersion ::= INTEGER 68 *``` 69 */ 70 public static override schema(): Schema.SchemaType { 71 return (new asn1js.Integer()); 72 } 73 74 public fromSchema(schema: Schema.SchemaType) { 75 //#region Check the schema is valid 76 if (schema.constructor.blockName() !== asn1js.Integer.blockName()) { 77 throw new Error("Object's schema was not verified against input data for CAVersion"); 78 } 79 //#endregion 80 81 //#region Check length of the input value and correct it if needed 82 let value = schema.valueBlock.valueHex.slice(0); 83 const valueView = new Uint8Array(value); 84 85 switch (true) { 86 case (value.byteLength < 4): 87 { 88 const tempValue = new ArrayBuffer(4); 89 const tempValueView = new Uint8Array(tempValue); 90 91 tempValueView.set(valueView, 4 - value.byteLength); 92 93 value = tempValue.slice(0); 94 } 95 break; 96 case (value.byteLength > 4): 97 { 98 const tempValue = new ArrayBuffer(4); 99 const tempValueView = new Uint8Array(tempValue); 100 101 tempValueView.set(valueView.slice(0, 4)); 102 103 value = tempValue.slice(0); 104 } 105 break; 106 default: 107 } 108 //#endregion 109 110 //#region Get internal properties from parsed schema 111 const keyIndexBuffer = value.slice(0, 2); 112 const keyIndexView8 = new Uint8Array(keyIndexBuffer); 113 let temp = keyIndexView8[0]; 114 keyIndexView8[0] = keyIndexView8[1]; 115 keyIndexView8[1] = temp; 116 117 const keyIndexView16 = new Uint16Array(keyIndexBuffer); 118 119 this.keyIndex = keyIndexView16[0]; 120 121 const certificateIndexBuffer = value.slice(2); 122 const certificateIndexView8 = new Uint8Array(certificateIndexBuffer); 123 temp = certificateIndexView8[0]; 124 certificateIndexView8[0] = certificateIndexView8[1]; 125 certificateIndexView8[1] = temp; 126 127 const certificateIndexView16 = new Uint16Array(certificateIndexBuffer); 128 129 this.certificateIndex = certificateIndexView16[0]; 130 //#endregion 131 } 132 133 public toSchema(): asn1js.Integer { 134 //#region Create raw values 135 const certificateIndexBuffer = new ArrayBuffer(2); 136 const certificateIndexView = new Uint16Array(certificateIndexBuffer); 137 138 certificateIndexView[0] = this.certificateIndex; 139 140 const certificateIndexView8 = new Uint8Array(certificateIndexBuffer); 141 let temp = certificateIndexView8[0]; 142 certificateIndexView8[0] = certificateIndexView8[1]; 143 certificateIndexView8[1] = temp; 144 145 const keyIndexBuffer = new ArrayBuffer(2); 146 const keyIndexView = new Uint16Array(keyIndexBuffer); 147 148 keyIndexView[0] = this.keyIndex; 149 150 const keyIndexView8 = new Uint8Array(keyIndexBuffer); 151 temp = keyIndexView8[0]; 152 keyIndexView8[0] = keyIndexView8[1]; 153 keyIndexView8[1] = temp; 154 //#endregion 155 156 //#region Construct and return new ASN.1 schema for this object 157 return (new asn1js.Integer({ 158 valueHex: pvutils.utilConcatBuf(keyIndexBuffer, certificateIndexBuffer) 159 })); 160 //#endregion 161 } 162 163 public toJSON(): CAVersionJson { 164 return { 165 certificateIndex: this.certificateIndex, 166 keyIndex: this.keyIndex 167 }; 168 } 169 170 }