@dfinity/agent
Version:
JavaScript and TypeScript library to interact with the Internet Computer
66 lines (52 loc) • 1.9 kB
text/typescript
import { type DerEncodedPublicKey, type PublicKey } from './auth.ts';
import { ED25519_OID, unwrapDER, wrapDER } from './der.ts';
import { DerDecodeErrorCode, InputError } from './errors.ts';
export class Ed25519PublicKey implements PublicKey {
public static from(key: PublicKey): Ed25519PublicKey {
return this.fromDer(key.toDer());
}
public static fromRaw(rawKey: Uint8Array): Ed25519PublicKey {
return new Ed25519PublicKey(rawKey);
}
public static fromDer(derKey: DerEncodedPublicKey): Ed25519PublicKey {
return new Ed25519PublicKey(this.derDecode(derKey));
}
// The length of Ed25519 public keys is always 32 bytes.
private static RAW_KEY_LENGTH = 32;
private static derEncode(publicKey: Uint8Array): DerEncodedPublicKey {
return wrapDER(publicKey, ED25519_OID) as DerEncodedPublicKey;
}
private static derDecode(key: DerEncodedPublicKey): Uint8Array {
const unwrapped = unwrapDER(key, ED25519_OID);
if (unwrapped.length !== this.RAW_KEY_LENGTH) {
throw InputError.fromCode(
new DerDecodeErrorCode('An Ed25519 public key must be exactly 32 bytes long'),
);
}
return unwrapped;
}
public get rawKey(): Uint8Array {
return this.
}
public get derKey(): DerEncodedPublicKey {
return this.
}
// `fromRaw` and `fromDer` should be used for instantiation, not this constructor.
private constructor(key: Uint8Array) {
if (key.byteLength !== Ed25519PublicKey.RAW_KEY_LENGTH) {
throw InputError.fromCode(
new DerDecodeErrorCode('An Ed25519 public key must be exactly 32 bytes long'),
);
}
this.
this.
}
public toDer(): DerEncodedPublicKey {
return this.derKey;
}
public toRaw(): Uint8Array {
return this.rawKey;
}
}