@super-protocol/sdk-js 3.12.1-beta.2 → 3.13.0-beta.0
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/cjs/certificates/binary-splitter.d.ts +26 -0
- package/dist/cjs/certificates/binary-splitter.js +269 -0
- package/dist/cjs/certificates/generator.d.ts +38 -0
- package/dist/cjs/certificates/generator.js +237 -0
- package/dist/cjs/certificates/helper.d.ts +5 -2
- package/dist/cjs/certificates/helper.js +19 -15
- package/dist/cjs/certificates/index.d.ts +1 -0
- package/dist/cjs/certificates/index.js +2 -1
- package/dist/cjs/certificates/serializer.d.ts +5 -0
- package/dist/cjs/certificates/serializer.js +98 -2
- package/dist/cjs/certificates/setup-crypto.d.ts +3 -0
- package/dist/cjs/certificates/setup-crypto.js +51 -0
- package/dist/cjs/certificates/types.d.ts +77 -0
- package/dist/cjs/connectors/BlockchainConnector.js +11 -8
- package/dist/cjs/connectors/BlockchainEventsListener.d.ts +4 -4
- package/dist/cjs/connectors/BlockchainEventsListener.js +9 -8
- package/dist/cjs/constants.d.ts +5 -1
- package/dist/cjs/constants.js +12 -5
- package/dist/cjs/index.d.ts +0 -2
- package/dist/cjs/index.js +3 -6
- package/dist/cjs/models/Offer.d.ts +1 -1
- package/dist/cjs/models/Offer.js +10 -3
- package/dist/cjs/models/Order.d.ts +1 -1
- package/dist/cjs/models/Order.js +21 -20
- package/dist/cjs/models/TeeOffer.d.ts +2 -2
- package/dist/cjs/models/TeeOffer.js +18 -3
- package/dist/cjs/proto/OrderReport.d.ts +206 -15
- package/dist/cjs/proto/OrderReport.js +169 -3
- package/dist/cjs/staticModels/ActiveOrders.d.ts +1 -1
- package/dist/cjs/staticModels/ActiveOrders.js +1 -1
- package/dist/cjs/staticModels/OfferResources.js +3 -4
- package/dist/cjs/staticModels/Offers.d.ts +3 -4
- package/dist/cjs/staticModels/Offers.js +16 -17
- package/dist/cjs/staticModels/OffersCommon.d.ts +18 -0
- package/dist/cjs/staticModels/OffersCommon.js +79 -0
- package/dist/cjs/staticModels/Orders.d.ts +6 -5
- package/dist/cjs/staticModels/Orders.js +96 -5
- package/dist/cjs/staticModels/SecretRequests.js +2 -3
- package/dist/cjs/staticModels/StaticModel.d.ts +14 -2
- package/dist/cjs/staticModels/StaticModel.js +90 -2
- package/dist/cjs/staticModels/SuperproToken.d.ts +26 -1
- package/dist/cjs/staticModels/SuperproToken.js +40 -1
- package/dist/cjs/staticModels/TeeOffers.d.ts +4 -4
- package/dist/cjs/staticModels/TeeOffers.js +17 -16
- package/dist/cjs/tee/OrderReportService.js +4 -2
- package/dist/cjs/tee/QuoteValidator.d.ts +3 -2
- package/dist/cjs/tee/QuoteValidator.js +5 -4
- package/dist/cjs/tee/TeeCertificateService.d.ts +1 -1
- package/dist/cjs/tee/TeeCertificateService.js +11 -14
- package/dist/cjs/tee/TeeSignatureVerifier.d.ts +6 -4
- package/dist/cjs/tee/TeeSignatureVerifier.js +60 -32
- package/dist/cjs/tee/types.d.ts +1 -1
- package/dist/cjs/types/Order.d.ts +28 -2
- package/dist/cjs/types/Order.js +23 -2
- package/dist/cjs/types/index.d.ts +0 -1
- package/dist/cjs/types/index.js +1 -2
- package/dist/cjs/utils/CryptoKeysTransformer.d.ts +4 -0
- package/dist/cjs/utils/CryptoKeysTransformer.js +50 -1
- package/dist/cjs/utils/TxManager.d.ts +2 -0
- package/dist/cjs/utils/TxManager.js +56 -25
- package/dist/cjs/utils/helper.d.ts +11 -3
- package/dist/cjs/utils/helper.js +56 -12
- package/dist/cjs/utils/helpers/getRawRpc.d.ts +2 -0
- package/dist/cjs/utils/helpers/getRawRpc.js +19 -0
- package/dist/cjs/utils/helpers/index.d.ts +1 -0
- package/dist/cjs/utils/helpers/index.js +2 -1
- package/dist/cjs/utils/types.d.ts +14 -0
- package/dist/cjs/utils/types.js +3 -0
- package/dist/mjs/certificates/binary-splitter.d.ts +26 -0
- package/dist/mjs/certificates/binary-splitter.js +265 -0
- package/dist/mjs/certificates/generator.d.ts +38 -0
- package/dist/mjs/certificates/generator.js +230 -0
- package/dist/mjs/certificates/helper.d.ts +5 -2
- package/dist/mjs/certificates/helper.js +19 -15
- package/dist/mjs/certificates/index.d.ts +1 -0
- package/dist/mjs/certificates/index.js +2 -1
- package/dist/mjs/certificates/serializer.d.ts +5 -0
- package/dist/mjs/certificates/serializer.js +94 -1
- package/dist/mjs/certificates/setup-crypto.d.ts +3 -0
- package/dist/mjs/certificates/setup-crypto.js +22 -0
- package/dist/mjs/certificates/types.d.ts +77 -0
- package/dist/mjs/connectors/BlockchainConnector.js +11 -8
- package/dist/mjs/connectors/BlockchainEventsListener.d.ts +4 -4
- package/dist/mjs/connectors/BlockchainEventsListener.js +9 -8
- package/dist/mjs/constants.d.ts +5 -1
- package/dist/mjs/constants.js +11 -4
- package/dist/mjs/index.d.ts +0 -2
- package/dist/mjs/index.js +1 -3
- package/dist/mjs/models/Offer.d.ts +1 -1
- package/dist/mjs/models/Offer.js +10 -3
- package/dist/mjs/models/Order.d.ts +1 -1
- package/dist/mjs/models/Order.js +22 -21
- package/dist/mjs/models/TeeOffer.d.ts +2 -2
- package/dist/mjs/models/TeeOffer.js +18 -3
- package/dist/mjs/proto/OrderReport.d.ts +206 -15
- package/dist/mjs/proto/OrderReport.js +168 -2
- package/dist/mjs/staticModels/ActiveOrders.d.ts +1 -1
- package/dist/mjs/staticModels/ActiveOrders.js +1 -1
- package/dist/mjs/staticModels/OfferResources.js +4 -5
- package/dist/mjs/staticModels/Offers.d.ts +3 -4
- package/dist/mjs/staticModels/Offers.js +16 -17
- package/dist/mjs/staticModels/OffersCommon.d.ts +18 -0
- package/dist/mjs/staticModels/OffersCommon.js +73 -0
- package/dist/mjs/staticModels/Orders.d.ts +6 -5
- package/dist/mjs/staticModels/Orders.js +98 -7
- package/dist/mjs/staticModels/SecretRequests.js +3 -4
- package/dist/mjs/staticModels/StaticModel.d.ts +14 -2
- package/dist/mjs/staticModels/StaticModel.js +90 -2
- package/dist/mjs/staticModels/SuperproToken.d.ts +26 -1
- package/dist/mjs/staticModels/SuperproToken.js +40 -1
- package/dist/mjs/staticModels/TeeOffers.d.ts +4 -4
- package/dist/mjs/staticModels/TeeOffers.js +17 -16
- package/dist/mjs/tee/OrderReportService.js +4 -2
- package/dist/mjs/tee/QuoteValidator.d.ts +3 -2
- package/dist/mjs/tee/QuoteValidator.js +5 -4
- package/dist/mjs/tee/TeeCertificateService.d.ts +1 -1
- package/dist/mjs/tee/TeeCertificateService.js +12 -15
- package/dist/mjs/tee/TeeSignatureVerifier.d.ts +6 -4
- package/dist/mjs/tee/TeeSignatureVerifier.js +59 -31
- package/dist/mjs/tee/types.d.ts +1 -1
- package/dist/mjs/types/Order.d.ts +28 -2
- package/dist/mjs/types/Order.js +21 -1
- package/dist/mjs/types/index.d.ts +0 -1
- package/dist/mjs/types/index.js +1 -2
- package/dist/mjs/utils/CryptoKeysTransformer.d.ts +4 -0
- package/dist/mjs/utils/CryptoKeysTransformer.js +50 -1
- package/dist/mjs/utils/TxManager.d.ts +2 -0
- package/dist/mjs/utils/TxManager.js +57 -26
- package/dist/mjs/utils/helper.d.ts +11 -3
- package/dist/mjs/utils/helper.js +54 -12
- package/dist/mjs/utils/helpers/getRawRpc.d.ts +2 -0
- package/dist/mjs/utils/helpers/getRawRpc.js +15 -0
- package/dist/mjs/utils/helpers/index.d.ts +1 -0
- package/dist/mjs/utils/helpers/index.js +2 -1
- package/dist/mjs/utils/types.d.ts +14 -0
- package/dist/mjs/utils/types.js +2 -0
- package/package.json +5 -3
- package/readme.md +11 -0
- package/dist/cjs/contracts/Campaign.d.ts +0 -1036
- package/dist/cjs/contracts/Campaign.js +0 -1347
- package/dist/cjs/staticModels/Campaign.d.ts +0 -59
- package/dist/cjs/staticModels/Campaign.js +0 -248
- package/dist/cjs/types/Campaign.d.ts +0 -57
- package/dist/cjs/types/Campaign.js +0 -11
- package/dist/mjs/contracts/Campaign.d.ts +0 -1036
- package/dist/mjs/contracts/Campaign.js +0 -1344
- package/dist/mjs/staticModels/Campaign.d.ts +0 -59
- package/dist/mjs/staticModels/Campaign.js +0 -243
- package/dist/mjs/types/Campaign.d.ts +0 -57
- package/dist/mjs/types/Campaign.js +0 -8
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
import { randomUUID } from 'crypto';
|
|
3
|
+
import forge from 'node-forge';
|
|
4
|
+
import { X509CertificateGenerator, BasicConstraintsExtension, ExtendedKeyUsageExtension, Extension, SubjectAlternativeNameExtension, ExtendedKeyUsage, KeyUsageFlags, KeyUsagesExtension, Pkcs10CertificateRequestGenerator, Pkcs10CertificateRequest, X509Certificate, } from '@peculiar/x509';
|
|
5
|
+
import { cryptoProvider } from './setup-crypto.js';
|
|
6
|
+
import { CryptoKeysTransformer } from '../utils/CryptoKeysTransformer.js';
|
|
7
|
+
import { isIpAddress } from '../utils/helper.js';
|
|
8
|
+
const MAX_X509_SERIAL = BigInt('0x' + 'F'.repeat(40));
|
|
9
|
+
const principalAttributeMap = {
|
|
10
|
+
commonName: 'CN',
|
|
11
|
+
country: 'C',
|
|
12
|
+
localityName: 'L',
|
|
13
|
+
stateName: 'ST',
|
|
14
|
+
organization: 'O',
|
|
15
|
+
organizationalUnit: 'OU',
|
|
16
|
+
};
|
|
17
|
+
const notAllowedCertificateCustomExtensions = [...Object.values(forge.pki.oids)];
|
|
18
|
+
export class CertificateGenerator {
|
|
19
|
+
/**
|
|
20
|
+
* Generates certificate based on the provided parameters.
|
|
21
|
+
* @param params - Parameters for generating the certificate.
|
|
22
|
+
* @returns The generated certificate in PEM format.
|
|
23
|
+
*/
|
|
24
|
+
static async generateCert(params) {
|
|
25
|
+
const ca = Boolean(params.ca);
|
|
26
|
+
const { publicKey, privateKey } = await CertificateGenerator.getCryptoKeys(params);
|
|
27
|
+
const signingAlgorithm = publicKey.algorithm;
|
|
28
|
+
const extensions = [new BasicConstraintsExtension(ca, undefined, true)];
|
|
29
|
+
const extendedKeyUsageItems = [];
|
|
30
|
+
if (signingAlgorithm.namedCurve !== 'K-256' && params.dnsNames?.length) {
|
|
31
|
+
const generalNames = params.dnsNames.map((dnsName) => ({
|
|
32
|
+
type: (isIpAddress(dnsName) ? 'ip' : 'dns'),
|
|
33
|
+
value: dnsName,
|
|
34
|
+
}));
|
|
35
|
+
extensions.push(new SubjectAlternativeNameExtension(generalNames));
|
|
36
|
+
extendedKeyUsageItems.push(...[ExtendedKeyUsage.serverAuth, ExtendedKeyUsage.clientAuth]);
|
|
37
|
+
}
|
|
38
|
+
if (params.ocspSigning) {
|
|
39
|
+
extendedKeyUsageItems.push(ExtendedKeyUsage.ocspSigning);
|
|
40
|
+
}
|
|
41
|
+
if (extendedKeyUsageItems.length) {
|
|
42
|
+
extensions.push(new ExtendedKeyUsageExtension(extendedKeyUsageItems, false));
|
|
43
|
+
}
|
|
44
|
+
let keyUsageFlags = KeyUsageFlags.digitalSignature | KeyUsageFlags.keyEncipherment;
|
|
45
|
+
if (params.ca) {
|
|
46
|
+
keyUsageFlags |= KeyUsageFlags.keyCertSign;
|
|
47
|
+
}
|
|
48
|
+
extensions.push(new KeyUsagesExtension(keyUsageFlags, true));
|
|
49
|
+
if (params.customExtensions?.length) {
|
|
50
|
+
const filteredExtensions = params.customExtensions.filter((ext) => !notAllowedCertificateCustomExtensions.includes(ext.oid));
|
|
51
|
+
for (const customExtension of filteredExtensions) {
|
|
52
|
+
if (!customExtension.oid || !customExtension.value) {
|
|
53
|
+
throw new Error('Custom extension OID and value are required');
|
|
54
|
+
}
|
|
55
|
+
extensions.push(new Extension(customExtension.oid, false, customExtension.value));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const createCertificateParams = {
|
|
59
|
+
serialNumber: CertificateGenerator.generateSerialNumber(),
|
|
60
|
+
issuer: CertificateGenerator.getPrincipalInfo(params.issuer),
|
|
61
|
+
subject: CertificateGenerator.getPrincipalInfo(params.subject),
|
|
62
|
+
notBefore: new Date(),
|
|
63
|
+
notAfter: params.notAfter,
|
|
64
|
+
publicKey,
|
|
65
|
+
signingKey: privateKey,
|
|
66
|
+
signingAlgorithm,
|
|
67
|
+
extensions,
|
|
68
|
+
};
|
|
69
|
+
const cert = await X509CertificateGenerator.create(createCertificateParams);
|
|
70
|
+
return cert.toString('pem');
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Generates a pair of cryptographic keys based on the specified signature algorithm.
|
|
74
|
+
* @param signatureAlgorithm - The algorithm to use for key generation.
|
|
75
|
+
* @returns A promise that resolves to a CryptoKeyPair containing the public and private keys.
|
|
76
|
+
*/
|
|
77
|
+
static generateKeys(signatureAlgorithm) {
|
|
78
|
+
const algorithm = CertificateGenerator.getAlgorithm(signatureAlgorithm);
|
|
79
|
+
return cryptoProvider.subtle.generateKey(algorithm, true, ['sign', 'verify']);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Generates a Certificate Signing Request (CSR) based on the provided parameters.
|
|
83
|
+
* @param params - Parameters for generating the CSR.
|
|
84
|
+
* @returns The generated CSR in PEM format.
|
|
85
|
+
*/
|
|
86
|
+
static async generateCsr(params) {
|
|
87
|
+
const keys = await CertificateGenerator.getCryptoKeys(params);
|
|
88
|
+
const signingAlgorithm = keys.publicKey.algorithm;
|
|
89
|
+
signingAlgorithm.hash = { name: 'SHA-256' };
|
|
90
|
+
const extensions = [];
|
|
91
|
+
if (signingAlgorithm.namedCurve !== 'K-256' && params.dnsNames?.length) {
|
|
92
|
+
const generalNames = params.dnsNames.map((dnsName) => ({
|
|
93
|
+
type: (isIpAddress(dnsName) ? 'ip' : 'dns'),
|
|
94
|
+
value: dnsName,
|
|
95
|
+
}));
|
|
96
|
+
extensions.push(new SubjectAlternativeNameExtension(generalNames));
|
|
97
|
+
}
|
|
98
|
+
if (params.customExtensions?.length) {
|
|
99
|
+
for (const customExtension of params.customExtensions) {
|
|
100
|
+
if (!customExtension.oid || !customExtension.value) {
|
|
101
|
+
throw new Error(`Some custom extension missed OID or value`);
|
|
102
|
+
}
|
|
103
|
+
extensions.push(new Extension(customExtension.oid, false, customExtension.value));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const createCsrParams = {
|
|
107
|
+
name: CertificateGenerator.getPrincipalInfo(params.subject),
|
|
108
|
+
keys,
|
|
109
|
+
signingAlgorithm,
|
|
110
|
+
extensions,
|
|
111
|
+
};
|
|
112
|
+
const csr = await Pkcs10CertificateRequestGenerator.create(createCsrParams);
|
|
113
|
+
return csr.toString('pem');
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Checks and parses a certificate in PEM format.
|
|
117
|
+
* @param certPem - The certificate in PEM format.
|
|
118
|
+
* @returns An object containing the parsed certificate details.
|
|
119
|
+
*/
|
|
120
|
+
static async checkAndParseCert(certPem) {
|
|
121
|
+
const cert = new X509Certificate(certPem);
|
|
122
|
+
if (cert.issuer === cert.subject) {
|
|
123
|
+
const isValid = await cert.verify();
|
|
124
|
+
if (!isValid) {
|
|
125
|
+
throw new Error('Self-signed certificate signature verification failed');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const publicKey = await cryptoProvider.subtle.importKey('spki', cert.publicKey.rawData, Object.assign(cert.signatureAlgorithm, cert.publicKey.algorithm), true, ['verify']);
|
|
129
|
+
return {
|
|
130
|
+
serialNumber: cert.serialNumber,
|
|
131
|
+
publicKey,
|
|
132
|
+
subject: cert.subject,
|
|
133
|
+
issuer: cert.issuer,
|
|
134
|
+
notBefore: cert.notBefore,
|
|
135
|
+
notAfter: cert.notAfter,
|
|
136
|
+
dnsNames: CertificateGenerator.extractDnsNamesFromExtensions(cert.extensions),
|
|
137
|
+
extensions: cert.extensions
|
|
138
|
+
.filter((ext) => ext.type !== forge.pki.oids['subjectAltName'])
|
|
139
|
+
.map((ext) => ({
|
|
140
|
+
oid: ext.type,
|
|
141
|
+
value: Buffer.from(ext.value),
|
|
142
|
+
})),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Checks and parses a Certificate Signing Request (CSR) in PEM format.
|
|
147
|
+
* @param csrPem - The CSR in PEM format.
|
|
148
|
+
* @returns An object containing the parsed CSR details.
|
|
149
|
+
*/
|
|
150
|
+
static async checkAndParseCsr(csrPem) {
|
|
151
|
+
const csr = new Pkcs10CertificateRequest(csrPem);
|
|
152
|
+
const isValid = await csr.verify();
|
|
153
|
+
if (!isValid) {
|
|
154
|
+
throw new Error('CSR signature verification failed');
|
|
155
|
+
}
|
|
156
|
+
const publicKey = await cryptoProvider.subtle.importKey('spki', csr.publicKey.rawData, Object.assign(csr.signatureAlgorithm, csr.publicKey.algorithm), true, ['verify']);
|
|
157
|
+
const parsedCsr = {
|
|
158
|
+
subject: csr.subject,
|
|
159
|
+
publicKey,
|
|
160
|
+
dnsNames: CertificateGenerator.extractDnsNamesFromExtensions(csr.extensions),
|
|
161
|
+
extensions: csr.extensions
|
|
162
|
+
.filter((ext) => ext.type !== forge.pki.oids['subjectAltName'])
|
|
163
|
+
.map((ext) => ({
|
|
164
|
+
oid: ext.type,
|
|
165
|
+
value: Buffer.from(ext.value),
|
|
166
|
+
})),
|
|
167
|
+
};
|
|
168
|
+
return parsedCsr;
|
|
169
|
+
}
|
|
170
|
+
static async getCryptoKeys({ privateKey, publicKey }) {
|
|
171
|
+
const [pubKey, privKey] = await Promise.all([
|
|
172
|
+
typeof publicKey === 'string'
|
|
173
|
+
? CryptoKeysTransformer.spkiPemToCryptoKey(publicKey)
|
|
174
|
+
: publicKey,
|
|
175
|
+
typeof privateKey === 'string'
|
|
176
|
+
? CryptoKeysTransformer.pkcs8PemToCryptoKey(privateKey)
|
|
177
|
+
: privateKey,
|
|
178
|
+
]);
|
|
179
|
+
assert.deepEqual(pubKey.algorithm, privKey.algorithm, 'Both keys must have same algorithm defined');
|
|
180
|
+
return { publicKey: pubKey, privateKey: privKey };
|
|
181
|
+
}
|
|
182
|
+
static generateSerialNumber() {
|
|
183
|
+
const uuid = randomUUID().replace(/-/g, '');
|
|
184
|
+
const serial = BigInt('0x' + uuid) % MAX_X509_SERIAL;
|
|
185
|
+
return serial.toString();
|
|
186
|
+
}
|
|
187
|
+
static getPrincipalInfo(principal) {
|
|
188
|
+
if (typeof principal === 'string') {
|
|
189
|
+
return principal;
|
|
190
|
+
}
|
|
191
|
+
if (!principal.commonName) {
|
|
192
|
+
throw new Error('Common name is required');
|
|
193
|
+
}
|
|
194
|
+
return Object.entries(principal)
|
|
195
|
+
.map(([key, value]) => `${principalAttributeMap[key] || key}=${value}`)
|
|
196
|
+
.join(',');
|
|
197
|
+
}
|
|
198
|
+
static getAlgorithm(signatureAlgorithm) {
|
|
199
|
+
switch (signatureAlgorithm) {
|
|
200
|
+
case 'RSASSA-PKCS1-SHA256':
|
|
201
|
+
return {
|
|
202
|
+
name: 'RSASSA-PKCS1-v1_5',
|
|
203
|
+
hash: 'SHA-256',
|
|
204
|
+
publicExponent: new Uint8Array([1, 0, 1]), // 65537
|
|
205
|
+
modulusLength: 2048,
|
|
206
|
+
};
|
|
207
|
+
case 'ECDSA-P-256-SHA256':
|
|
208
|
+
return {
|
|
209
|
+
name: 'ECDSA',
|
|
210
|
+
namedCurve: 'P-256',
|
|
211
|
+
};
|
|
212
|
+
case 'ECDSA-secp256k1-SHA256':
|
|
213
|
+
return {
|
|
214
|
+
name: 'ECDSA',
|
|
215
|
+
namedCurve: 'K-256',
|
|
216
|
+
};
|
|
217
|
+
default:
|
|
218
|
+
throw new Error(`Unsupported signature algorithm: ${signatureAlgorithm}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
static extractDnsNamesFromExtensions(extensions) {
|
|
222
|
+
const subjectAltNameExt = extensions.find((ext) => ext.type === forge.pki.oids['subjectAltName']);
|
|
223
|
+
if (!subjectAltNameExt) {
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
const dnsNames = subjectAltNameExt.names.items.map((item) => item.value);
|
|
227
|
+
return dnsNames;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NlcnRpZmljYXRlcy9nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFFTCx3QkFBd0IsRUFDeEIseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixTQUFTLEVBQ1QsK0JBQStCLEVBRy9CLGdCQUFnQixFQUNoQixhQUFhLEVBQ2Isa0JBQWtCLEVBQ2xCLGlDQUFpQyxFQUVqQyx3QkFBd0IsRUFDeEIsZUFBZSxHQUNoQixNQUFNLGdCQUFnQixDQUFDO0FBV3hCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFakQsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFdEQsTUFBTSxxQkFBcUIsR0FBMkI7SUFDcEQsVUFBVSxFQUFFLElBQUk7SUFDaEIsT0FBTyxFQUFFLEdBQUc7SUFDWixZQUFZLEVBQUUsR0FBRztJQUNqQixTQUFTLEVBQUUsSUFBSTtJQUNmLFlBQVksRUFBRSxHQUFHO0lBQ2pCLGtCQUFrQixFQUFFLElBQUk7Q0FDekIsQ0FBQztBQUVGLE1BQU0scUNBQXFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBRWpGLE1BQU0sT0FBTyxvQkFBb0I7SUFDL0I7Ozs7T0FJRztJ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
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import * as pkijs from 'pkijs';
|
|
3
|
-
import { ValidateCertChainResult } from './types.js';
|
|
3
|
+
import { AlgorithmObj, ValidateCertChainResult } from './types.js';
|
|
4
|
+
import './setup-crypto.js';
|
|
4
5
|
export declare class CertificatesHelper {
|
|
5
6
|
private static downloadedCertificateCache;
|
|
6
|
-
static derToPem(data: ArrayBuffer): string;
|
|
7
|
+
static derToPem(data: ArrayBuffer, type?: string): string;
|
|
7
8
|
static pemToDer(certPem: string): Uint8Array;
|
|
8
9
|
static splitPemCerts(certs: string): string[];
|
|
9
10
|
static getDomain(certPem: string): string | undefined;
|
|
@@ -16,6 +17,8 @@ export declare class CertificatesHelper {
|
|
|
16
17
|
static derChainToPem(certsDer: Uint8Array[]): string;
|
|
17
18
|
static downloadCertWithCache(url: string): Promise<Buffer>;
|
|
18
19
|
static sortCertsFromLeafToRoot(certsPem: string | string[]): pkijs.Certificate[];
|
|
20
|
+
static getCertPublicKeyAlgorithm(certPem: string): AlgorithmObj;
|
|
21
|
+
static getCsrPublicKeyAlgorithm(csrPem: string): AlgorithmObj;
|
|
19
22
|
static validateCertChain(certsPem: string | string[], caPem: string | string[], options?: {
|
|
20
23
|
offline?: boolean;
|
|
21
24
|
}): Promise<ValidateCertChainResult>;
|
|
@@ -2,29 +2,20 @@ import _ from 'lodash';
|
|
|
2
2
|
import axios from 'axios';
|
|
3
3
|
import forge from 'node-forge';
|
|
4
4
|
import * as pkijs from 'pkijs';
|
|
5
|
+
import { Pkcs10CertificateRequest, X509Certificate } from '@peculiar/x509';
|
|
5
6
|
import { createMemoryCache } from '../utils/cache/memory.js';
|
|
6
7
|
import { OCSPHelper } from './ocsp.js';
|
|
7
8
|
import { CRLHelper } from './crl.js';
|
|
8
|
-
import
|
|
9
|
-
//pkijs initCryptoEngine method doesn't work properly in nodejs
|
|
10
|
-
//https://github.com/PeculiarVentures/PKI.js/blob/91c596be220c5010b38415a68bd100942dfd321e/src/CryptoEngine/CryptoEngineInit.ts#L4
|
|
11
|
-
try {
|
|
12
|
-
pkijs.getEngine();
|
|
13
|
-
}
|
|
14
|
-
catch (err) {
|
|
15
|
-
if (err.message === `Please call 'setEngine' before call to 'getEngine'`) {
|
|
16
|
-
pkijs.setEngine('Node', new pkijs.CryptoEngine({ name: 'Node', crypto: webcrypto }));
|
|
17
|
-
}
|
|
18
|
-
}
|
|
9
|
+
import './setup-crypto.js';
|
|
19
10
|
export class CertificatesHelper {
|
|
20
11
|
static downloadedCertificateCache = createMemoryCache();
|
|
21
|
-
static derToPem(data) {
|
|
12
|
+
static derToPem(data, type = 'CERTIFICATE') {
|
|
22
13
|
return forge.pem.encode({
|
|
23
14
|
contentDomain: null,
|
|
24
15
|
dekInfo: null,
|
|
25
16
|
headers: [],
|
|
26
17
|
procType: null,
|
|
27
|
-
type
|
|
18
|
+
type,
|
|
28
19
|
body: Buffer.from(data).toString('binary'),
|
|
29
20
|
});
|
|
30
21
|
}
|
|
@@ -61,7 +52,10 @@ export class CertificatesHelper {
|
|
|
61
52
|
return certs.map((certPem) => CertificatesHelper.pemToDer(certPem));
|
|
62
53
|
}
|
|
63
54
|
static derChainToPem(certsDer) {
|
|
64
|
-
return certsDer
|
|
55
|
+
return certsDer
|
|
56
|
+
.map((cert) => CertificatesHelper.derToPem(cert))
|
|
57
|
+
.join('')
|
|
58
|
+
.trim();
|
|
65
59
|
}
|
|
66
60
|
static async downloadCertWithCache(url) {
|
|
67
61
|
const responseData = await CertificatesHelper.downloadedCertificateCache.wrap(url, async () => {
|
|
@@ -92,6 +86,16 @@ export class CertificatesHelper {
|
|
|
92
86
|
const chains = leafs.map(buildChain).sort((one, two) => two.length - one.length);
|
|
93
87
|
return chains.flat();
|
|
94
88
|
}
|
|
89
|
+
static getCertPublicKeyAlgorithm(certPem) {
|
|
90
|
+
const cert = new X509Certificate(certPem);
|
|
91
|
+
const publicKey = cert.publicKey;
|
|
92
|
+
return publicKey.algorithm;
|
|
93
|
+
}
|
|
94
|
+
static getCsrPublicKeyAlgorithm(csrPem) {
|
|
95
|
+
const csr = new Pkcs10CertificateRequest(csrPem);
|
|
96
|
+
const publicKey = csr.publicKey;
|
|
97
|
+
return publicKey.algorithm;
|
|
98
|
+
}
|
|
95
99
|
static async validateCertChain(certsPem, caPem, options = {}) {
|
|
96
100
|
const { offline } = options;
|
|
97
101
|
// reverse() is needed because pkijs expects certificates to be ordered from root to leaf
|
|
@@ -144,4 +148,4 @@ export class CertificatesHelper {
|
|
|
144
148
|
return certsArray.map((certPem) => pkijs.Certificate.fromBER(CertificatesHelper.pemToDer(certPem)));
|
|
145
149
|
}
|
|
146
150
|
}
|
|
147
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
151
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NlcnRpZmljYXRlcy9oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3ZCLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEtBQUssTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLHdCQUF3QixFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNyQyxPQUFPLG1CQUFtQixDQUFDO0FBRTNCLE1BQU0sT0FBTyxrQkFBa0I7SUFDckIsTUFBTSxDQUFDLDBCQUEwQixHQUFHLGlCQUFpQixFQUFFLENBQUM7SUFFaEUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFpQixFQUFFLE9BQWUsYUFBYTtRQUM3RCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQ3RCLGFBQWEsRUFBRSxJQUFJO1lBQ25CLE9BQU8sRUFBRSxJQUFJO1lBQ2IsT0FBTyxFQUFFLEVBQUU7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLElBQUk7WUFDSixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1NBQzNDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQWU7UUFDN0IsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxD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
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export * from './helper.js';
|
|
2
2
|
export * from './types.js';
|
|
3
3
|
export * from './serializer.js';
|
|
4
|
-
|
|
4
|
+
export * from './generator.js';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2VydGlmaWNhdGVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxnQkFBZ0IsQ0FBQyJ9
|
|
@@ -1,5 +1,10 @@
|
|
|
1
|
+
import { BlockchainCert } from './types.js';
|
|
2
|
+
export declare const BLOCKCHAIN_CERT_TBS_PARTS: string[];
|
|
1
3
|
export declare class CertificateSerializer {
|
|
2
4
|
static serializeCertChain(certChainPem: string): string;
|
|
3
5
|
static deserializeCertChain(input: string): string;
|
|
4
6
|
static isSerializedCertChain(certChainBase64: string): boolean;
|
|
7
|
+
static serializeForBlockchain(certPem: string): BlockchainCert;
|
|
8
|
+
static deserializeFromBlockchain(data: BlockchainCert): string;
|
|
9
|
+
private static getPart;
|
|
5
10
|
}
|
|
@@ -1,6 +1,20 @@
|
|
|
1
|
+
import forge from 'node-forge';
|
|
2
|
+
import _ from 'lodash';
|
|
3
|
+
import { CertificateBinarySplitter, CertificateNonOidParts } from './binary-splitter.js';
|
|
1
4
|
import { CertificatesHelper } from './helper.js';
|
|
5
|
+
import { OID_CUSTOM_EXTENSION_USER_DATA } from '../constants.js';
|
|
6
|
+
import { OID_CUSTOM_EXTENSION_CHALLENGE_COMMON_ID, OID_CUSTOM_EXTENSION_CHALLENGE_ID, } from '@super-protocol/pki-common';
|
|
2
7
|
const CERTS_CHAIN_DELIMITER = ';';
|
|
3
8
|
const CERTS_SERIALIZATION_PREFIX = 'certs:';
|
|
9
|
+
export const BLOCKCHAIN_CERT_TBS_PARTS = [
|
|
10
|
+
'serialNumber',
|
|
11
|
+
'expirationDate',
|
|
12
|
+
'publicKey',
|
|
13
|
+
'ca',
|
|
14
|
+
'userData',
|
|
15
|
+
'mrEnclave',
|
|
16
|
+
'mrSigner',
|
|
17
|
+
];
|
|
4
18
|
export class CertificateSerializer {
|
|
5
19
|
static serializeCertChain(certChainPem) {
|
|
6
20
|
const certsDer = CertificatesHelper.pemChainToDer(certChainPem);
|
|
@@ -19,5 +33,84 @@ export class CertificateSerializer {
|
|
|
19
33
|
static isSerializedCertChain(certChainBase64) {
|
|
20
34
|
return certChainBase64.startsWith(CERTS_SERIALIZATION_PREFIX);
|
|
21
35
|
}
|
|
36
|
+
static serializeForBlockchain(certPem) {
|
|
37
|
+
const certAlgorithm = CertificatesHelper.getCertPublicKeyAlgorithm(certPem);
|
|
38
|
+
if (certAlgorithm.name !== 'ECDSA' || certAlgorithm.namedCurve !== 'K-256') {
|
|
39
|
+
throw new Error(`Unsupported certificate algorithm: ${certAlgorithm.name}${certAlgorithm.namedCurve ? `with curve ${certAlgorithm.namedCurve}` : ''}. Only ECDSA with secp256k1 curve is supported.`);
|
|
40
|
+
}
|
|
41
|
+
const certDer = CertificatesHelper.pemToDer(certPem);
|
|
42
|
+
const parts = new CertificateBinarySplitter(certDer).split([
|
|
43
|
+
CertificateNonOidParts.SERIAL_NUMBER,
|
|
44
|
+
CertificateNonOidParts.SIGNATURE,
|
|
45
|
+
CertificateNonOidParts.NOT_AFTER,
|
|
46
|
+
CertificateNonOidParts.SUBJECT_PUBLIC_KEY_INFO,
|
|
47
|
+
], [
|
|
48
|
+
forge.pki.oids['basicConstraints'],
|
|
49
|
+
OID_CUSTOM_EXTENSION_USER_DATA,
|
|
50
|
+
OID_CUSTOM_EXTENSION_CHALLENGE_ID,
|
|
51
|
+
OID_CUSTOM_EXTENSION_CHALLENGE_COMMON_ID,
|
|
52
|
+
]);
|
|
53
|
+
const [nonSerializedParts, serializedParts] = _.partition(parts, (part) => part instanceof Uint8Array);
|
|
54
|
+
const expirationDate = CertificateSerializer.getPart(serializedParts, 'notAfter');
|
|
55
|
+
const serial = CertificateSerializer.getPart(serializedParts, 'serialNumber');
|
|
56
|
+
const publicKey = CertificateSerializer.getPart(serializedParts, 'publicKey');
|
|
57
|
+
const ca = CertificateSerializer.getPart(serializedParts, forge.pki.oids['basicConstraints']);
|
|
58
|
+
const userData = CertificateSerializer.getPart(serializedParts, OID_CUSTOM_EXTENSION_USER_DATA, false);
|
|
59
|
+
const mrEnclave = CertificateSerializer.getPart(serializedParts, OID_CUSTOM_EXTENSION_CHALLENGE_ID, false);
|
|
60
|
+
const mrSigner = CertificateSerializer.getPart(serializedParts, OID_CUSTOM_EXTENSION_CHALLENGE_COMMON_ID, false);
|
|
61
|
+
const signature = CertificateSerializer.getPart(serializedParts, 'signature');
|
|
62
|
+
if (serializedParts.length !== 0) {
|
|
63
|
+
throw new Error(`Unexpected serialized parts found in certificate: ${serializedParts.map((part) => part.name || part.oid).join(', ')}`);
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
nonSerializedParts,
|
|
67
|
+
expirationDate: expirationDate.value,
|
|
68
|
+
ca: ca.value,
|
|
69
|
+
userData: userData?.value,
|
|
70
|
+
serialNumber: serial.value,
|
|
71
|
+
signature: signature.value,
|
|
72
|
+
publicKey: publicKey.value,
|
|
73
|
+
mrEnclave: mrEnclave?.value,
|
|
74
|
+
mrSigner: mrSigner?.value,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
static deserializeFromBlockchain(data) {
|
|
78
|
+
const bufferParts = [];
|
|
79
|
+
bufferParts.push(Buffer.from(data.nonSerializedParts[0]));
|
|
80
|
+
bufferParts.push(Buffer.from(data.nonSerializedParts[1]));
|
|
81
|
+
let partIndex = 2;
|
|
82
|
+
for (const field of BLOCKCHAIN_CERT_TBS_PARTS) {
|
|
83
|
+
const value = data[field];
|
|
84
|
+
if (value) {
|
|
85
|
+
bufferParts.push(Buffer.from(value));
|
|
86
|
+
if (partIndex < data.nonSerializedParts.length) {
|
|
87
|
+
bufferParts.push(Buffer.from(data.nonSerializedParts[partIndex++]));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// adding signature part
|
|
92
|
+
// if no custom extensions, it is needed to add additional block with keyUsage extension
|
|
93
|
+
// if custom extension present - keyUsage extension will be a part of block before this custom extension
|
|
94
|
+
// 3 - because asn1 bytes between r and s values are 2 or 3 bytes long (2 for positive value, 3 for negative value)
|
|
95
|
+
if (data.nonSerializedParts[partIndex]?.byteLength > 3) {
|
|
96
|
+
bufferParts.push(Buffer.from(data.nonSerializedParts[partIndex++]));
|
|
97
|
+
}
|
|
98
|
+
const rValue = data.signature.slice(0, 32);
|
|
99
|
+
bufferParts.push(Buffer.from(rValue));
|
|
100
|
+
if (partIndex < data.nonSerializedParts.length) {
|
|
101
|
+
bufferParts.push(Buffer.from(data.nonSerializedParts[partIndex++]));
|
|
102
|
+
}
|
|
103
|
+
const sValue = data.signature.slice(32, 64);
|
|
104
|
+
bufferParts.push(Buffer.from(sValue));
|
|
105
|
+
const certDer = Buffer.concat(bufferParts);
|
|
106
|
+
return CertificatesHelper.derToPem(certDer);
|
|
107
|
+
}
|
|
108
|
+
static getPart(parts, nameOrOid, mandatory = true) {
|
|
109
|
+
const part = _.remove(parts, (part) => part.name === nameOrOid || part.oid === nameOrOid)[0];
|
|
110
|
+
if (!part && mandatory) {
|
|
111
|
+
throw new Error(`Part with name or OID "${nameOrOid}" not found in certificate`);
|
|
112
|
+
}
|
|
113
|
+
return part;
|
|
114
|
+
}
|
|
22
115
|
}
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jZXJ0aWZpY2F0ZXMvc2VyaWFsaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqRCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRSxPQUFPLEVBQ0wsd0NBQXdDLEVBQ3hDLGlDQUFpQyxHQUNsQyxNQUFNLDRCQUE0QixDQUFDO0FBR3BDLE1BQU0scUJBQXFCLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLE1BQU0sMEJBQTBCLEdBQUcsUUFBUSxDQUFDO0FBRTVDLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHO0lBQ3ZDLGNBQWM7SUFDZCxnQkFBZ0I7SUFDaEIsV0FBVztJQUNYLElBQUk7SUFDSixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7Q0FDWCxDQUFDO0FBRUYsTUFBTSxPQUFPLHFCQUFxQjtJQUNoQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsWUFBb0I7UUFDNUMsTUFBTSxRQUFRLEdBQUcsa0JBQWtCLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWhFLE9BQU8sR0FBRywwQkFBMEIsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUM7SUFDcEksQ0FBQztJQUVELE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxL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
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as x509 from '@peculiar/x509';
|
|
2
|
+
import webcrypto from '@peculiar/webcrypto';
|
|
3
|
+
import * as pkijs from 'pkijs';
|
|
4
|
+
const cryptoProvider = new webcrypto.Crypto();
|
|
5
|
+
x509.cryptoProvider.set(cryptoProvider);
|
|
6
|
+
pkijs.setEngine('Node', new pkijs.CryptoEngine({ name: 'Node', crypto: cryptoProvider }));
|
|
7
|
+
pkijs.ECNamedCurves.register('K-256', '1.3.132.0.10', 32);
|
|
8
|
+
const originGetAlgorithmByOIDFn = pkijs.CryptoEngine.prototype.getAlgorithmByOID;
|
|
9
|
+
function getAlgorithmByOID(oid, safety, target) {
|
|
10
|
+
if (oid === '1.3.132.0.10') {
|
|
11
|
+
return {
|
|
12
|
+
name: 'K-256',
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
return originGetAlgorithmByOIDFn(oid, safety, target);
|
|
16
|
+
}
|
|
17
|
+
pkijs.CryptoEngine.prototype.getAlgorithmByOID = getAlgorithmByOID;
|
|
18
|
+
x509.PemConverter.isPem = (data) => {
|
|
19
|
+
return typeof data === 'string' && data.startsWith('-----BEGIN');
|
|
20
|
+
};
|
|
21
|
+
export { cryptoProvider };
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAtY3J5cHRvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NlcnRpZmljYXRlcy9zZXR1cC1jcnlwdG8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLFNBQVMsTUFBTSxxQkFBcUIsQ0FBQztBQUM1QyxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUvQixNQUFNLGNBQWMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUU5QyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUV4QyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFMUYsS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUUxRCxNQUFNLHlCQUF5QixHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDO0FBQ2pGLFNBQVMsaUJBQWlCLENBQUMsR0FBVyxFQUFFLE1BQWdCLEVBQUUsTUFBZTtJQUN2RSxJQUFJLEdBQUcsS0FBSyxjQUFjLEVBQUUsQ0FBQztRQUMzQixPQUFPO1lBQ0wsSUFBSSxFQUFFLE9BQU87U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8seUJBQXlCLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBQ0QsS0FBSyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7QUFFbkUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFZLEVBQWtCLEVBQUU7SUFDekQsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUNuRSxDQUFDLENBQUM7QUFFRixPQUFPLEVBQUUsY0FBYyxFQUFFLENBQUMifQ==
|
|
@@ -1,4 +1,81 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
1
2
|
export type ValidateCertChainResult = {
|
|
2
3
|
isValid: boolean;
|
|
3
4
|
errorMessage?: string;
|
|
4
5
|
};
|
|
6
|
+
export type SignatureAlgorithm = 'RSASSA-PKCS1-SHA256' | 'ECDSA-secp256k1-SHA256' | 'ECDSA-P-256-SHA256';
|
|
7
|
+
export type AlgorithmObj = {
|
|
8
|
+
name: string;
|
|
9
|
+
namedCurve?: string;
|
|
10
|
+
hash?: {
|
|
11
|
+
name: string;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
export type CustomExtension = {
|
|
15
|
+
oid: string;
|
|
16
|
+
value: Buffer;
|
|
17
|
+
};
|
|
18
|
+
export type CertificatePrincipal = {
|
|
19
|
+
country?: string;
|
|
20
|
+
stateName?: string;
|
|
21
|
+
localityName: string;
|
|
22
|
+
organization?: string;
|
|
23
|
+
organizationalUnit?: string;
|
|
24
|
+
commonName: string;
|
|
25
|
+
};
|
|
26
|
+
export type PemOrCryptoKeys = {
|
|
27
|
+
/**
|
|
28
|
+
* spki format for PEM
|
|
29
|
+
*/
|
|
30
|
+
publicKey: string | CryptoKey;
|
|
31
|
+
/**
|
|
32
|
+
* pkcs8 format for PEM
|
|
33
|
+
*/
|
|
34
|
+
privateKey: string | CryptoKey;
|
|
35
|
+
};
|
|
36
|
+
export type GenerateCertParams = PemOrCryptoKeys & {
|
|
37
|
+
subject: CertificatePrincipal | string;
|
|
38
|
+
issuer: CertificatePrincipal | string;
|
|
39
|
+
notAfter: Date;
|
|
40
|
+
dnsNames?: string[];
|
|
41
|
+
ca?: boolean;
|
|
42
|
+
ocspSigning?: boolean;
|
|
43
|
+
customExtensions?: CustomExtension[];
|
|
44
|
+
};
|
|
45
|
+
export type GenerateCsrParams = PemOrCryptoKeys & {
|
|
46
|
+
subject: CertificatePrincipal | string;
|
|
47
|
+
dnsNames?: string[];
|
|
48
|
+
customExtensions?: CustomExtension[];
|
|
49
|
+
};
|
|
50
|
+
export type ParsedCsr = {
|
|
51
|
+
publicKey: CryptoKey;
|
|
52
|
+
subject: string;
|
|
53
|
+
extensions: CustomExtension[];
|
|
54
|
+
dnsNames?: string[];
|
|
55
|
+
};
|
|
56
|
+
export type ParsedCert = {
|
|
57
|
+
serialNumber: string;
|
|
58
|
+
publicKey: CryptoKey;
|
|
59
|
+
subject: string;
|
|
60
|
+
issuer: string;
|
|
61
|
+
notBefore: Date;
|
|
62
|
+
notAfter: Date;
|
|
63
|
+
extensions: CustomExtension[];
|
|
64
|
+
dnsNames?: string[];
|
|
65
|
+
};
|
|
66
|
+
export type BlockchainCert = {
|
|
67
|
+
nonSerializedParts: Uint8Array[];
|
|
68
|
+
expirationDate: Uint8Array;
|
|
69
|
+
ca: Uint8Array;
|
|
70
|
+
userData?: Uint8Array;
|
|
71
|
+
serialNumber: Uint8Array;
|
|
72
|
+
signature: Uint8Array;
|
|
73
|
+
publicKey: Uint8Array;
|
|
74
|
+
mrEnclave?: Uint8Array;
|
|
75
|
+
mrSigner?: Uint8Array;
|
|
76
|
+
};
|
|
77
|
+
export type CertBinaryItem = {
|
|
78
|
+
name: string;
|
|
79
|
+
oid?: string;
|
|
80
|
+
value: Uint8Array;
|
|
81
|
+
};
|