@sphereon/ssi-sdk-ext.key-utils 0.14.1-unstable.7 → 0.14.2-next.3
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/dist/digest-methods.d.ts +7 -0
- package/dist/digest-methods.d.ts.map +1 -0
- package/dist/digest-methods.js +95 -0
- package/dist/digest-methods.js.map +1 -0
- package/dist/functions.d.ts +44 -0
- package/dist/functions.d.ts.map +1 -0
- package/dist/functions.js +236 -0
- package/dist/functions.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/jwk-jcs.d.ts +22 -0
- package/dist/jwk-jcs.d.ts.map +1 -0
- package/dist/jwk-jcs.js +178 -0
- package/dist/jwk-jcs.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +18 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/key-util-types.d.ts +49 -0
- package/dist/types/key-util-types.d.ts.map +1 -0
- package/dist/types/key-util-types.js +37 -0
- package/dist/types/key-util-types.js.map +1 -0
- package/dist/x509/index.d.ts +4 -0
- package/dist/x509/index.d.ts.map +1 -0
- package/dist/x509/index.js +20 -0
- package/dist/x509/index.js.map +1 -0
- package/dist/x509/rsa-key.d.ts +11 -0
- package/dist/x509/rsa-key.d.ts.map +1 -0
- package/dist/x509/rsa-key.js +83 -0
- package/dist/x509/rsa-key.js.map +1 -0
- package/dist/x509/rsa-signer.d.ts +25 -0
- package/dist/x509/rsa-signer.d.ts.map +1 -0
- package/dist/x509/rsa-signer.js +101 -0
- package/dist/x509/rsa-signer.js.map +1 -0
- package/dist/x509/x509-utils.d.ts +24 -0
- package/dist/x509/x509-utils.d.ts.map +1 -0
- package/dist/x509/x509-utils.js +175 -0
- package/dist/x509/x509-utils.js.map +1 -0
- package/package.json +5 -5
package/dist/jwk-jcs.js
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.jcsCanonicalize = exports.jwkJcsDecode = exports.jwkJcsEncode = void 0;
|
|
7
|
+
const web_encoding_1 = require("web-encoding");
|
|
8
|
+
const lodash_isplainobject_1 = __importDefault(require("lodash.isplainobject"));
|
|
9
|
+
const textEncoder = new web_encoding_1.TextEncoder();
|
|
10
|
+
const textDecoder = new web_encoding_1.TextDecoder();
|
|
11
|
+
/**
|
|
12
|
+
* Checks if the value is a non-empty string.
|
|
13
|
+
*
|
|
14
|
+
* @param value - The value to check.
|
|
15
|
+
* @param description - Description of the value to check.
|
|
16
|
+
*/
|
|
17
|
+
function check(value, description) {
|
|
18
|
+
if (typeof value !== 'string' || !value) {
|
|
19
|
+
throw new Error(`${description} missing or invalid`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Checks if the value is a valid JSON object.
|
|
24
|
+
*
|
|
25
|
+
* @param value - The value to check.
|
|
26
|
+
*/
|
|
27
|
+
function validatePlainObject(value) {
|
|
28
|
+
if (!(0, lodash_isplainobject_1.default)(value)) {
|
|
29
|
+
throw new Error('JWK must be an object');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Checks if the JWK is valid. It must contain all the required members.
|
|
34
|
+
*
|
|
35
|
+
* @see https://www.rfc-editor.org/rfc/rfc7518#section-6
|
|
36
|
+
* @see https://www.rfc-editor.org/rfc/rfc8037#section-2
|
|
37
|
+
*
|
|
38
|
+
* @param jwk - The JWK to check.
|
|
39
|
+
*/
|
|
40
|
+
function validateJwk(jwk) {
|
|
41
|
+
validatePlainObject(jwk);
|
|
42
|
+
// Check JWK required members based on the key type
|
|
43
|
+
switch (jwk.kty) {
|
|
44
|
+
/**
|
|
45
|
+
* @see https://www.rfc-editor.org/rfc/rfc7518#section-6.2.1
|
|
46
|
+
*/
|
|
47
|
+
case 'EC':
|
|
48
|
+
check(jwk.crv, '"crv" (Curve) Parameter');
|
|
49
|
+
check(jwk.x, '"x" (X Coordinate) Parameter');
|
|
50
|
+
check(jwk.y, '"y" (Y Coordinate) Parameter');
|
|
51
|
+
break;
|
|
52
|
+
/**
|
|
53
|
+
* @see https://www.rfc-editor.org/rfc/rfc8037#section-2
|
|
54
|
+
*/
|
|
55
|
+
case 'OKP':
|
|
56
|
+
check(jwk.crv, '"crv" (Subtype of Key Pair) Parameter');
|
|
57
|
+
check(jwk.x, '"x" (Public Key) Parameter');
|
|
58
|
+
break;
|
|
59
|
+
/**
|
|
60
|
+
* @see https://www.rfc-editor.org/rfc/rfc7518#section-6.3.1
|
|
61
|
+
*/
|
|
62
|
+
case 'RSA':
|
|
63
|
+
check(jwk.e, '"e" (Exponent) Parameter');
|
|
64
|
+
check(jwk.n, '"n" (Modulus) Parameter');
|
|
65
|
+
break;
|
|
66
|
+
default:
|
|
67
|
+
throw new Error('"kty" (Key Type) Parameter missing or unsupported');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Extracts the required members of the JWK and canonicalizes it.
|
|
72
|
+
*
|
|
73
|
+
* @param jwk - The JWK to canonicalize.
|
|
74
|
+
* @returns The JWK with only the required members, ordered lexicographically.
|
|
75
|
+
*/
|
|
76
|
+
function minimalJwk(jwk) {
|
|
77
|
+
// "default" case is not needed
|
|
78
|
+
// eslint-disable-next-line default-case
|
|
79
|
+
switch (jwk.kty) {
|
|
80
|
+
case 'EC':
|
|
81
|
+
return { crv: jwk.crv, kty: jwk.kty, x: jwk.x, y: jwk.y };
|
|
82
|
+
case 'OKP':
|
|
83
|
+
return { crv: jwk.crv, kty: jwk.kty, x: jwk.x };
|
|
84
|
+
case 'RSA':
|
|
85
|
+
return { e: jwk.e, kty: jwk.kty, n: jwk.n };
|
|
86
|
+
}
|
|
87
|
+
throw Error(`Unsupported key type (kty) provided: ${jwk.kty}`);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Encodes a JWK into a Uint8Array. Only the required JWK members are encoded.
|
|
91
|
+
*
|
|
92
|
+
* @see https://www.rfc-editor.org/rfc/rfc7518#section-6
|
|
93
|
+
* @see https://www.rfc-editor.org/rfc/rfc8037#section-2
|
|
94
|
+
* @see https://github.com/panva/jose/blob/3b8aa47b92d07a711bf5c3125276cc9a011794a4/src/jwk/thumbprint.ts#L37
|
|
95
|
+
*
|
|
96
|
+
* @param jwk - JSON Web Key.
|
|
97
|
+
* @returns Uint8Array-encoded JWK.
|
|
98
|
+
*/
|
|
99
|
+
function jwkJcsEncode(jwk) {
|
|
100
|
+
validateJwk(jwk);
|
|
101
|
+
const strippedJwk = minimalJwk(jwk);
|
|
102
|
+
return textEncoder.encode(jcsCanonicalize(strippedJwk));
|
|
103
|
+
}
|
|
104
|
+
exports.jwkJcsEncode = jwkJcsEncode;
|
|
105
|
+
/**
|
|
106
|
+
* Decodes an array of bytes into a JWK. Throws an error if the JWK is not valid.
|
|
107
|
+
*
|
|
108
|
+
* @param bytes - The array of bytes to decode.
|
|
109
|
+
* @returns The corresponding JSON Web Key.
|
|
110
|
+
*/
|
|
111
|
+
function jwkJcsDecode(bytes) {
|
|
112
|
+
const jwk = JSON.parse(textDecoder.decode(bytes));
|
|
113
|
+
validateJwk(jwk);
|
|
114
|
+
if (JSON.stringify(jwk) !== jcsCanonicalize(minimalJwk(jwk))) {
|
|
115
|
+
throw new Error('The JWK embedded in the DID is not correctly formatted');
|
|
116
|
+
}
|
|
117
|
+
return jwk;
|
|
118
|
+
}
|
|
119
|
+
exports.jwkJcsDecode = jwkJcsDecode;
|
|
120
|
+
// From: https://github.com/cyberphone/json-canonicalization
|
|
121
|
+
function jcsCanonicalize(object) {
|
|
122
|
+
let buffer = '';
|
|
123
|
+
serialize(object);
|
|
124
|
+
return buffer;
|
|
125
|
+
function serialize(object) {
|
|
126
|
+
if (object === null || typeof object !== 'object' || object.toJSON != null) {
|
|
127
|
+
/////////////////////////////////////////////////
|
|
128
|
+
// Primitive type or toJSON - Use ES6/JSON //
|
|
129
|
+
/////////////////////////////////////////////////
|
|
130
|
+
buffer += JSON.stringify(object);
|
|
131
|
+
}
|
|
132
|
+
else if (Array.isArray(object)) {
|
|
133
|
+
/////////////////////////////////////////////////
|
|
134
|
+
// Array - Maintain element order //
|
|
135
|
+
/////////////////////////////////////////////////
|
|
136
|
+
buffer += '[';
|
|
137
|
+
let next = false;
|
|
138
|
+
object.forEach((element) => {
|
|
139
|
+
if (next) {
|
|
140
|
+
buffer += ',';
|
|
141
|
+
}
|
|
142
|
+
next = true;
|
|
143
|
+
/////////////////////////////////////////
|
|
144
|
+
// Array element - Recursive expansion //
|
|
145
|
+
/////////////////////////////////////////
|
|
146
|
+
serialize(element);
|
|
147
|
+
});
|
|
148
|
+
buffer += ']';
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
/////////////////////////////////////////////////
|
|
152
|
+
// Object - Sort properties before serializing //
|
|
153
|
+
/////////////////////////////////////////////////
|
|
154
|
+
buffer += '{';
|
|
155
|
+
let next = false;
|
|
156
|
+
Object.keys(object)
|
|
157
|
+
.sort()
|
|
158
|
+
.forEach((property) => {
|
|
159
|
+
if (next) {
|
|
160
|
+
buffer += ',';
|
|
161
|
+
}
|
|
162
|
+
next = true;
|
|
163
|
+
///////////////////////////////////////////////
|
|
164
|
+
// Property names are strings - Use ES6/JSON //
|
|
165
|
+
///////////////////////////////////////////////
|
|
166
|
+
buffer += JSON.stringify(property);
|
|
167
|
+
buffer += ':';
|
|
168
|
+
//////////////////////////////////////////
|
|
169
|
+
// Property value - Recursive expansion //
|
|
170
|
+
//////////////////////////////////////////
|
|
171
|
+
serialize(object[property]);
|
|
172
|
+
});
|
|
173
|
+
buffer += '}';
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
exports.jcsCanonicalize = jcsCanonicalize;
|
|
178
|
+
//# sourceMappingURL=jwk-jcs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwk-jcs.js","sourceRoot":"","sources":["../src/jwk-jcs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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("./key-util-types"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAgC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { MinimalImportableKey } from '@veramo/core';
|
|
2
|
+
export declare const JWK_JCS_PUB_NAME = "jwk_jcs-pub";
|
|
3
|
+
export declare const JWK_JCS_PUB_PREFIX = 60241;
|
|
4
|
+
export type TKeyType = 'Ed25519' | 'Secp256k1' | 'Secp256r1' | 'X25519' | 'Bls12381G1' | 'Bls12381G2' | 'RSA';
|
|
5
|
+
export declare enum Key {
|
|
6
|
+
Ed25519 = "Ed25519",
|
|
7
|
+
Secp256k1 = "Secp256k1",
|
|
8
|
+
Secp256r1 = "Secp256r1"
|
|
9
|
+
}
|
|
10
|
+
export declare enum JwkKeyUse {
|
|
11
|
+
Encryption = "enc",
|
|
12
|
+
Signature = "sig"
|
|
13
|
+
}
|
|
14
|
+
export declare enum KeyCurve {
|
|
15
|
+
Secp256k1 = "secp256k1",
|
|
16
|
+
P_256 = "P-256",
|
|
17
|
+
Ed25519 = "Ed25519",
|
|
18
|
+
X25519 = "X25519"
|
|
19
|
+
}
|
|
20
|
+
export declare enum KeyType {
|
|
21
|
+
EC = "EC",
|
|
22
|
+
OKP = "OKP",
|
|
23
|
+
RSA = "RSA"
|
|
24
|
+
}
|
|
25
|
+
export declare const SIG_KEY_ALGS: string[];
|
|
26
|
+
export declare const ENC_KEY_ALGS: string[];
|
|
27
|
+
export interface JWK extends JsonWebKey {
|
|
28
|
+
x5c?: string;
|
|
29
|
+
x5u?: string;
|
|
30
|
+
}
|
|
31
|
+
export type KeyVisibility = 'public' | 'private';
|
|
32
|
+
export interface X509Opts {
|
|
33
|
+
cn?: string;
|
|
34
|
+
privateKeyPEM?: string;
|
|
35
|
+
certificatePEM?: string;
|
|
36
|
+
certificateChainURL?: string;
|
|
37
|
+
certificateChainPEM?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface IImportProvidedOrGeneratedKeyArgs {
|
|
40
|
+
kms?: string;
|
|
41
|
+
options?: IKeyOpts;
|
|
42
|
+
}
|
|
43
|
+
export interface IKeyOpts {
|
|
44
|
+
key?: Partial<MinimalImportableKey>;
|
|
45
|
+
type?: TKeyType;
|
|
46
|
+
use?: JwkKeyUse;
|
|
47
|
+
x509?: X509Opts;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=key-util-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-util-types.d.ts","sourceRoot":"","sources":["../../src/types/key-util-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAEnD,eAAO,MAAM,gBAAgB,gBAAgB,CAAA;AAC7C,eAAO,MAAM,kBAAkB,QAAS,CAAA;AAExC,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,KAAK,CAAA;AAE7G,oBAAY,GAAG;IACb,OAAO,YAAY;IACnB,SAAS,cAAc;IACvB,SAAS,cAAc;CACxB;AAED,oBAAY,SAAS;IACnB,UAAU,QAAQ;IAClB,SAAS,QAAQ;CAClB;AAED,oBAAY,QAAQ;IAClB,SAAS,cAAc;IACvB,KAAK,UAAU;IACf,OAAO,YAAY;IACnB,MAAM,WAAW;CAClB;AAED,oBAAY,OAAO;IACjB,EAAE,OAAO;IACT,GAAG,QAAQ;IACX,GAAG,QAAQ;CACZ;AAED,eAAO,MAAM,YAAY,UAAkH,CAAA;AAC3I,eAAO,MAAM,YAAY,UAA+C,CAAA;AAExE,MAAM,WAAW,GAAI,SAAQ,UAAU;IACrC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,SAAS,CAAA;AAEhD,MAAM,WAAW,QAAQ;IACvB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,iCAAiC;IAChD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,QAAQ,CAAA;CACnB;AACD,MAAM,WAAW,QAAQ;IACvB,GAAG,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAA;IACnC,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,GAAG,CAAC,EAAE,SAAS,CAAA;IACf,IAAI,CAAC,EAAE,QAAQ,CAAA;CAChB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ENC_KEY_ALGS = exports.SIG_KEY_ALGS = exports.KeyType = exports.KeyCurve = exports.JwkKeyUse = exports.Key = exports.JWK_JCS_PUB_PREFIX = exports.JWK_JCS_PUB_NAME = void 0;
|
|
4
|
+
exports.JWK_JCS_PUB_NAME = 'jwk_jcs-pub';
|
|
5
|
+
exports.JWK_JCS_PUB_PREFIX = 0xeb51;
|
|
6
|
+
var Key;
|
|
7
|
+
(function (Key) {
|
|
8
|
+
Key["Ed25519"] = "Ed25519";
|
|
9
|
+
Key["Secp256k1"] = "Secp256k1";
|
|
10
|
+
Key["Secp256r1"] = "Secp256r1";
|
|
11
|
+
})(Key = exports.Key || (exports.Key = {}));
|
|
12
|
+
var JwkKeyUse;
|
|
13
|
+
(function (JwkKeyUse) {
|
|
14
|
+
JwkKeyUse["Encryption"] = "enc";
|
|
15
|
+
JwkKeyUse["Signature"] = "sig";
|
|
16
|
+
})(JwkKeyUse = exports.JwkKeyUse || (exports.JwkKeyUse = {}));
|
|
17
|
+
var KeyCurve;
|
|
18
|
+
(function (KeyCurve) {
|
|
19
|
+
KeyCurve["Secp256k1"] = "secp256k1";
|
|
20
|
+
KeyCurve["P_256"] = "P-256";
|
|
21
|
+
KeyCurve["Ed25519"] = "Ed25519";
|
|
22
|
+
KeyCurve["X25519"] = "X25519";
|
|
23
|
+
})(KeyCurve = exports.KeyCurve || (exports.KeyCurve = {}));
|
|
24
|
+
var KeyType;
|
|
25
|
+
(function (KeyType) {
|
|
26
|
+
KeyType["EC"] = "EC";
|
|
27
|
+
KeyType["OKP"] = "OKP";
|
|
28
|
+
KeyType["RSA"] = "RSA";
|
|
29
|
+
})(KeyType = exports.KeyType || (exports.KeyType = {}));
|
|
30
|
+
exports.SIG_KEY_ALGS = ['ES256', 'ES384', 'ES512', 'EdDSA', 'ES256K', 'Ed25519', 'Secp256k1', 'Secp256r1', 'Bls12381G1', 'Bls12381G2'];
|
|
31
|
+
exports.ENC_KEY_ALGS = ['X25519', 'ECDH_ES_A256KW', 'RSA_OAEP_256'];
|
|
32
|
+
/*
|
|
33
|
+
// Needed to make a single property required
|
|
34
|
+
type WithRequiredProperty<Type, Key extends keyof Type> = Type & {
|
|
35
|
+
[Property in Key]-?: Type[Property]
|
|
36
|
+
}*/
|
|
37
|
+
//# sourceMappingURL=key-util-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-util-types.js","sourceRoot":"","sources":["../../src/types/key-util-types.ts"],"names":[],"mappings":";;;AAEa,QAAA,gBAAgB,GAAG,aAAa,CAAA;AAChC,QAAA,kBAAkB,GAAG,MAAM,CAAA;AAIxC,IAAY,GAIX;AAJD,WAAY,GAAG;IACb,0BAAmB,CAAA;IACnB,8BAAuB,CAAA;IACvB,8BAAuB,CAAA;AACzB,CAAC,EAJW,GAAG,GAAH,WAAG,KAAH,WAAG,QAId;AAED,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,+BAAkB,CAAA;IAClB,8BAAiB,CAAA;AACnB,CAAC,EAHW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAGpB;AAED,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,mCAAuB,CAAA;IACvB,2BAAe,CAAA;IACf,+BAAmB,CAAA;IACnB,6BAAiB,CAAA;AACnB,CAAC,EALW,QAAQ,GAAR,gBAAQ,KAAR,gBAAQ,QAKnB;AAED,IAAY,OAIX;AAJD,WAAY,OAAO;IACjB,oBAAS,CAAA;IACT,sBAAW,CAAA;IACX,sBAAW,CAAA;AACb,CAAC,EAJW,OAAO,GAAP,eAAO,KAAP,eAAO,QAIlB;AAEY,QAAA,YAAY,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC,CAAA;AAC9H,QAAA,YAAY,GAAG,CAAC,QAAQ,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAA;AA2BxE;;;;GAIG"}
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/x509/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAAyB;AACzB,+CAA4B;AAC5B,+CAA4B"}
|
|
@@ -0,0 +1,11 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rsa-key.d.ts","sourceRoot":"","sources":["../../src/x509/rsa-key.ts"],"names":[],"mappings":"AAEA,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;AAOpE,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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
+
};
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
exports.generateRSAKeyAsPEM = exports.cryptoSubtleImportRSAKey = exports.signAlgorithmToSchemeAndHashAlg = void 0;
|
|
39
|
+
const isomorphic_webcrypto_1 = __importDefault(require("@sphereon/isomorphic-webcrypto"));
|
|
40
|
+
const u8a = __importStar(require("uint8arrays"));
|
|
41
|
+
const x509_utils_1 = require("./x509-utils");
|
|
42
|
+
const usage = (jwk) => {
|
|
43
|
+
// "decrypt" | "deriveBits" | "deriveKey" | "encrypt" | "sign" | "unwrapKey" | "verify" | "wrapKey";
|
|
44
|
+
return jwk.d ? ['sign', 'decrypt', 'verify', 'encrypt'] : ['verify', 'encrypt'];
|
|
45
|
+
};
|
|
46
|
+
const signAlgorithmToSchemeAndHashAlg = (signingAlg) => {
|
|
47
|
+
const alg = signingAlg.toUpperCase();
|
|
48
|
+
let scheme;
|
|
49
|
+
if (alg.startsWith('RS')) {
|
|
50
|
+
scheme = 'RSASSA-PKCS1-V1_5';
|
|
51
|
+
}
|
|
52
|
+
else if (alg.startsWith('PS')) {
|
|
53
|
+
scheme = 'RSA-PSS';
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
throw Error(`Invalid signing algorithm supplied ${signingAlg}`);
|
|
57
|
+
}
|
|
58
|
+
const hashAlgorithm = `SHA-${alg.substring(2)}`;
|
|
59
|
+
return { scheme, hashAlgorithm };
|
|
60
|
+
};
|
|
61
|
+
exports.signAlgorithmToSchemeAndHashAlg = signAlgorithmToSchemeAndHashAlg;
|
|
62
|
+
const cryptoSubtleImportRSAKey = (jwk, scheme, hashAlgorithm) => __awaiter(void 0, void 0, void 0, function* () {
|
|
63
|
+
const hashName = hashAlgorithm ? hashAlgorithm : jwk.alg ? `SHA-${jwk.alg.substring(2)}` : 'SHA-256';
|
|
64
|
+
const importParams = { name: scheme, hash: hashName };
|
|
65
|
+
return yield isomorphic_webcrypto_1.default.subtle.importKey('jwk', jwk, importParams, false, usage(jwk));
|
|
66
|
+
});
|
|
67
|
+
exports.cryptoSubtleImportRSAKey = cryptoSubtleImportRSAKey;
|
|
68
|
+
const generateRSAKeyAsPEM = (scheme, hashAlgorithm, modulusLength) => __awaiter(void 0, void 0, void 0, function* () {
|
|
69
|
+
const hashName = hashAlgorithm ? hashAlgorithm : 'SHA-256';
|
|
70
|
+
const params = {
|
|
71
|
+
name: scheme,
|
|
72
|
+
hash: hashName,
|
|
73
|
+
modulusLength: modulusLength ? modulusLength : 2048,
|
|
74
|
+
publicExponent: new Uint8Array([1, 0, 1]),
|
|
75
|
+
};
|
|
76
|
+
const keyUsage = scheme === 'RSA-PSS' || scheme === 'RSASSA-PKCS1-V1_5' ? ['sign', 'verify'] : ['encrypt', 'decrypt'];
|
|
77
|
+
const keypair = yield isomorphic_webcrypto_1.default.subtle.generateKey(params, true, keyUsage);
|
|
78
|
+
const pkcs8 = yield isomorphic_webcrypto_1.default.subtle.exportKey('pkcs8', keypair.privateKey);
|
|
79
|
+
const uint8Array = new Uint8Array(pkcs8);
|
|
80
|
+
return (0, x509_utils_1.base64ToPEM)(u8a.toString(uint8Array, 'base64pad'), 'RSA PRIVATE KEY');
|
|
81
|
+
});
|
|
82
|
+
exports.generateRSAKeyAsPEM = generateRSAKeyAsPEM;
|
|
83
|
+
//# sourceMappingURL=rsa-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rsa-key.js","sourceRoot":"","sources":["../../src/x509/rsa-key.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rsa-signer.d.ts","sourceRoot":"","sources":["../../src/x509/rsa-signer.ts"],"names":[],"mappings":"AAEA,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;CAOpF"}
|
|
@@ -0,0 +1,101 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
+
};
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
exports.RSASigner = void 0;
|
|
39
|
+
const u8a = __importStar(require("uint8arrays"));
|
|
40
|
+
const isomorphic_webcrypto_1 = __importDefault(require("@sphereon/isomorphic-webcrypto"));
|
|
41
|
+
const rsa_key_1 = require("./rsa-key");
|
|
42
|
+
const x509_utils_1 = require("./x509-utils");
|
|
43
|
+
class RSASigner {
|
|
44
|
+
/**
|
|
45
|
+
*
|
|
46
|
+
* @param key Either in PEM or JWK format (no raw hex keys here!)
|
|
47
|
+
* @param opts The algorithm and signature/encryption schemes
|
|
48
|
+
*/
|
|
49
|
+
constructor(key, opts) {
|
|
50
|
+
var _a, _b;
|
|
51
|
+
if (typeof key === 'string') {
|
|
52
|
+
this.jwk = (0, x509_utils_1.PEMToJwk)(key, opts === null || opts === void 0 ? void 0 : opts.visibility);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
this.jwk = key;
|
|
56
|
+
}
|
|
57
|
+
this.hashAlgorithm = (_a = opts === null || opts === void 0 ? void 0 : opts.hashAlgorithm) !== null && _a !== void 0 ? _a : 'SHA-256';
|
|
58
|
+
this.scheme = (_b = opts === null || opts === void 0 ? void 0 : opts.scheme) !== null && _b !== void 0 ? _b : 'RSA-PSS';
|
|
59
|
+
}
|
|
60
|
+
getImportParams() {
|
|
61
|
+
if (this.scheme === 'RSA-PSS') {
|
|
62
|
+
return { name: this.scheme, saltLength: 32 };
|
|
63
|
+
}
|
|
64
|
+
// console.log({ name: this.scheme /*, hash: this.hashAlgorithm*/ })
|
|
65
|
+
return { name: this.scheme /*, hash: this.hashAlgorithm*/ };
|
|
66
|
+
}
|
|
67
|
+
getKey() {
|
|
68
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
69
|
+
if (!this.key) {
|
|
70
|
+
this.key = yield (0, rsa_key_1.cryptoSubtleImportRSAKey)(this.jwk, this.scheme, this.hashAlgorithm);
|
|
71
|
+
}
|
|
72
|
+
return this.key;
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
bufferToString(buf) {
|
|
76
|
+
const uint8Array = new Uint8Array(buf);
|
|
77
|
+
return u8a.toString(uint8Array, 'base64url'); // Needs to be base64url for JsonWebSignature2020. Don't change!
|
|
78
|
+
}
|
|
79
|
+
sign(data) {
|
|
80
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
81
|
+
const input = data;
|
|
82
|
+
const key = yield this.getKey();
|
|
83
|
+
const signature = this.bufferToString(yield isomorphic_webcrypto_1.default.subtle.sign(this.getImportParams(), key, input));
|
|
84
|
+
if (!signature) {
|
|
85
|
+
throw Error('Could not sign input data');
|
|
86
|
+
}
|
|
87
|
+
// base64url signature
|
|
88
|
+
return signature;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
verify(data, signature) {
|
|
92
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
93
|
+
const jws = signature.includes('.') ? signature.split('.')[2] : signature;
|
|
94
|
+
const input = typeof data == 'string' ? u8a.fromString(data, 'utf-8') : data;
|
|
95
|
+
const verificationResult = yield isomorphic_webcrypto_1.default.subtle.verify(this.getImportParams(), yield this.getKey(), u8a.fromString(jws, 'base64url'), input);
|
|
96
|
+
return verificationResult;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
exports.RSASigner = RSASigner;
|
|
101
|
+
//# sourceMappingURL=rsa-signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rsa-signer.js","sourceRoot":"","sources":["../../src/x509/rsa-signer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAkC;AAClC,0FAAmD;AAGnD,uCAA+F;AAC/F,6CAAuC;AAEvC,MAAa,SAAS;IAOpB;;;;OAIG;IACH,YACE,GAAiB,EACjB,IAAyH;;QAEzH,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;YAC3B,IAAI,CAAC,GAAG,GAAG,IAAA,qBAAQ,EAAC,GAAG,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,CAAC,CAAA;SAC3C;aAAM;YACL,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;SACf;QAED,IAAI,CAAC,aAAa,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,aAAa,mCAAI,SAAS,CAAA;QACrD,IAAI,CAAC,MAAM,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,mCAAI,SAAS,CAAA;IACzC,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE;YAC7B,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,CAAA;SAC7C;QACD,oEAAoE;QACpE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,8BAA8B,EAAE,CAAA;IAC7D,CAAC;IAEa,MAAM;;YAClB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;gBACb,IAAI,CAAC,GAAG,GAAG,MAAM,IAAA,kCAAwB,EAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;aACrF;YACD,OAAO,IAAI,CAAC,GAAG,CAAA;QACjB,CAAC;KAAA;IAEO,cAAc,CAAC,GAAgB;QACrC,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;QACtC,OAAO,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA,CAAC,gEAAgE;IAC/G,CAAC;IAEY,IAAI,CAAC,IAAgB;;YAChC,MAAM,KAAK,GAAG,IAAI,CAAA;YAClB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;YAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,8BAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;YACnG,IAAI,CAAC,SAAS,EAAE;gBACd,MAAM,KAAK,CAAC,2BAA2B,CAAC,CAAA;aACzC;YAED,uBAAuB;YACvB,OAAO,SAAS,CAAA;QAClB,CAAC;KAAA;IAEY,MAAM,CAAC,IAAyB,EAAE,SAAiB;;YAC9D,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YAEzE,MAAM,KAAK,GAAG,OAAO,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YAC5E,MAAM,kBAAkB,GAAG,MAAM,8BAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,KAAK,CAAC,CAAA;YAC3I,OAAO,kBAAkB,CAAA;QAC3B,CAAC;KAAA;CACF;AAjED,8BAiEC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
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?: 'base64pad' | 'base64urlpad') => string;
|
|
22
|
+
export declare const hexToPEM: (hex: string, type: KeyVisibility) => string;
|
|
23
|
+
export declare function base64ToPEM(cert: string, headerKey?: 'PUBLIC KEY' | 'RSA PRIVATE KEY' | 'PRIVATE KEY' | 'CERTIFICATE'): string;
|
|
24
|
+
//# sourceMappingURL=x509-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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,WAAW,GAAG,cAAc,WAGtF,CAAA;AAUD,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"}
|