Skip to content

Commit 3be0645

Browse files
authored
feat: Implement AWS RSA-PSS provider (#16)
1 parent 69680a0 commit 3be0645

18 files changed

+2275
-346
lines changed

package-lock.json

Lines changed: 1417 additions & 114 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
"node": ">=16"
4141
},
4242
"dependencies": {
43+
"@aws-sdk/client-kms": "^3.298.0",
4344
"@google-cloud/kms": "^3.5.0",
4445
"@peculiar/webcrypto": "^1.4.3",
4546
"fast-crc32c": "^2.0.0",

src/lib/KmsRsaPssProvider.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { RsaPssProvider } from 'webcrypto-core';
2+
3+
export abstract class KmsRsaPssProvider extends RsaPssProvider {}

src/lib/PrivateKey.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,23 @@ import { CryptoKey, KeyAlgorithm, KeyUsages, ProviderCrypto } from 'webcrypto-co
44

55
import { HashingAlgorithm } from './algorithms';
66

7-
export class PrivateKey extends CryptoKey {
7+
export class PrivateKey<Provider extends ProviderCrypto> extends CryptoKey {
88
public override readonly extractable = true;
99

1010
public override readonly type = 'private' as KeyType;
1111

1212
constructor(
1313
public override readonly algorithm: KeyAlgorithm,
14-
public readonly provider: ProviderCrypto,
14+
public readonly provider: Provider,
1515
) {
1616
super();
1717
}
1818
}
1919

20-
export class RsaPssPrivateKey extends PrivateKey {
20+
export class RsaPssPrivateKey<Provider extends ProviderCrypto> extends PrivateKey<Provider> {
2121
public override readonly usages = ['sign'] as KeyUsages;
2222

23-
constructor(hashingAlgorithm: HashingAlgorithm, provider: ProviderCrypto) {
23+
constructor(hashingAlgorithm: HashingAlgorithm, provider: Provider) {
2424
const algorithm = { name: 'RSA-PSS', hash: { name: hashingAlgorithm } };
2525
super(algorithm, provider);
2626
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { AwsKmsRsaPssPrivateKey } from './AwsKmsRsaPssPrivateKey';
2+
import { AwsKmsRsaPssProvider } from './AwsKmsRsaPssProvider';
3+
import { HashingAlgorithm } from '../algorithms';
4+
5+
const HASHING_ALGORITHM: HashingAlgorithm = 'SHA-256';
6+
const KMS_KEY_ARN = 'arn:aws:kms:eu-west-2:111122223333:key/c34c7f46-e663-4d76-bff4-7b5c0820e500';
7+
const KMS_PROVIDER = new AwsKmsRsaPssProvider(null as any);
8+
9+
test('KMS key ARN should be honored', () => {
10+
const key = new AwsKmsRsaPssPrivateKey(KMS_KEY_ARN, HASHING_ALGORITHM, KMS_PROVIDER);
11+
12+
expect(key.arn).toEqual(KMS_KEY_ARN);
13+
});
14+
15+
test('Crypto provider should be honored', () => {
16+
const key = new AwsKmsRsaPssPrivateKey(KMS_KEY_ARN, HASHING_ALGORITHM, KMS_PROVIDER);
17+
18+
expect(key.provider).toBe(KMS_PROVIDER);
19+
});
20+
21+
test('Hashing algorithm should be honored', () => {
22+
const key = new AwsKmsRsaPssPrivateKey(KMS_KEY_ARN, HASHING_ALGORITHM, KMS_PROVIDER);
23+
24+
expect(key.algorithm).toHaveProperty('hash.name', HASHING_ALGORITHM);
25+
});

src/lib/aws/AwsKmsRsaPssPrivateKey.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import type { AwsKmsRsaPssProvider } from './AwsKmsRsaPssProvider';
2+
import { RsaPssPrivateKey } from '../PrivateKey';
3+
import { HashingAlgorithm } from '../algorithms';
4+
5+
export class AwsKmsRsaPssPrivateKey extends RsaPssPrivateKey<AwsKmsRsaPssProvider> {
6+
constructor(
7+
public arn: string,
8+
hashingAlgorithm: HashingAlgorithm,
9+
provider: AwsKmsRsaPssProvider,
10+
) {
11+
super(hashingAlgorithm, provider);
12+
}
13+
}

0 commit comments

Comments
 (0)