@sphereon/ssi-sdk-ext.key-utils 0.24.1-next.3 → 0.24.1-next.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/functions.ts CHANGED
@@ -1,16 +1,16 @@
1
1
  import { randomBytes } from '@ethersproject/random'
2
+ import { PEMToJwk, generateRSAKeyAsPEM, hexToBase64, privateKeyHexFromPEM, hexToPEM } from '@sphereon/ssi-sdk-ext.x509-utils'
2
3
  import { generateKeyPair as generateSigningKeyPair } from '@stablelib/ed25519'
3
4
  import { IAgentContext, IKey, IKeyManager, ManagedKeyInfo, MinimalImportableKey } from '@veramo/core'
4
- import Debug from 'debug'
5
5
 
6
6
  import { JsonWebKey } from 'did-resolver'
7
7
  import elliptic from 'elliptic'
8
8
  import * as u8a from 'uint8arrays'
9
9
  import { digestMethodParams } from './digest-methods'
10
10
  import { ENC_KEY_ALGS, IImportProvidedOrGeneratedKeyArgs, JWK, JwkKeyUse, KeyCurve, KeyType, SIG_KEY_ALGS, TKeyType } from './types'
11
- import { generateRSAKeyAsPEM, hexToBase64, hexToPEM, PEMToJwk, privateKeyHexFromPEM } from './x509'
11
+ import { Loggers } from '@sphereon/ssi-types'
12
+ export const logger = Loggers.DEFAULT.get('sphereon:key-utils')
12
13
 
13
- const debug = Debug('sphereon:kms:local')
14
14
  /**
15
15
  * Generates a random Private Hex Key for the specified key type
16
16
  * @param type The key type
@@ -37,6 +37,8 @@ export const generatePrivateKeyHex = async (type: TKeyType): Promise<string> =>
37
37
  }
38
38
  }
39
39
 
40
+ const algorithmsFromKeyType = (type: string): string[] => [type]
41
+
40
42
  /**
41
43
  * We optionally generate and then import our own keys.
42
44
  *
@@ -76,15 +78,22 @@ export async function importProvidedOrGeneratedKey(
76
78
  privateKeyHex = privateKeyHexFromPEM(key.meta.x509.privateKeyPEM)
77
79
  }
78
80
  }
79
- if (!privateKeyHex) {
80
- privateKeyHex = await generatePrivateKeyHex(type)
81
+ if (privateKeyHex) {
82
+ return context.agent.keyManagerImport({
83
+ ...key,
84
+ kms: args.kms,
85
+ type,
86
+ privateKeyHex: privateKeyHex!,
87
+ })
81
88
  }
82
89
 
83
- return context.agent.keyManagerImport({
84
- ...key,
85
- kms: args.kms,
90
+ return context.agent.keyManagerCreate({
86
91
  type,
87
- privateKeyHex: privateKeyHex!,
92
+ kms: args.kms,
93
+ meta: {
94
+ algorithms: algorithmsFromKeyType(type),
95
+ keyAlias: args.alias,
96
+ },
88
97
  })
89
98
  }
90
99
 
@@ -236,7 +245,7 @@ const assertProperKeyLength = (keyHex: string, expectedKeyLength: number | numbe
236
245
  */
237
246
  const toSecp256k1Jwk = (keyHex: string, opts?: { use?: JwkKeyUse; isPrivateKey?: boolean }): JWK => {
238
247
  const { use } = opts ?? {}
239
- debug(`toSecp256k1Jwk keyHex: ${keyHex}, length: ${keyHex.length}`)
248
+ logger.debug(`toSecp256k1Jwk keyHex: ${keyHex}, length: ${keyHex.length}`)
240
249
  if (opts?.isPrivateKey) {
241
250
  assertProperKeyLength(keyHex, [64])
242
251
  } else {
@@ -267,7 +276,7 @@ const toSecp256k1Jwk = (keyHex: string, opts?: { use?: JwkKeyUse; isPrivateKey?:
267
276
  */
268
277
  const toSecp256r1Jwk = (keyHex: string, opts?: { use?: JwkKeyUse; isPrivateKey?: boolean }): JWK => {
269
278
  const { use } = opts ?? {}
270
- debug(`toSecp256r1Jwk keyHex: ${keyHex}, length: ${keyHex.length}`)
279
+ logger.debug(`toSecp256r1Jwk keyHex: ${keyHex}, length: ${keyHex.length}`)
271
280
  if (opts?.isPrivateKey) {
272
281
  assertProperKeyLength(keyHex, [64])
273
282
  } else {
@@ -276,7 +285,7 @@ const toSecp256r1Jwk = (keyHex: string, opts?: { use?: JwkKeyUse; isPrivateKey?:
276
285
 
277
286
  const secp256r1 = new elliptic.ec('p256')
278
287
  const keyBytes = u8a.fromString(keyHex, 'base16')
279
- debug(`keyBytes length: ${keyBytes}`)
288
+ logger.debug(`keyBytes length: ${keyBytes}`)
280
289
  const keyPair = opts?.isPrivateKey ? secp256r1.keyFromPrivate(keyBytes) : secp256r1.keyFromPublic(keyBytes)
281
290
  const pubPoint = keyPair.getPublic()
282
291
  return {
@@ -341,3 +350,113 @@ export const padLeft = (args: { data: string; size?: number; padString?: string
341
350
  const length = padString.length
342
351
  return padString.repeat((size - data.length) / length) + data
343
352
  }
353
+
354
+ enum OIDType {
355
+ Secp256k1,
356
+ Secp256r1,
357
+ Ed25519,
358
+ }
359
+
360
+ const OID: Record<OIDType, Uint8Array> = {
361
+ [OIDType.Secp256k1]: new Uint8Array([0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01]),
362
+ [OIDType.Secp256r1]: new Uint8Array([0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07]),
363
+ [OIDType.Ed25519]: new Uint8Array([0x06, 0x03, 0x2b, 0x65, 0x70]),
364
+ }
365
+
366
+ const compareUint8Arrays = (a: Uint8Array, b: Uint8Array): boolean => {
367
+ if (a.length !== b.length) {
368
+ return false
369
+ }
370
+ for (let i = 0; i < a.length; i++) {
371
+ if (a[i] !== b[i]) {
372
+ return false
373
+ }
374
+ }
375
+ return true
376
+ }
377
+
378
+ const findSubarray = (haystack: Uint8Array, needle: Uint8Array): number => {
379
+ for (let i = 0; i <= haystack.length - needle.length; i++) {
380
+ if (compareUint8Arrays(haystack.subarray(i, i + needle.length), needle)) {
381
+ return i
382
+ }
383
+ }
384
+ return -1
385
+ }
386
+
387
+ const getTargetOID = (keyType: TKeyType) => {
388
+ switch (keyType) {
389
+ case 'Secp256k1':
390
+ return OID[OIDType.Secp256k1]
391
+ case 'Secp256r1':
392
+ return OID[OIDType.Secp256r1]
393
+ case 'Ed25519':
394
+ return OID[OIDType.Ed25519]
395
+ default:
396
+ throw new Error(`Unsupported key type: ${keyType}`)
397
+ }
398
+ }
399
+
400
+ export const isAsn1Der = (key: Uint8Array): boolean => key[0] === 0x30
401
+
402
+ export const asn1DerToRawPublicKey = (derKey: Uint8Array, keyType: TKeyType): Uint8Array => {
403
+ if (!isAsn1Der(derKey)) {
404
+ throw new Error('Invalid DER encoding: Expected to start with sequence tag')
405
+ }
406
+
407
+ let index = 2
408
+ if (derKey[1] & 0x80) {
409
+ const lengthBytesCount = derKey[1] & 0x7f
410
+ index += lengthBytesCount
411
+ }
412
+ const targetOid = getTargetOID(keyType)
413
+ const oidIndex = findSubarray(derKey, targetOid)
414
+ if (oidIndex === -1) {
415
+ throw new Error(`OID for ${keyType} not found in DER encoding`)
416
+ }
417
+
418
+ index = oidIndex + targetOid.length
419
+
420
+ while (index < derKey.length && derKey[index] !== 0x03) {
421
+ index++
422
+ }
423
+
424
+ if (index >= derKey.length) {
425
+ throw new Error('Invalid DER encoding: Bit string not found')
426
+ }
427
+
428
+ // Skip the bit string tag (0x03) and length byte
429
+ index += 2
430
+
431
+ // Skip the unused bits count byte
432
+ index++
433
+
434
+ return derKey.slice(index)
435
+ }
436
+
437
+ export const isRawCompressedPublicKey = (key: Uint8Array): boolean => key.length === 33 && (key[0] === 0x02 || key[0] === 0x03)
438
+
439
+ export const toRawCompressedHexPublicKey = (rawPublicKey: Uint8Array, keyType: TKeyType): string => {
440
+ if (isRawCompressedPublicKey(rawPublicKey)) {
441
+ throw new Error('Invalid public key format, an uncompressed raw public key is required as input, not a raw')
442
+ }
443
+
444
+ if (keyType === 'Secp256k1' || keyType === 'Secp256r1') {
445
+ if (rawPublicKey[0] === 0x04 && rawPublicKey.length === 65) {
446
+ const xCoordinate = rawPublicKey.slice(1, 33)
447
+ const yCoordinate = rawPublicKey.slice(33)
448
+ const prefix = new Uint8Array([yCoordinate[31] % 2 === 0 ? 0x02 : 0x03])
449
+ const resultKey = hexStringFromUint8Array(new Uint8Array([...prefix, ...xCoordinate]))
450
+ logger.debug(`converted public key ${hexStringFromUint8Array(rawPublicKey)} to ${resultKey}`)
451
+ return resultKey
452
+ }
453
+ return u8a.toString(rawPublicKey, 'base16')
454
+ } else if (keyType === 'Ed25519') {
455
+ // Ed25519 keys are always in compressed form
456
+ return u8a.toString(rawPublicKey, 'base16')
457
+ }
458
+
459
+ throw new Error(`Unsupported key type: ${keyType}`)
460
+ }
461
+
462
+ export const hexStringFromUint8Array = (value: Uint8Array): string => u8a.toString(value, 'base16')
package/src/index.ts CHANGED
@@ -4,9 +4,7 @@
4
4
  *
5
5
  * @packageDocumentation
6
6
  */
7
- export * from './x509'
8
7
  export * from './functions'
9
8
  export * from './jwk-jcs'
10
9
  export * from './types'
11
- export * from './x509/x509-utils'
12
10
  export * from './digest-methods'
package/src/jwk-jcs.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import { TextDecoder, TextEncoder } from 'web-encoding'
2
2
  import isPlainObject from 'lodash.isplainobject'
3
3
  import type { ByteView } from 'multiformats/codecs/interface'
4
- import type { JsonWebKey } from 'did-resolver'
5
4
 
6
5
  const textEncoder = new TextEncoder()
7
6
  const textDecoder = new TextDecoder()
@@ -79,6 +79,7 @@ export interface X509Opts {
79
79
 
80
80
  export interface IImportProvidedOrGeneratedKeyArgs {
81
81
  kms?: string
82
+ alias?: string
82
83
  options?: IKeyOpts
83
84
  }
84
85
  export interface IKeyOpts {
@@ -1,4 +0,0 @@
1
- export * from './rsa-key';
2
- export * from './rsa-signer';
3
- export * from './x509-utils';
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/x509/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA"}
@@ -1,20 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./rsa-key"), exports);
18
- __exportStar(require("./rsa-signer"), exports);
19
- __exportStar(require("./x509-utils"), exports);
20
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/x509/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAAyB;AACzB,+CAA4B;AAC5B,+CAA4B"}
@@ -1,11 +0,0 @@
1
- import { HashAlgorithm } from '../digest-methods';
2
- import { JWK } from '../types';
3
- export type RSASignatureSchemes = 'RSASSA-PKCS1-V1_5' | 'RSA-PSS';
4
- export type RSAEncryptionSchemes = 'RSAES-PKCS-v1_5 ' | 'RSAES-OAEP';
5
- export declare const signAlgorithmToSchemeAndHashAlg: (signingAlg: string) => {
6
- scheme: "RSASSA-PKCS1-V1_5" | "RSA-PSS";
7
- hashAlgorithm: HashAlgorithm;
8
- };
9
- export declare const cryptoSubtleImportRSAKey: (jwk: JWK, scheme: RSAEncryptionSchemes | RSASignatureSchemes, hashAlgorithm?: HashAlgorithm) => Promise<CryptoKey>;
10
- export declare const generateRSAKeyAsPEM: (scheme: RSAEncryptionSchemes | RSASignatureSchemes, hashAlgorithm?: HashAlgorithm, modulusLength?: number) => Promise<string>;
11
- //# sourceMappingURL=rsa-key.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rsa-key.d.ts","sourceRoot":"","sources":["../../src/x509/rsa-key.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAG9B,MAAM,MAAM,mBAAmB,GAAG,mBAAmB,GAAG,SAAS,CAAA;AAEjE,MAAM,MAAM,oBAAoB,GAAG,kBAAkB,GAAG,YAAY,CAAA;AA2BpE,eAAO,MAAM,+BAA+B,eAAgB,MAAM;;;CAajE,CAAA;AAED,eAAO,MAAM,wBAAwB,QAC9B,GAAG,UACA,oBAAoB,GAAG,mBAAmB,kBAClC,aAAa,KAC5B,QAAQ,SAAS,CAKnB,CAAA;AAED,eAAO,MAAM,mBAAmB,WACtB,oBAAoB,GAAG,mBAAmB,kBAClC,aAAa,kBACb,MAAM,KACrB,QAAQ,MAAM,CAgBhB,CAAA"}
@@ -1,101 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
- return new (P || (P = Promise))(function (resolve, reject) {
28
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
- step((generator = generator.apply(thisArg, _arguments || [])).next());
32
- });
33
- };
34
- Object.defineProperty(exports, "__esModule", { value: true });
35
- exports.generateRSAKeyAsPEM = exports.cryptoSubtleImportRSAKey = exports.signAlgorithmToSchemeAndHashAlg = void 0;
36
- const u8a = __importStar(require("uint8arrays"));
37
- const x509_utils_1 = require("./x509-utils");
38
- const usage = (jwk) => {
39
- var _a, _b, _c, _d;
40
- if (jwk.key_ops && jwk.key_ops.length > 0) {
41
- return jwk.key_ops;
42
- }
43
- if (jwk.use) {
44
- const usages = [];
45
- if (jwk.use.includes('sig')) {
46
- usages.push('sign', 'verify');
47
- }
48
- else if (jwk.use.includes('enc')) {
49
- usages.push('encrypt', 'decrypt');
50
- }
51
- if (usages.length > 0) {
52
- return usages;
53
- }
54
- }
55
- if (jwk.kty === 'RSA') {
56
- if (jwk.d) {
57
- return ((_b = (_a = jwk.alg) === null || _a === void 0 ? void 0 : _a.toUpperCase()) === null || _b === void 0 ? void 0 : _b.includes('QAEP')) ? ['encrypt'] : ['sign'];
58
- }
59
- return ((_d = (_c = jwk.alg) === null || _c === void 0 ? void 0 : _c.toUpperCase()) === null || _d === void 0 ? void 0 : _d.includes('QAEP')) ? ['decrypt'] : ['verify'];
60
- }
61
- // "decrypt" | "deriveBits" | "deriveKey" | "encrypt" | "sign" | "unwrapKey" | "verify" | "wrapKey";
62
- return jwk.d && jwk.kty !== 'RSA' ? ['sign', 'decrypt', 'verify', 'encrypt'] : ['verify'];
63
- };
64
- const signAlgorithmToSchemeAndHashAlg = (signingAlg) => {
65
- const alg = signingAlg.toUpperCase();
66
- let scheme;
67
- if (alg.startsWith('RS')) {
68
- scheme = 'RSASSA-PKCS1-V1_5';
69
- }
70
- else if (alg.startsWith('PS')) {
71
- scheme = 'RSA-PSS';
72
- }
73
- else {
74
- throw Error(`Invalid signing algorithm supplied ${signingAlg}`);
75
- }
76
- const hashAlgorithm = `SHA-${alg.substring(2)}`;
77
- return { scheme, hashAlgorithm };
78
- };
79
- exports.signAlgorithmToSchemeAndHashAlg = signAlgorithmToSchemeAndHashAlg;
80
- const cryptoSubtleImportRSAKey = (jwk, scheme, hashAlgorithm) => __awaiter(void 0, void 0, void 0, function* () {
81
- const hashName = hashAlgorithm ? hashAlgorithm : jwk.alg ? `SHA-${jwk.alg.substring(2)}` : 'SHA-256';
82
- const importParams = { name: scheme, hash: hashName };
83
- return yield crypto.subtle.importKey('jwk', jwk, importParams, false, usage(jwk));
84
- });
85
- exports.cryptoSubtleImportRSAKey = cryptoSubtleImportRSAKey;
86
- const generateRSAKeyAsPEM = (scheme, hashAlgorithm, modulusLength) => __awaiter(void 0, void 0, void 0, function* () {
87
- const hashName = hashAlgorithm ? hashAlgorithm : 'SHA-256';
88
- const params = {
89
- name: scheme,
90
- hash: hashName,
91
- modulusLength: modulusLength ? modulusLength : 2048,
92
- publicExponent: new Uint8Array([1, 0, 1]),
93
- };
94
- const keyUsage = scheme === 'RSA-PSS' || scheme === 'RSASSA-PKCS1-V1_5' ? ['sign', 'verify'] : ['encrypt', 'decrypt'];
95
- const keypair = yield crypto.subtle.generateKey(params, true, keyUsage);
96
- const pkcs8 = yield crypto.subtle.exportKey('pkcs8', keypair.privateKey);
97
- const uint8Array = new Uint8Array(pkcs8);
98
- return (0, x509_utils_1.base64ToPEM)(u8a.toString(uint8Array, 'base64pad'), 'RSA PRIVATE KEY');
99
- });
100
- exports.generateRSAKeyAsPEM = generateRSAKeyAsPEM;
101
- //# sourceMappingURL=rsa-key.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rsa-key.js","sourceRoot":"","sources":["../../src/x509/rsa-key.ts"],"names":[],"mappings":"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"}
@@ -1,25 +0,0 @@
1
- import { HashAlgorithm } from '../digest-methods';
2
- import { JWK, KeyVisibility } from '../types';
3
- import { RSAEncryptionSchemes, RSASignatureSchemes } from './rsa-key';
4
- export declare class RSASigner {
5
- private readonly hashAlgorithm;
6
- private readonly jwk;
7
- private key;
8
- private readonly scheme;
9
- /**
10
- *
11
- * @param key Either in PEM or JWK format (no raw hex keys here!)
12
- * @param opts The algorithm and signature/encryption schemes
13
- */
14
- constructor(key: string | JWK, opts?: {
15
- hashAlgorithm?: HashAlgorithm;
16
- scheme?: RSAEncryptionSchemes | RSASignatureSchemes;
17
- visibility?: KeyVisibility;
18
- });
19
- private getImportParams;
20
- private getKey;
21
- private bufferToString;
22
- sign(data: Uint8Array): Promise<string>;
23
- verify(data: string | Uint8Array, signature: string): Promise<boolean>;
24
- }
25
- //# sourceMappingURL=rsa-signer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rsa-signer.d.ts","sourceRoot":"","sources":["../../src/x509/rsa-signer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,EAA4B,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAG/F,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAK;IAEzB,OAAO,CAAC,GAAG,CAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4C;IAEnE;;;;OAIG;gBAED,GAAG,EAAE,MAAM,GAAG,GAAG,EACjB,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,aAAa,CAAC;QAAC,MAAM,CAAC,EAAE,oBAAoB,GAAG,mBAAmB,CAAC;QAAC,UAAU,CAAC,EAAE,aAAa,CAAA;KAAE;IAY3H,OAAO,CAAC,eAAe;YAQT,MAAM;IAOpB,OAAO,CAAC,cAAc;IAKT,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAYvC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAgBpF"}
@@ -1,105 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
- return new (P || (P = Promise))(function (resolve, reject) {
28
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
- step((generator = generator.apply(thisArg, _arguments || [])).next());
32
- });
33
- };
34
- Object.defineProperty(exports, "__esModule", { value: true });
35
- exports.RSASigner = void 0;
36
- const u8a = __importStar(require("uint8arrays"));
37
- const rsa_key_1 = require("./rsa-key");
38
- const x509_utils_1 = require("./x509-utils");
39
- class RSASigner {
40
- /**
41
- *
42
- * @param key Either in PEM or JWK format (no raw hex keys here!)
43
- * @param opts The algorithm and signature/encryption schemes
44
- */
45
- constructor(key, opts) {
46
- var _a, _b;
47
- if (typeof key === 'string') {
48
- this.jwk = (0, x509_utils_1.PEMToJwk)(key, opts === null || opts === void 0 ? void 0 : opts.visibility);
49
- }
50
- else {
51
- this.jwk = key;
52
- }
53
- this.hashAlgorithm = (_a = opts === null || opts === void 0 ? void 0 : opts.hashAlgorithm) !== null && _a !== void 0 ? _a : 'SHA-256';
54
- this.scheme = (_b = opts === null || opts === void 0 ? void 0 : opts.scheme) !== null && _b !== void 0 ? _b : 'RSA-PSS';
55
- }
56
- getImportParams() {
57
- if (this.scheme === 'RSA-PSS') {
58
- return { name: this.scheme, saltLength: 32 };
59
- }
60
- // console.log({ name: this.scheme /*, hash: this.hashAlgorithm*/ })
61
- return { name: this.scheme /*, hash: this.hashAlgorithm*/ };
62
- }
63
- getKey() {
64
- return __awaiter(this, void 0, void 0, function* () {
65
- if (!this.key) {
66
- this.key = yield (0, rsa_key_1.cryptoSubtleImportRSAKey)(this.jwk, this.scheme, this.hashAlgorithm);
67
- }
68
- return this.key;
69
- });
70
- }
71
- bufferToString(buf) {
72
- const uint8Array = new Uint8Array(buf);
73
- return u8a.toString(uint8Array, 'base64url'); // Needs to be base64url for JsonWebSignature2020. Don't change!
74
- }
75
- sign(data) {
76
- return __awaiter(this, void 0, void 0, function* () {
77
- const input = data;
78
- const key = yield this.getKey();
79
- const signature = this.bufferToString(yield crypto.subtle.sign(this.getImportParams(), key, input));
80
- if (!signature) {
81
- throw Error('Could not sign input data');
82
- }
83
- // base64url signature
84
- return signature;
85
- });
86
- }
87
- verify(data, signature) {
88
- return __awaiter(this, void 0, void 0, function* () {
89
- const jws = signature.includes('.') ? signature.split('.')[2] : signature;
90
- const input = typeof data == 'string' ? u8a.fromString(data, 'utf-8') : data;
91
- let key = yield this.getKey();
92
- if (!key.usages.includes('verify')) {
93
- const verifyJwk = Object.assign({}, this.jwk);
94
- delete verifyJwk.d;
95
- delete verifyJwk.use;
96
- delete verifyJwk.key_ops;
97
- key = yield (0, rsa_key_1.cryptoSubtleImportRSAKey)(verifyJwk, this.scheme, this.hashAlgorithm);
98
- }
99
- const verificationResult = yield crypto.subtle.verify(this.getImportParams(), key, u8a.fromString(jws, 'base64url'), input);
100
- return verificationResult;
101
- });
102
- }
103
- }
104
- exports.RSASigner = RSASigner;
105
- //# sourceMappingURL=rsa-signer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rsa-signer.js","sourceRoot":"","sources":["../../src/x509/rsa-signer.ts"],"names":[],"mappings":"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"}
@@ -1,25 +0,0 @@
1
- import { JWK, KeyVisibility } from '../types';
2
- export declare function pemCertChainTox5c(cert: string, maxDepth?: number): string[];
3
- export declare function x5cToPemCertChain(x5c: string[], maxDepth?: number): string;
4
- export declare const toKeyObject: (PEM: string, visibility?: KeyVisibility) => {
5
- pem: string;
6
- jwk: JWK;
7
- keyHex: string;
8
- keyType: KeyVisibility;
9
- };
10
- export declare const jwkToPEM: (jwk: JWK, visibility?: KeyVisibility) => string;
11
- export declare const PEMToJwk: (pem: string, visibility?: KeyVisibility) => JWK;
12
- export declare const privateKeyHexFromPEM: (PEM: string) => string;
13
- export declare const hexKeyFromPEMBasedJwk: (jwk: JWK, visibility?: KeyVisibility) => string;
14
- export declare const publicKeyHexFromPEM: (PEM: string) => string;
15
- export declare const PEMToHex: (PEM: string, headerKey?: string) => string;
16
- /**
17
- * Converts a base64 encoded string to hex string, removing any non-base64 characters, including newlines
18
- * @param input The input in base64, with optional newlines
19
- * @param inputEncoding
20
- */
21
- export declare const base64ToHex: (input: string, inputEncoding?: 'base64' | 'base64pad' | 'base64url' | 'base64urlpad') => string;
22
- export declare const hexToBase64: (input: number | object | string, targetEncoding?: 'base64' | 'base64pad' | 'base64url' | 'base64urlpad') => string;
23
- export declare const hexToPEM: (hex: string, type: KeyVisibility) => string;
24
- export declare function base64ToPEM(cert: string, headerKey?: 'PUBLIC KEY' | 'RSA PRIVATE KEY' | 'PRIVATE KEY' | 'CERTIFICATE'): string;
25
- //# sourceMappingURL=x509-utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"x509-utils.d.ts","sourceRoot":"","sources":["../../src/x509/x509-utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAI7C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAuB3E;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAU1E;AAED,eAAO,MAAM,WAAW,QAAS,MAAM,eAAc,aAAa;;;;;CAWjE,CAAA;AAED,eAAO,MAAM,QAAQ,QAAS,GAAG,eAAc,aAAa,KAAc,MAEzE,CAAA;AAED,eAAO,MAAM,QAAQ,QAAS,MAAM,eAAc,aAAa,KAAc,GAE5E,CAAA;AACD,eAAO,MAAM,oBAAoB,QAAS,MAAM,WAE/C,CAAA;AAED,eAAO,MAAM,qBAAqB,QAAS,GAAG,eAAc,aAAa,KAAc,MAMtF,CAAA;AAED,eAAO,MAAM,mBAAmB,QAAS,MAAM,WAU9C,CAAA;AAED,eAAO,MAAM,QAAQ,QAAS,MAAM,cAAc,MAAM,KAAG,MAc1D,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,UAAW,MAAM,kBAAkB,QAAQ,GAAG,WAAW,GAAG,WAAW,GAAG,cAAc,WAG/G,CAAA;AAED,eAAO,MAAM,WAAW,UAAW,MAAM,GAAG,MAAM,GAAG,MAAM,mBAAmB,QAAQ,GAAG,WAAW,GAAG,WAAW,GAAG,cAAc,KAAG,MAMrI,CAAA;AAED,eAAO,MAAM,QAAQ,QAAS,MAAM,QAAQ,aAAa,KAAG,MAa3D,CAAA;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,YAAY,GAAG,iBAAiB,GAAG,aAAa,GAAG,aAAa,GAAG,MAAM,CAO9H"}