Skip to content

Commit 4c036df

Browse files
committed
feat: implemented methods for crypto private key handle to import and export raw keys
1 parent e2daf27 commit 4c036df

File tree

2 files changed

+82
-2
lines changed

2 files changed

+82
-2
lines changed

src/crypto-layer/CryptoAsymmetricKeyHandle.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,41 @@ export class CryptoAsymmetricKeyHandle extends CryptoSerializableAsync {
2323

2424
public keyPairHandle: KeyPairHandle;
2525

26+
protected static async newFromProviderAndKeyPairHandle<T extends CryptoAsymmetricKeyHandle>(
27+
this: new () => T,
28+
provider: Provider,
29+
keyPairHandle: KeyPairHandle,
30+
other?: {
31+
providerName?: string;
32+
keyId?: string;
33+
keySpec?: KeyPairSpec;
34+
}
35+
): Promise<T> {
36+
const result = new this();
37+
38+
if (other?.providerName) {
39+
result.providerName = other.providerName;
40+
} else {
41+
result.providerName = await provider.providerName();
42+
}
43+
44+
if (other?.keyId) {
45+
result.id = other.keyId;
46+
} else {
47+
result.id = await keyPairHandle.id();
48+
}
49+
50+
if (other?.keySpec) {
51+
result.spec = other.keySpec;
52+
} else {
53+
result.spec = await keyPairHandle.spec();
54+
}
55+
56+
result.provider = provider;
57+
result.keyPairHandle = keyPairHandle;
58+
return result;
59+
}
60+
2661
public static async from(value: any): Promise<CryptoAsymmetricKeyHandle> {
2762
return await this.fromAny(value);
2863
}
Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,61 @@
11
import { type } from "@js-soft/ts-serval";
22
import { KeyPairHandle, KeyPairSpec } from "@nmshd/rs-crypto-types";
3+
import { CoreBuffer, Encoding } from "src/CoreBuffer";
34
import { CryptoAsymmetricKeyHandle } from "./CryptoAsymmetricKeyHandle";
5+
import { getProviderOrThrow, ProviderIdentifier } from "./CryptoLayerProviders";
46

57
export interface ICryptoPrivateKeyHandle {
68
keyPairHandle: KeyPairHandle;
79
spec: KeyPairSpec;
10+
toSerializedString(): Promise<string>;
11+
toPEM(): Promise<string>;
812
}
913

1014
export interface ICryptoPrivateKeyHandleStatic {
1115
new (): ICryptoPrivateKeyHandle;
12-
fromNativeKey(key: any, spec: KeyPairSpec): Promise<ICryptoPrivateKeyHandle>;
16+
fromPEM(providerIdent: ProviderIdentifier, pem: string, config: KeyPairSpec): Promise<ICryptoPrivateKeyHandle>;
17+
fromString(
18+
providerIdent: ProviderIdentifier,
19+
value: string,
20+
config: KeyPairSpec,
21+
encoding: Encoding
22+
): Promise<ICryptoPrivateKeyHandle>;
23+
// fromNativeKey(providerIdent: ProviderIdentifier, key: any, config: KeyPairSpec): Promise<ICryptoPrivateKeyHandle>;
1324
}
1425

1526
@type("CryptoPrivateKeyHandle")
16-
export class CryptoPrivateKeyHandle extends CryptoAsymmetricKeyHandle implements ICryptoPrivateKeyHandle {}
27+
export class CryptoPrivateKeyHandle extends CryptoAsymmetricKeyHandle implements ICryptoPrivateKeyHandle {
28+
public async toSerializedString(): Promise<string> {
29+
const raw = await this.keyPairHandle.extractKey();
30+
return CoreBuffer.from(raw).toString(Encoding.Base64_UrlSafe_NoPadding);
31+
}
32+
33+
public async toPEM(): Promise<string> {
34+
const raw = await this.keyPairHandle.extractKey();
35+
return CoreBuffer.from(raw).toString(Encoding.Pem, "PRIVATE KEY");
36+
}
37+
38+
public static async fromString(
39+
providerIdent: ProviderIdentifier,
40+
value: string,
41+
config: KeyPairSpec,
42+
encoding: Encoding
43+
): Promise<CryptoPrivateKeyHandle> {
44+
const raw = CoreBuffer.fromString(value, encoding).buffer;
45+
const provider = getProviderOrThrow(providerIdent);
46+
const keyPairHandle = await provider.importKeyPair(config, new Uint8Array(0), raw);
47+
return await CryptoPrivateKeyHandle.newFromProviderAndKeyPairHandle(provider, keyPairHandle, {
48+
keySpec: config
49+
});
50+
}
51+
52+
public static async fromPEM(
53+
providerIdent: ProviderIdentifier,
54+
pem: string,
55+
config: KeyPairSpec
56+
): Promise<CryptoPrivateKeyHandle> {
57+
return await CryptoPrivateKeyHandle.fromString(providerIdent, pem, config, Encoding.Pem);
58+
}
59+
}
60+
61+
const _testAssign: ICryptoPrivateKeyHandleStatic = CryptoPrivateKeyHandle;

0 commit comments

Comments
 (0)