node-opcua-crypto 2.2.0 → 3.0.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.
Files changed (67) hide show
  1. package/.github/workflows/main.yml +5 -2
  2. package/_tmp_certificate.pem +20 -0
  3. package/_tmp_csr.pem +17 -0
  4. package/_tmp_privatekey.der +0 -0
  5. package/_tmp_privatekey.pem +28 -0
  6. package/dist/source/asn1.js +1 -1
  7. package/dist/source/asn1.js.map +1 -1
  8. package/dist/source/buffer_utils.d.ts +0 -1
  9. package/dist/source/common.d.ts +6 -0
  10. package/dist/source/common.js +8 -0
  11. package/dist/source/common.js.map +1 -1
  12. package/dist/source/create_key_pair.d.ts +42 -0
  13. package/dist/source/create_key_pair.js +136 -0
  14. package/dist/source/create_key_pair.js.map +1 -0
  15. package/dist/source/explore_private_key.js +0 -2
  16. package/dist/source/explore_private_key.js.map +1 -1
  17. package/dist/source/index.d.ts +4 -0
  18. package/dist/source/index.js +4 -0
  19. package/dist/source/index.js.map +1 -1
  20. package/dist/source/subject.d.ts +27 -0
  21. package/dist/source/subject.js +125 -0
  22. package/dist/source/subject.js.map +1 -0
  23. package/dist/source/x509/_build_public_key.d.ts +1 -0
  24. package/dist/source/x509/_build_public_key.js +36 -0
  25. package/dist/source/x509/_build_public_key.js.map +1 -0
  26. package/dist/source/x509/_crypto.d.ts +3 -0
  27. package/dist/source/x509/_crypto.js +9 -0
  28. package/dist/source/x509/_crypto.js.map +1 -0
  29. package/dist/source/x509/_fix.d.ts +2 -0
  30. package/dist/source/x509/_fix.js +74 -0
  31. package/dist/source/x509/_fix.js.map +1 -0
  32. package/dist/source/x509/_get_attributes.d.ts +8 -0
  33. package/dist/source/x509/_get_attributes.js +56 -0
  34. package/dist/source/x509/_get_attributes.js.map +1 -0
  35. package/dist/source/x509/_internals.d.ts +0 -0
  36. package/dist/source/x509/_internals.js +2 -0
  37. package/dist/source/x509/_internals.js.map +1 -0
  38. package/dist/source/x509/create_certificate_signing_request.d.ts +18 -0
  39. package/dist/source/x509/create_certificate_signing_request.js +53 -0
  40. package/dist/source/x509/create_certificate_signing_request.js.map +1 -0
  41. package/dist/source/x509/create_key_pair.d.ts +28 -0
  42. package/dist/source/x509/create_key_pair.js +62 -0
  43. package/dist/source/x509/create_key_pair.js.map +1 -0
  44. package/dist/source/x509/create_self_signed_certificate.d.ts +17 -0
  45. package/dist/source/x509/create_self_signed_certificate.js +71 -0
  46. package/dist/source/x509/create_self_signed_certificate.js.map +1 -0
  47. package/dist/source_nodejs/generate_private_key_filename.d.ts +1 -0
  48. package/dist/source_nodejs/generate_private_key_filename.js +25 -0
  49. package/dist/source_nodejs/generate_private_key_filename.js.map +1 -0
  50. package/dist/source_nodejs/index.d.ts +1 -0
  51. package/dist/source_nodejs/index.js +1 -0
  52. package/dist/source_nodejs/index.js.map +1 -1
  53. package/package.json +10 -4
  54. package/source/asn1.ts +1 -1
  55. package/source/common.ts +7 -0
  56. package/source/explore_private_key.ts +1 -2
  57. package/source/index.ts +4 -0
  58. package/source/subject.ts +144 -0
  59. package/source/x509/_build_public_key.ts +25 -0
  60. package/source/x509/_crypto.ts +5 -0
  61. package/source/x509/_get_attributes.ts +60 -0
  62. package/source/x509/create_certificate_signing_request.ts +64 -0
  63. package/source/x509/create_key_pair.ts +70 -0
  64. package/source/x509/create_self_signed_certificate.ts +91 -0
  65. package/source_nodejs/generate_private_key_filename.ts +10 -0
  66. package/source_nodejs/index.ts +2 -1
  67. package/tsconfig.json +2 -1
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.buildPublicKey = void 0;
13
+ const x509_1 = require("@peculiar/x509");
14
+ // https://stackoverflow.com/questions/56807959/generate-public-key-from-private-key-using-webcrypto-api
15
+ function buildPublicKey(privateKey) {
16
+ return __awaiter(this, void 0, void 0, function* () {
17
+ const crypto = x509_1.cryptoProvider.get();
18
+ // export private key to JWK
19
+ const jwk = yield crypto.subtle.exportKey("jwk", privateKey);
20
+ // remove private data from JWK
21
+ delete jwk.d;
22
+ delete jwk.dp;
23
+ delete jwk.dq;
24
+ delete jwk.q;
25
+ delete jwk.qi;
26
+ jwk.key_ops = ["encrypt", "wrapKey"];
27
+ // import public key
28
+ const publicKey = yield crypto.subtle.importKey("jwk", jwk, { name: "RSA-OAEP", hash: "SHA-512" }, true, [
29
+ "encrypt",
30
+ "wrapKey",
31
+ ]);
32
+ return publicKey;
33
+ });
34
+ }
35
+ exports.buildPublicKey = buildPublicKey;
36
+ //# sourceMappingURL=_build_public_key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_build_public_key.js","sourceRoot":"","sources":["../../../source/x509/_build_public_key.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yCAAgD;AAEhD,wGAAwG;AACxG,SAAsB,cAAc,CAAC,UAAqB;;QACtD,MAAM,MAAM,GAAG,qBAAc,CAAC,GAAG,EAAE,CAAC;QAEpC,4BAA4B;QAC5B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAE7D,+BAA+B;QAC/B,OAAO,GAAG,CAAC,CAAC,CAAC;QACb,OAAO,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,GAAG,CAAC,CAAC,CAAC;QACb,OAAO,GAAG,CAAC,EAAE,CAAC;QACd,GAAG,CAAC,OAAO,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAErC,oBAAoB;QACpB,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE;YACrG,SAAS;YACT,SAAS;SACZ,CAAC,CAAC;QAEH,OAAO,SAAS,CAAC;IACrB,CAAC;CAAA;AArBD,wCAqBC"}
@@ -0,0 +1,3 @@
1
+ import { Crypto } from "@peculiar/webcrypto";
2
+ export declare const crypto: Crypto;
3
+ export * as x509 from "@peculiar/x509";
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.x509 = exports.crypto = void 0;
4
+ const x509 = require("@peculiar/x509");
5
+ const webcrypto_1 = require("@peculiar/webcrypto");
6
+ exports.crypto = new webcrypto_1.Crypto();
7
+ x509.cryptoProvider.set(exports.crypto);
8
+ exports.x509 = require("@peculiar/x509");
9
+ //# sourceMappingURL=_crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_crypto.js","sourceRoot":"","sources":["../../../source/x509/_crypto.ts"],"names":[],"mappings":";;;AAAA,uCAAuC;AACvC,mDAA6C;AAChC,QAAA,MAAM,GAAG,IAAI,kBAAM,EAAE,CAAC;AACnC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAM,CAAC,CAAC;AAChC,yCAAuC"}
@@ -0,0 +1,2 @@
1
+ import { Pkcs10CertificateRequest, Pkcs10CertificateRequestCreateParams } from "@peculiar/x509";
2
+ export declare function x509_Pkcs10CertificateRequestGenerator_create_fixed(params: Pkcs10CertificateRequestCreateParams): Promise<Pkcs10CertificateRequest>;
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.x509_Pkcs10CertificateRequestGenerator_create_fixed = void 0;
13
+ const asn1Schema = require("@peculiar/asn1-schema");
14
+ const asn1Csr = require("@peculiar/asn1-csr");
15
+ const asn1X509 = require("@peculiar/asn1-x509");
16
+ const asnPkcs9 = require("@peculiar/asn1-pkcs9");
17
+ const tsyringe = require("tsyringe");
18
+ const x509_1 = require("@peculiar/x509");
19
+ function x509_Pkcs10CertificateRequestGenerator_create_fixed(params) {
20
+ return __awaiter(this, void 0, void 0, function* () {
21
+ const crypto = x509_1.cryptoProvider.get();
22
+ if (!params.keys.privateKey) {
23
+ throw new Error("Bad field 'keys' in 'params' argument. 'privateKey' is empty");
24
+ }
25
+ if (!params.keys.publicKey) {
26
+ throw new Error("Bad field 'keys' in 'params' argument. 'publicKey' is empty");
27
+ }
28
+ const spki = yield crypto.subtle.exportKey("spki", params.keys.publicKey);
29
+ const asnReq = new asn1Csr.CertificationRequest({
30
+ certificationRequestInfo: new asn1Csr.CertificationRequestInfo({
31
+ subjectPKInfo: asn1Schema.AsnConvert.parse(spki, asn1X509.SubjectPublicKeyInfo),
32
+ }),
33
+ });
34
+ if (params.name) {
35
+ const name = params.name instanceof x509_1.Name ? params.name : new x509_1.Name(params.name);
36
+ asnReq.certificationRequestInfo.subject = asn1Schema.AsnConvert.parse(name.toArrayBuffer(), asn1X509.Name);
37
+ }
38
+ if (params.attributes) {
39
+ for (const o of params.attributes) {
40
+ asnReq.certificationRequestInfo.attributes.push(asn1Schema.AsnConvert.parse(o.rawData, asn1X509.Attribute));
41
+ }
42
+ }
43
+ if (params.extensions && params.extensions.length) {
44
+ const attr = new asn1X509.Attribute({ type: asnPkcs9.id_pkcs9_at_extensionRequest });
45
+ const extensions = new asn1X509.Extensions();
46
+ for (const o of params.extensions) {
47
+ extensions.push(asn1Schema.AsnConvert.parse(o.rawData, asn1X509.Extension));
48
+ }
49
+ attr.values.push(asn1Schema.AsnConvert.serialize(extensions));
50
+ asnReq.certificationRequestInfo.attributes.push(attr);
51
+ }
52
+ // const signingAlgorithm = { ...params.signingAlgorithm, ...params.keys.privateKey.algorithm };
53
+ const signingAlgorithm = Object.assign({}, params.keys.privateKey.algorithm);
54
+ const algProv = tsyringe.container.resolve(x509_1.diAlgorithmProvider);
55
+ asnReq.signatureAlgorithm = algProv.toAsnAlgorithm(signingAlgorithm);
56
+ const tbs = asn1Schema.AsnConvert.serialize(asnReq.certificationRequestInfo);
57
+ const signature = yield crypto.subtle.sign(signingAlgorithm, params.keys.privateKey, tbs);
58
+ const signatureFormatters = tsyringe.container.resolveAll(x509_1.diAsnSignatureFormatter).reverse();
59
+ let asnSignature = null;
60
+ for (const signatureFormatter of signatureFormatters) {
61
+ asnSignature = signatureFormatter.toAsnSignature(signingAlgorithm, signature);
62
+ if (asnSignature) {
63
+ break;
64
+ }
65
+ }
66
+ if (!asnSignature) {
67
+ throw Error("Cannot convert WebCrypto signature value to ASN.1 format");
68
+ }
69
+ asnReq.signature = asnSignature;
70
+ return new x509_1.Pkcs10CertificateRequest(asn1Schema.AsnConvert.serialize(asnReq));
71
+ });
72
+ }
73
+ exports.x509_Pkcs10CertificateRequestGenerator_create_fixed = x509_Pkcs10CertificateRequestGenerator_create_fixed;
74
+ //# sourceMappingURL=_fix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_fix.js","sourceRoot":"","sources":["../../../source/x509/_fix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { CertificatePurpose } from "../common";
2
+ import { x509 } from "./_crypto";
3
+ export declare function getAttributes(purpose: CertificatePurpose): {
4
+ nsComment: string;
5
+ basicConstraints: x509.BasicConstraintsExtension;
6
+ keyUsageExtension: x509.ExtendedKeyUsage[];
7
+ usages: x509.KeyUsageFlags;
8
+ };
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAttributes = void 0;
4
+ const common_1 = require("../common");
5
+ const _crypto_1 = require("./_crypto");
6
+ // key usage of OPCUA Server or OPCUA Client
7
+ const keyUsageApplication = _crypto_1.x509.KeyUsageFlags.keyEncipherment | _crypto_1.x509.KeyUsageFlags.dataEncipherment | _crypto_1.x509.KeyUsageFlags.digitalSignature;
8
+ // key usage for CA certificate
9
+ const keyUsageCA = _crypto_1.x509.KeyUsageFlags.keyCertSign | _crypto_1.x509.KeyUsageFlags.cRLSign;
10
+ function getAttributes(purpose) {
11
+ let basicConstraints;
12
+ let keyUsageExtension = [];
13
+ let usages;
14
+ let nsComment;
15
+ let extension;
16
+ switch (purpose) {
17
+ case common_1.CertificatePurpose.ForCertificateAuthority:
18
+ extension = "v3_ca";
19
+ /**
20
+ [ v3_ca ]
21
+ subjectKeyIdentifier = hash
22
+ authorityKeyIdentifier = keyid:always,issuer:always
23
+ * basicConstraints = CA:TRUE
24
+ * keyUsage = critical, cRLSign, keyCertSign
25
+ * nsComment = "Self-signed Certificate for CA generated by Node-OPCUA Certificate utility"
26
+ subjectAltName = $ENV::ALTNAME
27
+ */
28
+ basicConstraints = new _crypto_1.x509.BasicConstraintsExtension(true, undefined, false);
29
+ usages = keyUsageCA;
30
+ keyUsageExtension = [];
31
+ nsComment = "Self-signed certificate for CA generated by Node-OPCUA Certificate utility V2";
32
+ break;
33
+ case common_1.CertificatePurpose.ForApplication:
34
+ case common_1.CertificatePurpose.ForUserAuthentication:
35
+ default:
36
+ /**
37
+ [ v3_selfsigned]
38
+ subjectKeyIdentifier = hash
39
+ authorityKeyIdentifier = keyid,issuer
40
+ * basicConstraints = critical, CA:FALSE
41
+ * keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment, keyCertSign
42
+ * extendedKeyUsage = clientAuth,serverAuth
43
+ * nsComment = "Self-signed certificate generated by Node-OPCUA Certificate utility"
44
+ subjectAltName = $ENV::ALTNAME
45
+ */
46
+ extension = "v3_selfsigned";
47
+ basicConstraints = new _crypto_1.x509.BasicConstraintsExtension(false, undefined, true);
48
+ usages = keyUsageApplication;
49
+ keyUsageExtension = [_crypto_1.x509.ExtendedKeyUsage.serverAuth, _crypto_1.x509.ExtendedKeyUsage.clientAuth];
50
+ nsComment = "Self-signed certificate generated by Node-OPCUA Certificate utility V2";
51
+ break;
52
+ }
53
+ return { nsComment, basicConstraints, keyUsageExtension, usages };
54
+ }
55
+ exports.getAttributes = getAttributes;
56
+ //# sourceMappingURL=_get_attributes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_get_attributes.js","sourceRoot":"","sources":["../../../source/x509/_get_attributes.ts"],"names":[],"mappings":";;;AAAA,sCAA+C;AAC/C,uCAA+B;AAE/B,4CAA4C;AAC5C,MAAM,mBAAmB,GACrB,cAAI,CAAC,aAAa,CAAC,eAAe,GAAG,cAAI,CAAC,aAAa,CAAC,gBAAgB,GAAG,cAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC;AAEnH,+BAA+B;AAC/B,MAAM,UAAU,GAAG,cAAI,CAAC,aAAa,CAAC,WAAW,GAAG,cAAI,CAAC,aAAa,CAAC,OAAO,CAAC;AAE/E,SAAgB,aAAa,CAAC,OAA2B;IAMrD,IAAI,gBAAgD,CAAC;IACrD,IAAI,iBAAiB,GAA4B,EAAE,CAAC;IACpD,IAAI,MAA0B,CAAC;IAC/B,IAAI,SAAiB,CAAC;IACtB,IAAI,SAAiB,CAAC;IACtB,QAAQ,OAAO,EAAE;QACb,KAAK,2BAAkB,CAAC,uBAAuB;YAC3C,SAAS,GAAG,OAAO,CAAC;YACpB;;;;;;;;eAQG;YACH,gBAAgB,GAAG,IAAI,cAAI,CAAC,yBAAyB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YAC9E,MAAM,GAAG,UAAU,CAAC;YACpB,iBAAiB,GAAG,EAAE,CAAC;YACvB,SAAS,GAAG,+EAA+E,CAAC;YAC5F,MAAM;QACV,KAAK,2BAAkB,CAAC,cAAc,CAAC;QACvC,KAAK,2BAAkB,CAAC,qBAAqB,CAAC;QAC9C;YACI;;;;;;;;;eASG;YACH,SAAS,GAAG,eAAe,CAAC;YAC5B,gBAAgB,GAAG,IAAI,cAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YAC9E,MAAM,GAAG,mBAAmB,CAAC;YAC7B,iBAAiB,GAAG,CAAC,cAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,cAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;YACzF,SAAS,GAAG,wEAAwE,CAAC;YACrF,MAAM;KACb;IACD,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC;AACtE,CAAC;AAjDD,sCAiDC"}
File without changes
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=_internals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_internals.js","sourceRoot":"","sources":["../../../source/x509/_internals.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import { CertificatePurpose } from "../common";
2
+ import { x509 } from "./_crypto";
3
+ interface CreateCertificateSigningRequestOptions {
4
+ privateKey: CryptoKey;
5
+ notBefore?: Date;
6
+ notAfter?: Date;
7
+ validity?: number;
8
+ subject?: string;
9
+ dns?: string[];
10
+ ip?: string[];
11
+ applicationUri?: string;
12
+ purpose: CertificatePurpose;
13
+ }
14
+ export declare function createCertificateSigningRequest({ privateKey, subject, dns, ip, applicationUri, purpose, }: CreateCertificateSigningRequestOptions): Promise<{
15
+ csr: string;
16
+ der: x509.Pkcs10CertificateRequest;
17
+ }>;
18
+ export {};
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.createCertificateSigningRequest = void 0;
13
+ const subject_1 = require("../subject");
14
+ const _get_attributes_1 = require("./_get_attributes");
15
+ const _crypto_1 = require("./_crypto");
16
+ const _build_public_key_1 = require("./_build_public_key");
17
+ function createCertificateSigningRequest({ privateKey, subject, dns, ip, applicationUri, purpose, }) {
18
+ return __awaiter(this, void 0, void 0, function* () {
19
+ const modulusLength = 2048;
20
+ const alg = {
21
+ name: "RSASSA-PKCS1-v1_5",
22
+ hash: { name: "SHA-256" },
23
+ publicExponent: new Uint8Array([1, 0, 1]),
24
+ modulusLength,
25
+ };
26
+ const publicKey = yield (0, _build_public_key_1.buildPublicKey)(privateKey);
27
+ const keys = {
28
+ privateKey,
29
+ publicKey,
30
+ };
31
+ const alternativeNameExtensions = [];
32
+ dns && dns.forEach((d) => alternativeNameExtensions.push({ type: "dns", value: d }));
33
+ ip && ip.forEach((d) => alternativeNameExtensions.push({ type: "ip", value: d }));
34
+ applicationUri && alternativeNameExtensions.push({ type: "url", value: applicationUri });
35
+ const { basicConstraints, usages } = (0, _get_attributes_1.getAttributes)(purpose);
36
+ const s = new subject_1.Subject(subject || "");
37
+ const s1 = s.toStringInternal(", ");
38
+ const name = s1;
39
+ const csr = yield _crypto_1.x509.Pkcs10CertificateRequestGenerator.create({
40
+ name,
41
+ keys,
42
+ signingAlgorithm: alg,
43
+ extensions: [
44
+ basicConstraints,
45
+ new _crypto_1.x509.KeyUsagesExtension(usages, true),
46
+ new _crypto_1.x509.SubjectAlternativeNameExtension(alternativeNameExtensions),
47
+ ],
48
+ });
49
+ return { csr: csr.toString("pem"), der: csr };
50
+ });
51
+ }
52
+ exports.createCertificateSigningRequest = createCertificateSigningRequest;
53
+ //# sourceMappingURL=create_certificate_signing_request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create_certificate_signing_request.js","sourceRoot":"","sources":["../../../source/x509/create_certificate_signing_request.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wCAAqC;AAErC,uDAAkD;AAClD,uCAAiC;AACjC,2DAAqD;AAarD,SAAsB,+BAA+B,CAAC,EAClD,UAAU,EACV,OAAO,EACP,GAAG,EACH,EAAE,EACF,cAAc,EACd,OAAO,GAC8B;;QACrC,MAAM,aAAa,GAAG,IAAI,CAAC;QAE3B,MAAM,GAAG,GAAG;YACR,IAAI,EAAE,mBAAmB;YACzB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YACzB,cAAc,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACzC,aAAa;SAChB,CAAC;QAEF,MAAM,SAAS,GAAI,MAAM,IAAA,kCAAc,EAAC,UAAU,CAAC,CAAC;QAEpD,MAAM,IAAI,GAAG;YACT,UAAU;YACV,SAAS;SACZ,CAAC;QAEF,MAAM,yBAAyB,GAA2B,EAAE,CAAC;QAC7D,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACrF,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAClF,cAAc,IAAI,yBAAyB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;QAEzF,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,IAAA,+BAAa,EAAC,OAAO,CAAC,CAAC;QAE5D,MAAM,CAAC,GAAG,IAAI,iBAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACrC,MAAM,EAAE,GAAG,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,EAAE,CAAC;QAEhB,MAAM,GAAG,GAAG,MAAM,cAAI,CAAC,iCAAiC,CAAC,MAAM,CAAC;YAC5D,IAAI;YACJ,IAAI;YACJ,gBAAgB,EAAE,GAAG;YACrB,UAAU,EAAE;gBACR,gBAAgB;gBAChB,IAAI,cAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC;gBACzC,IAAI,cAAI,CAAC,+BAA+B,CAAC,yBAAyB,CAAC;aACtE;SACJ,CAAC,CAAC;QACH,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAClD,CAAC;CAAA;AA9CD,0EA8CC"}
@@ -0,0 +1,28 @@
1
+ interface KeyAlgorithm {
2
+ name: string;
3
+ }
4
+ type KeyType = "private" | "public" | "secret";
5
+ type KeyUsage = "decrypt" | "deriveBits" | "deriveKey" | "encrypt" | "sign" | "unwrapKey" | "verify" | "wrapKey";
6
+ /**
7
+ * The CryptoKey dictionary of the Web Crypto API represents a cryptographic key.
8
+ * Available only in secure contexts.
9
+ */
10
+ interface CryptoKey {
11
+ readonly algorithm: KeyAlgorithm;
12
+ readonly extractable: boolean;
13
+ readonly type: KeyType;
14
+ readonly usages: KeyUsage[];
15
+ }
16
+ interface CryptoKeyPair {
17
+ privateKey: CryptoKey;
18
+ publicKey: CryptoKey;
19
+ }
20
+ export declare function generateKeyPair(modulusLength?: 1024 | 2048 | 3072 | 4096): Promise<CryptoKeyPair>;
21
+ export declare function generatePrivateKey(modulusLength?: 1024 | 2048 | 3072 | 4096): Promise<CryptoKey>;
22
+ export declare function privateKeyToPEM(privateKey: CryptoKey): Promise<{
23
+ privPem: string;
24
+ privDer: ArrayBuffer;
25
+ }>;
26
+ export declare function derToPrivateKey(privDer: ArrayBuffer): Promise<CryptoKey>;
27
+ export declare function pemToPrivateKey(pem: string): Promise<CryptoKey>;
28
+ export {};
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.pemToPrivateKey = exports.derToPrivateKey = exports.privateKeyToPEM = exports.generatePrivateKey = exports.generateKeyPair = void 0;
13
+ const x509 = require("@peculiar/x509");
14
+ const webcrypto_1 = require("@peculiar/webcrypto");
15
+ const crypto = new webcrypto_1.Crypto();
16
+ x509.cryptoProvider.set(crypto);
17
+ // ---------------------------------------------------------
18
+ function generateKeyPair(modulusLength = 2048) {
19
+ return __awaiter(this, void 0, void 0, function* () {
20
+ const alg = {
21
+ name: "RSASSA-PKCS1-v1_5",
22
+ hash: { name: "SHA-256" },
23
+ publicExponent: new Uint8Array([1, 0, 1]),
24
+ modulusLength,
25
+ };
26
+ const keys = yield crypto.subtle.generateKey(alg, true, ["sign", "verify"]);
27
+ return keys;
28
+ });
29
+ }
30
+ exports.generateKeyPair = generateKeyPair;
31
+ function generatePrivateKey(modulusLength = 2048) {
32
+ return __awaiter(this, void 0, void 0, function* () {
33
+ return (yield generateKeyPair(modulusLength)).privateKey;
34
+ });
35
+ }
36
+ exports.generatePrivateKey = generatePrivateKey;
37
+ function privateKeyToPEM(privateKey) {
38
+ return __awaiter(this, void 0, void 0, function* () {
39
+ const privDer = yield crypto.subtle.exportKey("pkcs8", privateKey);
40
+ const privPem = x509.PemConverter.encode(privDer, "PRIVATE KEY");
41
+ return { privPem, privDer };
42
+ });
43
+ }
44
+ exports.privateKeyToPEM = privateKeyToPEM;
45
+ function derToPrivateKey(privDer) {
46
+ return __awaiter(this, void 0, void 0, function* () {
47
+ return yield crypto.subtle.importKey("pkcs8", privDer, {
48
+ name: "RSASSA-PKCS1-v1_5",
49
+ hash: { name: "SHA-256" },
50
+ }, true, ["sign", "encrypt", "decrypt", "verify", "wrapKey", "unwrapKey", "deriveKey", "deriveBits"]);
51
+ });
52
+ }
53
+ exports.derToPrivateKey = derToPrivateKey;
54
+ function pemToPrivateKey(pem) {
55
+ return __awaiter(this, void 0, void 0, function* () {
56
+ // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/importKey
57
+ const privDer = x509.PemConverter.decode(pem);
58
+ return derToPrivateKey(privDer[0]);
59
+ });
60
+ }
61
+ exports.pemToPrivateKey = pemToPrivateKey;
62
+ //# sourceMappingURL=create_key_pair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create_key_pair.js","sourceRoot":"","sources":["../../../source/x509/create_key_pair.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,uCAAuC;AACvC,mDAA6C;AAC7C,MAAM,MAAM,GAAG,IAAI,kBAAM,EAAE,CAAC;AAC5B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAyBhC,4DAA4D;AAE5D,SAAsB,eAAe,CAAC,gBAA2C,IAAI;;QACjF,MAAM,GAAG,GAA0B;YAC/B,IAAI,EAAE,mBAAmB;YACzB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YACzB,cAAc,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACzC,aAAa;SAChB,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;QAE5E,OAAO,IAAI,CAAC;IAChB,CAAC;CAAA;AAVD,0CAUC;AAED,SAAsB,kBAAkB,CAAC,gBAA2C,IAAI;;QACpF,OAAO,CAAC,MAAM,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC;IAC7D,CAAC;CAAA;AAFD,gDAEC;AAED,SAAsB,eAAe,CAAC,UAAqB;;QACvD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACjE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAChC,CAAC;CAAA;AAJD,0CAIC;AAED,SAAsB,eAAe,CAAC,OAAoB;;QACtD,OAAO,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAChC,OAAO,EACP,OAAO,EACP;YACI,IAAI,EAAE,mBAAmB;YACzB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;SAC5B,EACD,IAAI,EACJ,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAC9F,CAAC;IACN,CAAC;CAAA;AAXD,0CAWC;AAED,SAAsB,eAAe,CAAC,GAAW;;QAC7C,0EAA0E;QAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9C,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;CAAA;AAJD,0CAIC"}
@@ -0,0 +1,17 @@
1
+ import { CertificatePurpose } from "../common";
2
+ import { x509 } from "./_crypto";
3
+ export interface CreateSelfSignCertificateOptions {
4
+ privateKey: CryptoKey;
5
+ notBefore?: Date;
6
+ notAfter?: Date;
7
+ validity?: number;
8
+ subject?: string;
9
+ dns?: string[];
10
+ ip?: string[];
11
+ applicationUri?: string;
12
+ purpose: CertificatePurpose;
13
+ }
14
+ export declare function createSelfSignedCertificate({ privateKey, notAfter, notBefore, validity, subject, dns, ip, applicationUri, purpose, }: CreateSelfSignCertificateOptions): Promise<{
15
+ cert: string;
16
+ der: x509.X509Certificate;
17
+ }>;
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.createSelfSignedCertificate = void 0;
13
+ const subject_1 = require("../subject");
14
+ const _crypto_1 = require("./_crypto");
15
+ const _get_attributes_1 = require("./_get_attributes");
16
+ const _build_public_key_1 = require("./_build_public_key");
17
+ function createSelfSignedCertificate({ privateKey, notAfter, notBefore, validity, subject, dns, ip, applicationUri, purpose, }) {
18
+ return __awaiter(this, void 0, void 0, function* () {
19
+ const publicKey = yield (0, _build_public_key_1.buildPublicKey)(privateKey);
20
+ const keys = {
21
+ privateKey,
22
+ publicKey,
23
+ };
24
+ const { nsComment, basicConstraints, keyUsageExtension, usages } = (0, _get_attributes_1.getAttributes)(purpose);
25
+ notBefore = notBefore || new Date();
26
+ validity = validity || 0;
27
+ if (!notAfter) {
28
+ validity = validity || 365;
29
+ }
30
+ notAfter = notAfter || new Date(notBefore.getTime() + validity * 24 * 60 * 60 * 1000);
31
+ const alternativeNameExtensions = [];
32
+ dns && dns.forEach((d) => alternativeNameExtensions.push({ type: "dns", value: d }));
33
+ ip && ip.forEach((d) => alternativeNameExtensions.push({ type: "ip", value: d }));
34
+ applicationUri && alternativeNameExtensions.push({ type: "url", value: applicationUri });
35
+ // https://opensource.apple.com/source/OpenSSH/OpenSSH-186/osslshim/heimdal-asn1/rfc2459.asn1.auto.html
36
+ const ID_NETSCAPE_COMMENT = "2.16.840.1.113730.1.13";
37
+ const s = new subject_1.Subject(subject || "");
38
+ const s1 = s.toStringInternal(", ");
39
+ const name = s1;
40
+ // const issuer = s1;
41
+ /**
42
+ * name: "CN=Test, O=Дом",
43
+ * subject: "CN=Test, O=Дом",
44
+ * issuer: "CN=Test, O=Дом",
45
+
46
+ */
47
+ // const gg = new x509.GeneralNames(gga);
48
+ const cert = yield _crypto_1.x509.X509CertificateGenerator.createSelfSigned({
49
+ serialNumber: "01",
50
+ name,
51
+ // subject: s1,
52
+ // issuer,
53
+ notBefore,
54
+ notAfter,
55
+ signingAlgorithm: { name: "RSASSA-PKCS1-v1_5", hash: { name: "SHA-256" } },
56
+ keys,
57
+ extensions: [
58
+ new _crypto_1.x509.Extension(ID_NETSCAPE_COMMENT, false, Buffer.from(nsComment, "ascii")),
59
+ // new x509.BasicConstraintsExtension(true, 2, true),
60
+ basicConstraints,
61
+ new _crypto_1.x509.ExtendedKeyUsageExtension(keyUsageExtension, true),
62
+ new _crypto_1.x509.KeyUsagesExtension(usages, true),
63
+ yield _crypto_1.x509.SubjectKeyIdentifierExtension.create(keys.publicKey),
64
+ new _crypto_1.x509.SubjectAlternativeNameExtension(alternativeNameExtensions),
65
+ ],
66
+ });
67
+ return { cert: cert.toString("pem"), der: cert };
68
+ });
69
+ }
70
+ exports.createSelfSignedCertificate = createSelfSignedCertificate;
71
+ //# sourceMappingURL=create_self_signed_certificate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create_self_signed_certificate.js","sourceRoot":"","sources":["../../../source/x509/create_self_signed_certificate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function generatePrivateKeyFile(privateKeyFilename: string, modulusLength: 1024 | 2048 | 3072 | 4096): Promise<void>;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.generatePrivateKeyFile = void 0;
13
+ const fs = require("fs");
14
+ const source_1 = require("../source");
15
+ function generatePrivateKeyFile(privateKeyFilename, modulusLength) {
16
+ return __awaiter(this, void 0, void 0, function* () {
17
+ const keys = yield (0, source_1.generateKeyPair)(modulusLength);
18
+ const privateKeyPem = yield (0, source_1.privateKeyToPEM)(keys.privateKey);
19
+ yield fs.promises.writeFile(privateKeyFilename, privateKeyPem.privPem);
20
+ privateKeyPem.privPem = "";
21
+ privateKeyPem.privDer = new Uint8Array(0);
22
+ });
23
+ }
24
+ exports.generatePrivateKeyFile = generatePrivateKeyFile;
25
+ //# sourceMappingURL=generate_private_key_filename.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate_private_key_filename.js","sourceRoot":"","sources":["../../source_nodejs/generate_private_key_filename.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yBAAyB;AACzB,sCAA6D;AAE7D,SAAsB,sBAAsB,CAAC,kBAA0B,EAAE,aAAqC;;QAC1G,MAAM,IAAI,GAAG,MAAM,IAAA,wBAAe,EAAC,aAAa,CAAC,CAAC;QAClD,MAAM,aAAa,GAAG,MAAM,IAAA,wBAAe,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7D,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,kBAAkB,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;QACvE,aAAa,CAAC,OAAO,GAAG,EAAE,CAAC;QAC3B,aAAa,CAAC,OAAO,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;CAAA;AAND,wDAMC"}
@@ -1,3 +1,4 @@
1
1
  export * from "./read";
2
2
  export * from "./read_certificate_revocation_list";
3
3
  export * from "./read_certificate_signing_request";
4
+ export * from "./generate_private_key_filename";
@@ -17,4 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./read"), exports);
18
18
  __exportStar(require("./read_certificate_revocation_list"), exports);
19
19
  __exportStar(require("./read_certificate_signing_request"), exports);
20
+ __exportStar(require("./generate_private_key_filename"), exports);
20
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../source_nodejs/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,qEAAmD;AACnD,qEAAmD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../source_nodejs/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,qEAAmD;AACnD,qEAAmD;AACnD,kEAAgD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-opcua-crypto",
3
- "version": "2.2.0",
3
+ "version": "3.0.0-beta.0",
4
4
  "description": "Crypto tools for Node-OPCUA",
5
5
  "main": "./index.js",
6
6
  "types": "./index.d.ts",
@@ -27,11 +27,14 @@
27
27
  ],
28
28
  "author": "Etienne Rossignon",
29
29
  "license": "MIT",
30
+ "engine": {
31
+ "node": ">15.0"
32
+ },
30
33
  "devDependencies": {
31
34
  "@types/mocha": "^10.0.1",
32
- "@types/node": "^20.1.0",
33
- "@typescript-eslint/eslint-plugin": "^5.59.2",
34
- "@typescript-eslint/parser": "^5.59.2",
35
+ "@types/node": "^20.1.4",
36
+ "@typescript-eslint/eslint-plugin": "^5.59.5",
37
+ "@typescript-eslint/parser": "^5.59.5",
35
38
  "eslint": "^8.40.0",
36
39
  "eslint-config-prettier": "^8.8.0",
37
40
  "eslint-plugin-prettier": "^4.2.1",
@@ -45,6 +48,9 @@
45
48
  "typescript": "^5.0.4"
46
49
  },
47
50
  "dependencies": {
51
+ "@peculiar/webcrypto": "^1.4.3",
52
+ "@peculiar/x509": "^1.9.3",
53
+ "@types/jsrsasign": "^10.5.8",
48
54
  "better-assert": "^1.0.2",
49
55
  "chalk": "^4.1.2",
50
56
  "hexy": "0.3.4",
package/source/asn1.ts CHANGED
@@ -192,7 +192,7 @@ function parseOID(buffer: Buffer, start: number, end: number): string {
192
192
 
193
193
  export function _readObjectIdentifier(buffer: Buffer, block: BlockInfo): { oid: string; name: string } {
194
194
  assert(block.tag === TagType.OBJECT_IDENTIFIER);
195
- const b = buffer.slice(block.position, block.position + block.length);
195
+ const b = buffer.subarray(block.position, block.position + block.length);
196
196
  const oid = parseOID(b, 0, block.length);
197
197
  return {
198
198
  oid,
package/source/common.ts CHANGED
@@ -13,3 +13,10 @@ export type PublicKeyPEM = PEM;
13
13
 
14
14
  export type Signature = Buffer;
15
15
  export type CertificateRevocationList = Buffer;
16
+
17
+ export enum CertificatePurpose {
18
+ NotSpecified = 0,
19
+ ForCertificateAuthority = 1,
20
+ ForApplication = 2,
21
+ ForUserAuthentication = 3, // X509
22
+ }
@@ -35,8 +35,7 @@ const doDebug = !!process.env.DEBUG;
35
35
  }
36
36
  */
37
37
  export function explorePrivateKey(privateKey1: PrivateKey): PrivateKeyInternals {
38
- const privateKey = privateKey1.export({ format: "der", type: "pkcs1" }) as Buffer;
39
- assert(privateKey instanceof Buffer);
38
+ const privateKey = privateKey1.export({ format: "der", type: "pkcs1" });
40
39
  const block_info = readTag(privateKey, 0);
41
40
  const blocks = _readStruct(privateKey, block_info);
42
41