import * as asn1js from "asn1js"; import { BufferSourceConverter } from "pvtsutils"; import * as pvutils from "pvutils"; import { EMPTY_BUFFER, EMPTY_STRING } from "./constants"; import { ECNamedCurves } from "./ECNamedCurves"; import { ParameterError } from "./errors"; import { PkiObject, PkiObjectParameters } from "./PkiObject"; import * as Schema from "./Schema";
const X = "x"; const Y = "y"; const NAMED_CURVE = "namedCurve";
/** * Represents the PrivateKeyInfo structure described in [RFC5480](https://datatracker.ietf.org/doc/html/rfc5480)
*/
export class ECPublicKey extends PkiObject implements IECPublicKey {
publicstatic override CLASS_NAME = "ECPublicKey";
public namedCurve!: string; public x!: ArrayBuffer; public y!: ArrayBuffer;
/** * Initializes a new instance of the {@link ECPublicKey} class * @param parameters Initialization parameters
*/
constructor(parameters: ECPublicKeyParameters = {}) { super();
if (parameters.json) { this.fromJSON(parameters.json);
}
if (parameters.schema) { this.fromSchema(parameters.schema);
}
}
/** * Returns default values for all class members * @param memberName String name for a class member * @returns Default value
*/ publicstatic override defaultValues(memberName: typeof NAMED_CURVE): string; publicstatic override defaultValues(memberName: typeof X | typeof Y): ArrayBuffer; publicstatic override defaultValues(memberName: string): any { switch (memberName) { case X: case Y: return EMPTY_BUFFER; case NAMED_CURVE: return EMPTY_STRING; default: returnsuper.defaultValues(memberName);
}
}
/** * Compare values with default values for all class members * @param memberName String name for a class member * @param memberValue Value to compare with default value
*/ static compareWithDefault<T>(memberName: string, memberValue: T): memberValue is T { switch (memberName) { case X: case Y: return memberValue instanceof ArrayBuffer &&
(pvutils.isEqualBuffer(memberValue, ECPublicKey.defaultValues(memberName))); case NAMED_CURVE: returntypeof memberValue === "string" &&
memberValue === ECPublicKey.defaultValues(memberName); default: returnsuper.defaultValues(memberName);
}
}
/** * Returns value of pre-defined ASN.1 schema for current class * @param parameters Input parameters for the schema * @returns ASN.1 schema object
*/ publicstatic override schema(): Schema.SchemaType { returnnew asn1js.RawData();
}
public fromSchema(schema1: BufferSource): any { //#region Check the schema is valid
const view = BufferSourceConverter.toUint8Array(schema1); if (view[0] !== 0x04) { thrownew Error("Object's schema was not verified against input data for ECPublicKey");
} //#endregion
//#region Get internal properties from parsed schema const namedCurve = ECNamedCurves.find(this.namedCurve); if (!namedCurve) { thrownew Error(`Incorrect curve OID: ${this.namedCurve}`);
} const coordinateLength = namedCurve.size;
if (view.byteLength !== (coordinateLength * 2 + 1)) { thrownew Error("Object's schema was not verified against input data for ECPublicKey");
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.