node-opcua-pki 6.22.1 → 7.0.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 (137) hide show
  1. package/bin/install_prerequisite.ts +1 -1
  2. package/bin/pki.ts +1 -1
  3. package/dist/bin/install_prerequisite.d.ts +2 -0
  4. package/dist/bin/install_prerequisite.js +6 -0
  5. package/dist/bin/install_prerequisite.js.map +1 -0
  6. package/dist/bin/pki.d.ts +2 -0
  7. package/dist/bin/pki.js +4 -0
  8. package/dist/bin/pki.js.map +1 -0
  9. package/dist/lib/ca/backends/native_ca_backend.d.ts +49 -0
  10. package/dist/lib/ca/backends/native_ca_backend.js +365 -0
  11. package/dist/lib/ca/backends/native_ca_backend.js.map +1 -0
  12. package/dist/lib/ca/backends/openssl_ca_backend.d.ts +47 -0
  13. package/dist/lib/ca/backends/openssl_ca_backend.js +398 -0
  14. package/dist/lib/ca/backends/openssl_ca_backend.js.map +1 -0
  15. package/dist/lib/ca/certificate_authority.d.ts +62 -0
  16. package/dist/lib/ca/certificate_authority.js +91 -0
  17. package/dist/lib/ca/certificate_authority.js.map +1 -0
  18. package/dist/lib/ca/core/ca_backend.d.ts +89 -0
  19. package/dist/lib/ca/core/ca_backend.js +24 -0
  20. package/dist/lib/ca/core/ca_backend.js.map +1 -0
  21. package/dist/lib/ca/core/ca_database.d.ts +91 -0
  22. package/dist/lib/ca/core/ca_database.js +267 -0
  23. package/dist/lib/ca/core/ca_database.js.map +1 -0
  24. package/dist/{core-BwqSJPHc.d.mts → lib/ca/core/certificate_authority_core.d.ts} +45 -394
  25. package/dist/lib/ca/core/certificate_authority_core.js +1300 -0
  26. package/dist/lib/ca/core/certificate_authority_core.js.map +1 -0
  27. package/dist/lib/ca/core/index.d.ts +17 -0
  28. package/dist/lib/ca/core/index.js +25 -0
  29. package/dist/lib/ca/core/index.js.map +1 -0
  30. package/dist/lib/ca/crypto_create_CA.d.ts +1 -0
  31. package/dist/lib/ca/crypto_create_CA.js +821 -0
  32. package/dist/lib/ca/crypto_create_CA.js.map +1 -0
  33. package/dist/lib/ca/index.d.ts +1 -0
  34. package/dist/lib/ca/index.js +2 -0
  35. package/dist/lib/ca/index.js.map +1 -0
  36. package/dist/lib/ca/templates/ca_config_template.cnf.d.ts +2 -0
  37. package/dist/lib/ca/templates/ca_config_template.cnf.js +170 -0
  38. package/dist/lib/ca/templates/ca_config_template.cnf.js.map +1 -0
  39. package/dist/lib/core.d.ts +33 -0
  40. package/dist/lib/core.js +56 -0
  41. package/dist/lib/core.js.map +1 -0
  42. package/dist/lib/index.d.ts +11 -0
  43. package/dist/lib/index.js +37 -0
  44. package/dist/lib/index.js.map +1 -0
  45. package/dist/lib/misc/applicationurn.d.ts +1 -0
  46. package/dist/lib/misc/applicationurn.js +40 -0
  47. package/dist/lib/misc/applicationurn.js.map +1 -0
  48. package/dist/lib/misc/hostname.d.ts +8 -0
  49. package/dist/lib/misc/hostname.js +82 -0
  50. package/dist/lib/misc/hostname.js.map +1 -0
  51. package/dist/lib/misc/subject.d.ts +2 -0
  52. package/dist/lib/misc/subject.js +2 -0
  53. package/dist/lib/misc/subject.js.map +1 -0
  54. package/dist/{index.d.ts → lib/pki/certificate_manager.d.ts} +24 -248
  55. package/dist/lib/pki/certificate_manager.js +2302 -0
  56. package/dist/lib/pki/certificate_manager.js.map +1 -0
  57. package/dist/lib/pki/templates/simple_config_template.cnf.d.ts +2 -0
  58. package/dist/lib/pki/templates/simple_config_template.cnf.js +74 -0
  59. package/dist/lib/pki/templates/simple_config_template.cnf.js.map +1 -0
  60. package/dist/lib/pki/toolbox_pfx.d.ts +127 -0
  61. package/dist/lib/pki/toolbox_pfx.js +248 -0
  62. package/dist/lib/pki/toolbox_pfx.js.map +1 -0
  63. package/dist/lib/toolbox/common.d.ts +150 -0
  64. package/dist/lib/toolbox/common.js +82 -0
  65. package/dist/lib/toolbox/common.js.map +1 -0
  66. package/dist/lib/toolbox/common2.d.ts +25 -0
  67. package/dist/lib/toolbox/common2.js +97 -0
  68. package/dist/lib/toolbox/common2.js.map +1 -0
  69. package/dist/lib/toolbox/config.d.ts +5 -0
  70. package/dist/lib/toolbox/config.js +28 -0
  71. package/dist/lib/toolbox/config.js.map +1 -0
  72. package/dist/lib/toolbox/debug.d.ts +5 -0
  73. package/dist/lib/toolbox/debug.js +35 -0
  74. package/dist/lib/toolbox/debug.js.map +1 -0
  75. package/dist/lib/toolbox/display.d.ts +4 -0
  76. package/dist/lib/toolbox/display.js +56 -0
  77. package/dist/lib/toolbox/display.js.map +1 -0
  78. package/dist/lib/toolbox/index.d.ts +5 -0
  79. package/dist/lib/toolbox/index.js +28 -0
  80. package/dist/lib/toolbox/index.js.map +1 -0
  81. package/dist/lib/toolbox/with_openssl/_create_random_file.d.ts +4 -0
  82. package/dist/lib/toolbox/with_openssl/_create_random_file.js +50 -0
  83. package/dist/lib/toolbox/with_openssl/_create_random_file.js.map +1 -0
  84. package/dist/lib/toolbox/with_openssl/_env.d.ts +58 -0
  85. package/dist/lib/toolbox/with_openssl/_env.js +126 -0
  86. package/dist/lib/toolbox/with_openssl/_env.js.map +1 -0
  87. package/dist/lib/toolbox/with_openssl/create_certificate_signing_request.d.ts +5 -0
  88. package/dist/lib/toolbox/with_openssl/create_certificate_signing_request.js +72 -0
  89. package/dist/lib/toolbox/with_openssl/create_certificate_signing_request.js.map +1 -0
  90. package/dist/lib/toolbox/with_openssl/create_private_key.d.ts +5 -0
  91. package/dist/lib/toolbox/with_openssl/create_private_key.js +92 -0
  92. package/dist/lib/toolbox/with_openssl/create_private_key.js.map +1 -0
  93. package/dist/lib/toolbox/with_openssl/create_self_signed_certificate.d.ts +5 -0
  94. package/dist/lib/toolbox/with_openssl/create_self_signed_certificate.js +135 -0
  95. package/dist/lib/toolbox/with_openssl/create_self_signed_certificate.js.map +1 -0
  96. package/dist/lib/toolbox/with_openssl/execute_openssl.d.ts +67 -0
  97. package/dist/lib/toolbox/with_openssl/execute_openssl.js +246 -0
  98. package/dist/lib/toolbox/with_openssl/execute_openssl.js.map +1 -0
  99. package/dist/lib/toolbox/with_openssl/index.d.ts +5 -0
  100. package/dist/lib/toolbox/with_openssl/index.js +30 -0
  101. package/dist/lib/toolbox/with_openssl/index.js.map +1 -0
  102. package/dist/lib/toolbox/with_openssl/install_prerequisite.d.ts +7 -0
  103. package/dist/lib/toolbox/with_openssl/install_prerequisite.js +358 -0
  104. package/dist/lib/toolbox/with_openssl/install_prerequisite.js.map +1 -0
  105. package/dist/lib/toolbox/with_openssl/toolbox.d.ts +53 -0
  106. package/dist/lib/toolbox/with_openssl/toolbox.js +190 -0
  107. package/dist/lib/toolbox/with_openssl/toolbox.js.map +1 -0
  108. package/dist/lib/toolbox/without_openssl/create_certificate_signing_request.d.ts +5 -0
  109. package/dist/lib/toolbox/without_openssl/create_certificate_signing_request.js +69 -0
  110. package/dist/lib/toolbox/without_openssl/create_certificate_signing_request.js.map +1 -0
  111. package/dist/lib/toolbox/without_openssl/create_self_signed_certificate.d.ts +3 -0
  112. package/dist/lib/toolbox/without_openssl/create_self_signed_certificate.js +78 -0
  113. package/dist/lib/toolbox/without_openssl/create_self_signed_certificate.js.map +1 -0
  114. package/dist/lib/toolbox/without_openssl/index.d.ts +2 -0
  115. package/dist/lib/toolbox/without_openssl/index.js +25 -0
  116. package/dist/lib/toolbox/without_openssl/index.js.map +1 -0
  117. package/package.json +11 -30
  118. package/dist/bin/install_prerequisite.mjs +0 -18
  119. package/dist/bin/install_prerequisite.mjs.map +0 -1
  120. package/dist/bin/pki.mjs +0 -5932
  121. package/dist/bin/pki.mjs.map +0 -1
  122. package/dist/chunk-EQ4DGI4M.mjs +0 -1917
  123. package/dist/chunk-EQ4DGI4M.mjs.map +0 -1
  124. package/dist/chunk-GCHH54PS.mjs +0 -30
  125. package/dist/chunk-GCHH54PS.mjs.map +0 -1
  126. package/dist/core-BwqSJPHc.d.ts +0 -1041
  127. package/dist/core.d.mts +0 -2
  128. package/dist/core.d.ts +0 -2
  129. package/dist/core.js +0 -1902
  130. package/dist/core.js.map +0 -1
  131. package/dist/core.mjs +0 -21
  132. package/dist/core.mjs.map +0 -1
  133. package/dist/index.d.mts +0 -1003
  134. package/dist/index.js +0 -5009
  135. package/dist/index.js.map +0 -1
  136. package/dist/index.mjs +0 -3145
  137. package/dist/index.mjs.map +0 -1
@@ -0,0 +1,246 @@
1
+ // ---------------------------------------------------------------------------------------------------------------------
2
+ // node-opcua-pki
3
+ // ---------------------------------------------------------------------------------------------------------------------
4
+ // Copyright (c) 2014-2026 - Etienne Rossignon - etienne.rossignon (at) gadz.org
5
+ // Copyright (c) 2022-2026 - Sterfive.com
6
+ // ---------------------------------------------------------------------------------------------------------------------
7
+ //
8
+ // This project is licensed under the terms of the MIT license.
9
+ //
10
+ // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
11
+ // documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
12
+ // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
13
+ // permit persons to whom the Software is furnished to do so, subject to the following conditions:
14
+ //
15
+ // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
16
+ // Software.
17
+ //
18
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
19
+ // WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
20
+ // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21
+ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ // ---------------------------------------------------------------------------------------------------------------------
23
+ import assert from "node:assert";
24
+ import child_process from "node:child_process";
25
+ import fs from "node:fs";
26
+ import os from "node:os";
27
+ import byline from "byline";
28
+ import chalk from "chalk";
29
+ import { makePath } from "../common2.js";
30
+ import { g_config } from "../config.js";
31
+ import { debugLog, displayError, doDebug, warningLog } from "../debug.js";
32
+ import { buildChildEnv, redactEnvForLog, setEnv } from "./_env.js";
33
+ import { get_openssl_exec_path } from "./install_prerequisite.js";
34
+ let opensslPath; // not initialized
35
+ const n = makePath;
36
+ // Fixed names for the per-invocation environment variables used to pass
37
+ // passphrases to openssl via `-passin env:NAME` / `-passout env:NAME`
38
+ // instead of placing them in argv (see ExecuteOptions.env for why). Safe to
39
+ // reuse across concurrent calls: each call passes its own `env` object to a
40
+ // distinct child process — nothing here touches process.env, so there is no
41
+ // shared mutable state to race on.
42
+ const PASSIN_ENV_VAR = "NODE_OPCUA_PKI_OPENSSL_PASSIN";
43
+ const PASSOUT_ENV_VAR = "NODE_OPCUA_PKI_OPENSSL_PASSOUT";
44
+ /**
45
+ * `-passin env:...` for a source passphrase (an input key or PFX bundle).
46
+ *
47
+ * Always emit this — with `""` when there is no passphrase — for any command
48
+ * that reads a private key which *might* be encrypted: without a `-passin`,
49
+ * openssl prompts on the controlling terminal for an encrypted key. An empty
50
+ * `-passin` on a plaintext key is a no-op; on an encrypted key it fails fast
51
+ * with `bad decrypt` instead.
52
+ */
53
+ export function passinArg(passphrase = "") {
54
+ return { args: ["-passin", `env:${PASSIN_ENV_VAR}`], env: { [PASSIN_ENV_VAR]: passphrase } };
55
+ }
56
+ /** `-passout env:...` for an output passphrase (a PFX bundle being written). */
57
+ export function passoutArg(passphrase = "") {
58
+ return { args: ["-passout", `env:${PASSOUT_ENV_VAR}`], env: { [PASSOUT_ENV_VAR]: passphrase } };
59
+ }
60
+ /** For logs and error messages only: a shell-like rendering of an argv. Never re-parsed. */
61
+ function renderForDisplay(file, args) {
62
+ return [file, ...args].map((a) => (a === "" || /[\s"'`$\\]/.test(a) ? JSON.stringify(a) : a)).join(" ");
63
+ }
64
+ /**
65
+ * True when a string carries a character we should not hand to the openssl
66
+ * child. Two kinds are rejected:
67
+ *
68
+ * - ASCII control characters, which have no place in an option or a path; and
69
+ * - any *non-ASCII* punctuation, symbol, separator or format character.
70
+ *
71
+ * The second kind matters on Windows: a spawned program rebuilds its argument
72
+ * list from the command line through the active ANSI code page, and that
73
+ * conversion can "best-fit" a look-alike character onto a plain ASCII one — a
74
+ * full-width quotation mark onto `"`, a non-breaking space onto a space, and so
75
+ * on — which would change where one argument ends and the next begins. Every
76
+ * option and path this library passes to openssl is plain ASCII, so refusing
77
+ * these characters costs nothing in normal use.
78
+ *
79
+ * Non-ASCII *letters, digits and combining marks* are deliberately allowed, so
80
+ * a PKI folder living under an accented or non-Latin user profile (for example
81
+ * `C:\\Users\\José\\pki`) keeps working.
82
+ */
83
+ function hasUnsafeArgChar(value) {
84
+ for (const ch of value) {
85
+ const code = ch.codePointAt(0);
86
+ if (code < 0x20 || code === 0x7f) {
87
+ return true; // ASCII control character
88
+ }
89
+ if (code < 0x80) {
90
+ continue; // ordinary ASCII: options, flags and paths use these
91
+ }
92
+ if (/[\p{L}\p{N}\p{M}]/u.test(ch)) {
93
+ continue; // real text (letters / digits / marks) in a configured path
94
+ }
95
+ return true; // non-ASCII punctuation, symbol, separator or format char
96
+ }
97
+ return false;
98
+ }
99
+ /**
100
+ * Make sure the openssl binary path and every argument are safe to pass to the
101
+ * child process (see {@link hasUnsafeArgChar}). Throws with the offending value
102
+ * rather than letting it reach openssl.
103
+ */
104
+ function checkArgs(file, args) {
105
+ for (const value of [file, ...args]) {
106
+ if (typeof value === "string" && hasUnsafeArgChar(value)) {
107
+ throw new Error(`execute_openssl: refusing argument with an unexpected character: ${JSON.stringify(value)}`);
108
+ }
109
+ }
110
+ }
111
+ /**
112
+ * Run `file` with `args` directly (no shell): each element of `args` reaches
113
+ * the child as one argv entry, so a value can never be reinterpreted as a
114
+ * shell metacharacter, a redirection, or a second command. stdin is
115
+ * `/dev/null`: OpenSSL's app UI opens the console before honouring
116
+ * `-passin` and calls tcgetattr on stdin when there is no controlling TTY;
117
+ * a socket (Node's default child stdin) yields ENOTTY on Linux but
118
+ * EOPNOTSUPP on macOS, which OpenSSL rejects and the key load fails even
119
+ * with the right passphrase; /dev/null yields ENOTTY everywhere. It also
120
+ * removes any way for openssl to block reading a password from stdin.
121
+ */
122
+ export async function execute(file, args, options) {
123
+ const from = new Error();
124
+ checkArgs(file, args);
125
+ options.cwd = options.cwd || process.cwd();
126
+ // istanbul ignore next
127
+ if (!g_config.silent) {
128
+ warningLog(chalk.cyan(" CWD "), options.cwd);
129
+ }
130
+ const outputs = [];
131
+ const errorOutputs = [];
132
+ const display = renderForDisplay(file, args);
133
+ return await new Promise((resolve, reject) => {
134
+ const child = child_process.spawn(file, [...args], {
135
+ cwd: options.cwd,
136
+ windowsHide: true,
137
+ env: buildChildEnv(options.env),
138
+ stdio: ["ignore", "pipe", "pipe"]
139
+ });
140
+ const fail = (message) => {
141
+ // istanbul ignore next
142
+ // The banner duplicates what the rejection already carries, and
143
+ // this is the one place in this module that ignored the library's
144
+ // own (default-on) silence. Callers that let the error propagate
145
+ // still get the full command and stderr from the Error itself;
146
+ // set VERBOSE to see it as it happens.
147
+ if (!options.hideErrorMessage && !g_config.silent) {
148
+ const fence = "###########################################";
149
+ console.error(chalk.bgWhiteBright.redBright(`${fence} OPENSSL ERROR ${fence}`));
150
+ console.error(chalk.bgWhiteBright.redBright(`CWD = ${options.cwd}`));
151
+ console.error(chalk.bgWhiteBright.redBright(message));
152
+ console.error(chalk.bgWhiteBright.redBright(`${fence} OPENSSL ERROR ${fence}`));
153
+ console.error(from.stack);
154
+ }
155
+ reject(new Error(message));
156
+ };
157
+ child.on("error", (err) => fail(`Command failed: ${display}\n${err.message}`));
158
+ child.on("close", (code, signal) => {
159
+ if (code === 0) {
160
+ resolve(outputs.join(""));
161
+ return;
162
+ }
163
+ const why = signal ? `signal ${signal}` : `exit code ${code}`;
164
+ fail(`Command failed: ${display}\n${errorOutputs.join("")}(${why})`);
165
+ });
166
+ if (child.stdout) {
167
+ const stream2 = byline(child.stdout);
168
+ stream2.on("data", (line) => {
169
+ outputs.push(`${line}\n`);
170
+ });
171
+ if (!g_config.silent) {
172
+ stream2.on("data", (line) => {
173
+ line = line.toString();
174
+ if (doDebug) {
175
+ process.stdout.write(`${chalk.white(" stdout ") + chalk.whiteBright(line)}\n`);
176
+ }
177
+ });
178
+ }
179
+ }
180
+ if (child.stderr) {
181
+ const stream1 = byline(child.stderr);
182
+ stream1.on("data", (line) => {
183
+ line = line.toString();
184
+ errorOutputs.push(`${line}\n`);
185
+ // istanbul ignore next
186
+ if (!g_config.silent && displayError) {
187
+ process.stdout.write(`${chalk.white(" stderr ") + chalk.red(line)}\n`);
188
+ }
189
+ });
190
+ }
191
+ });
192
+ }
193
+ export async function find_openssl() {
194
+ return await get_openssl_exec_path();
195
+ }
196
+ export async function ensure_openssl_installed() {
197
+ if (!opensslPath) {
198
+ opensslPath = await find_openssl();
199
+ const outputs = await execute_openssl(["version"], { cwd: "." });
200
+ g_config.opensslVersion = outputs.trim();
201
+ if (doDebug) {
202
+ warningLog("OpenSSL version : ", g_config.opensslVersion);
203
+ }
204
+ }
205
+ }
206
+ export async function executeOpensslAsync(args, options) {
207
+ return await execute_openssl(args, options);
208
+ }
209
+ export async function execute_openssl_no_failure(args, options) {
210
+ options = options || {};
211
+ options.hideErrorMessage = true;
212
+ try {
213
+ return await execute_openssl(args, options);
214
+ }
215
+ catch (err) {
216
+ debugLog(" (ignored error = ERROR : )", err.message);
217
+ }
218
+ }
219
+ function getTempFolder() {
220
+ return os.tmpdir();
221
+ }
222
+ /**
223
+ * Run `openssl` with `args` (see {@link OpensslArgs}): no shell, one argv
224
+ * entry per element, curated environment, /dev/null stdin.
225
+ */
226
+ export async function execute_openssl(args, options) {
227
+ // never log `options` as-is: `options.env` may carry a passphrase
228
+ debugLog("execute_openssl", args, redactEnvForLog(options));
229
+ const empty_config_file = n(getTempFolder(), "empty_config.cnf");
230
+ if (!fs.existsSync(empty_config_file)) {
231
+ await fs.promises.writeFile(empty_config_file, "# empty config file");
232
+ }
233
+ options = options || {};
234
+ options.openssl_conf = options.openssl_conf || empty_config_file; // "!! OPEN SLL CONF NOT DEFINED BAD FILE !!";
235
+ assert(options.openssl_conf);
236
+ setEnv("OPENSSL_CONF", options.openssl_conf);
237
+ // istanbul ignore next
238
+ if (!g_config.silent) {
239
+ warningLog(chalk.cyan(" OPENSSL_CONF"), process.env.OPENSSL_CONF);
240
+ warningLog(chalk.cyan(" RANDFILE "), process.env.RANDFILE);
241
+ warningLog(chalk.cyan(" CMD "), chalk.cyanBright(renderForDisplay("openssl", args)));
242
+ }
243
+ await ensure_openssl_installed();
244
+ return await execute(opensslPath, args, options);
245
+ }
246
+ //# sourceMappingURL=execute_openssl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute_openssl.js","sourceRoot":"","sources":["../../../../lib/toolbox/with_openssl/execute_openssl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from "./_env.js";
2
+ export * from "./create_certificate_signing_request.js";
3
+ export * from "./execute_openssl.js";
4
+ export * from "./install_prerequisite.js";
5
+ export * from "./toolbox.js";
@@ -0,0 +1,30 @@
1
+ // ---------------------------------------------------------------------------------------------------------------------
2
+ // node-opcua-pki
3
+ // ---------------------------------------------------------------------------------------------------------------------
4
+ // Copyright (c) 2014-2026 - Etienne Rossignon - etienne.rossignon (at) gadz.org
5
+ // Copyright (c) 2022-2026 - Sterfive.com
6
+ // ---------------------------------------------------------------------------------------------------------------------
7
+ //
8
+ // This project is licensed under the terms of the MIT license.
9
+ //
10
+ // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
11
+ // documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
12
+ // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
13
+ // permit persons to whom the Software is furnished to do so, subject to the following conditions:
14
+ //
15
+ // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
16
+ // Software.
17
+ //
18
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
19
+ // WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
20
+ // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21
+ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ // ---------------------------------------------------------------------------------------------------------------------
23
+ import exp from "node:constants";
24
+ const _exp = exp;
25
+ export * from "./_env.js";
26
+ export * from "./create_certificate_signing_request.js";
27
+ export * from "./execute_openssl.js";
28
+ export * from "./install_prerequisite.js";
29
+ export * from "./toolbox.js";
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/toolbox/with_openssl/index.ts"],"names":[],"mappings":"AAAA,wHAAwH;AACxH,iBAAiB;AACjB,wHAAwH;AACxH,gFAAgF;AAChF,yCAAyC;AACzC,wHAAwH;AACxH,EAAE;AACF,gEAAgE;AAChE,EAAE;AACF,+GAA+G;AAC/G,sHAAsH;AACtH,kHAAkH;AAClH,mGAAmG;AACnG,EAAE;AACF,uHAAuH;AACvH,YAAY;AACZ,EAAE;AACF,uHAAuH;AACvH,wHAAwH;AACxH,mHAAmH;AACnH,mHAAmH;AACnH,wHAAwH;AACxH,OAAO,GAAG,MAAM,gBAAgB,CAAC;AAEjC,MAAM,IAAI,GAAG,GAAG,CAAC;AAEjB,cAAc,WAAW,CAAC;AAC1B,cAAc,yCAAyC,CAAC;AACxD,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,cAAc,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function check_system_openssl_version(): Promise<string>;
2
+ /**
3
+ *
4
+ * return path to the openssl executable
5
+ */
6
+ export declare function install_prerequisite(): Promise<string>;
7
+ export declare function get_openssl_exec_path(): Promise<string>;
@@ -0,0 +1,358 @@
1
+ // ---------------------------------------------------------------------------------------------------------------------
2
+ // node-opcua-pki
3
+ // ---------------------------------------------------------------------------------------------------------------------
4
+ // Copyright (c) 2014-2026 - Etienne Rossignon - etienne.rossignon (at) gadz.org
5
+ // Copyright (c) 2022-2026 - Sterfive.com
6
+ // ---------------------------------------------------------------------------------------------------------------------
7
+ //
8
+ // This project is licensed under the terms of the MIT license.
9
+ //
10
+ // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
11
+ // documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
12
+ // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
13
+ // permit persons to whom the Software is furnished to do so, subject to the following conditions:
14
+ //
15
+ // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
16
+ // Software.
17
+ //
18
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
19
+ // WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
20
+ // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21
+ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ // ---------------------------------------------------------------------------------------------------------------------
23
+ import child_process from "node:child_process";
24
+ import fs from "node:fs";
25
+ import os from "node:os";
26
+ import path from "node:path";
27
+ import { pipeline } from "node:stream/promises";
28
+ import byline from "byline";
29
+ import chalk from "chalk";
30
+ import yauzl from "yauzl";
31
+ import { warningLog } from "../debug.js";
32
+ import { buildChildEnv } from "./_env.js";
33
+ const doDebug = process.env.NODEOPCUAPKIDEBUG || false;
34
+ /**
35
+ * Run `file` with `args` directly (no shell), same as execute_openssl's
36
+ * `execute()`: the same curated environment (a binary discovered with the
37
+ * full parent env but run with a reduced one could otherwise be found here
38
+ * and then fail to load its libraries later), and /dev/null stdin.
39
+ * Resolves with the exit code rather than rejecting on a non-zero exit;
40
+ * rejects only when the process cannot be spawned at all.
41
+ */
42
+ async function execute(file, args, cwd) {
43
+ let output = "";
44
+ return await new Promise((resolve, reject) => {
45
+ const child = child_process.spawn(file, args, {
46
+ cwd,
47
+ windowsHide: true,
48
+ env: buildChildEnv(),
49
+ stdio: ["ignore", "pipe", "pipe"]
50
+ });
51
+ child.on("error", (err) => reject(err));
52
+ child.on("close", (code) => resolve({ exitCode: code ?? 1, output }));
53
+ const stream1 = byline(child.stdout);
54
+ stream1.on("data", (line) => {
55
+ output += `${line}\n`;
56
+ // istanbul ignore next
57
+ if (doDebug) {
58
+ process.stdout.write(` stdout ${chalk.yellow(line)}\n`);
59
+ }
60
+ });
61
+ });
62
+ }
63
+ function is_expected_openssl_version(strVersion) {
64
+ return !!strVersion.match(/OpenSSL \d/);
65
+ }
66
+ async function getopensslExecPath() {
67
+ let result1;
68
+ try {
69
+ result1 = await execute("which", ["openssl"]);
70
+ }
71
+ catch (err) {
72
+ warningLog("warning: ", err.message);
73
+ throw new Error("Cannot find openssl");
74
+ }
75
+ const exitCode = result1?.exitCode;
76
+ const output = result1?.output;
77
+ if (exitCode !== 0) {
78
+ warningLog(chalk.yellow(" it seems that ") + chalk.cyan("openssl") + chalk.yellow(" is not installed on your computer "));
79
+ warningLog(chalk.yellow("Please install it before running this programs"));
80
+ throw new Error("Cannot find openssl");
81
+ }
82
+ const opensslExecPath = output.replace(/\n\r/g, "").trim();
83
+ return opensslExecPath;
84
+ }
85
+ export async function check_system_openssl_version() {
86
+ const opensslExecPath = await getopensslExecPath();
87
+ // istanbul ignore next
88
+ if (doDebug) {
89
+ warningLog(` OpenSSL found in : ${chalk.yellow(opensslExecPath)}`);
90
+ }
91
+ // ------------------------ now verify that openssl version is the correct one
92
+ const result = await execute(opensslExecPath, ["version"]);
93
+ const exitCode = result?.exitCode;
94
+ const output = result?.output;
95
+ const version = output.trim();
96
+ const versionOK = exitCode === 0 && is_expected_openssl_version(version);
97
+ if (!versionOK) {
98
+ let message = chalk.whiteBright("Warning !!!!!!!!!!!! ") +
99
+ "\nyour version of openssl is " +
100
+ version +
101
+ ". It doesn't match the expected version";
102
+ if (process.platform === "darwin") {
103
+ message +=
104
+ chalk.cyan("\nplease refer to :") +
105
+ chalk.yellow(" https://github.com/node-opcua/node-opcua/" + "wiki/installing-node-opcua-or-node-red-on-MacOS");
106
+ }
107
+ console.log(message);
108
+ }
109
+ return output;
110
+ }
111
+ async function install_and_check_win32_openssl_version() {
112
+ const downloadFolder = path.join(os.tmpdir(), ".");
113
+ function get_openssl_folder_win32() {
114
+ if (process.env.LOCALAPPDATA) {
115
+ const userProgramFolder = path.join(process.env.LOCALAPPDATA, "Programs");
116
+ if (fs.existsSync(userProgramFolder)) {
117
+ return path.join(userProgramFolder, "openssl");
118
+ }
119
+ }
120
+ return path.join(process.cwd(), "openssl");
121
+ }
122
+ function get_openssl_exec_path_win32() {
123
+ const opensslFolder = get_openssl_folder_win32();
124
+ return path.join(opensslFolder, "openssl.exe");
125
+ }
126
+ async function check_openssl_win32() {
127
+ const opensslExecPath = get_openssl_exec_path_win32();
128
+ const exists = fs.existsSync(opensslExecPath);
129
+ if (!exists) {
130
+ warningLog("checking presence of ", opensslExecPath);
131
+ warningLog(chalk.red(" cannot find file ") + opensslExecPath);
132
+ return {
133
+ opensslOk: false,
134
+ version: `cannot find file ${opensslExecPath}`
135
+ };
136
+ }
137
+ else {
138
+ const cwd = ".";
139
+ const { exitCode, output } = await execute(opensslExecPath, ["version"], cwd);
140
+ const version = output.trim();
141
+ // istanbul ignore next
142
+ if (doDebug) {
143
+ warningLog(" Version = ", version);
144
+ }
145
+ return {
146
+ opensslOk: exitCode === 0 && is_expected_openssl_version(version),
147
+ version
148
+ };
149
+ }
150
+ }
151
+ /**
152
+ * Try to find a system-installed openssl on Windows via `where`.
153
+ * Returns the path if found and version is acceptable, otherwise undefined.
154
+ */
155
+ async function find_system_openssl_win32() {
156
+ try {
157
+ const result = await execute("where", ["openssl"]);
158
+ if (result.exitCode !== 0) {
159
+ return undefined;
160
+ }
161
+ // `where` may return multiple lines; take the first one
162
+ const opensslPath = result.output.split(/\r?\n/)[0].trim();
163
+ if (!opensslPath || !fs.existsSync(opensslPath)) {
164
+ return undefined;
165
+ }
166
+ // verify version
167
+ const versionResult = await execute(opensslPath, ["version"]);
168
+ const version = versionResult.output.trim();
169
+ if (versionResult.exitCode === 0 && is_expected_openssl_version(version)) {
170
+ warningLog(chalk.green("Using system OpenSSL: ") + chalk.cyan(version) + chalk.green(" at ") + chalk.cyan(opensslPath));
171
+ return opensslPath;
172
+ }
173
+ warningLog(chalk.yellow("System OpenSSL found but version not accepted: ") + version);
174
+ return undefined;
175
+ }
176
+ catch (_err) {
177
+ return undefined;
178
+ }
179
+ }
180
+ /**
181
+ * detect whether windows OS is a 64 bits or 32 bits
182
+ * http://ss64.com/nt/syntax-64bit.html
183
+ * http://blogs.msdn.com/b/david.wang/archive/2006/03/26/howto-detect-process-bitness.aspx
184
+ * @return {number}
185
+ */
186
+ function win32or64() {
187
+ if (process.env.PROCESSOR_ARCHITECTURE === "x86" && process.env.PROCESSOR_ARCHITEW6432) {
188
+ return 64;
189
+ }
190
+ if (process.env.PROCESSOR_ARCHITECTURE === "AMD64") {
191
+ return 64;
192
+ }
193
+ // check if we are running node x32 on a x64 arch
194
+ if (process.env.CURRENT_CPU === "x64") {
195
+ return 64;
196
+ }
197
+ return 32;
198
+ }
199
+ async function download_openssl() {
200
+ const url = win32or64() === 64
201
+ ? "https://github.com/node-opcua/node-opcua-pki/releases/download/2.14.2/openssl-1.0.2u-x64_86-win64.zip"
202
+ : "https://github.com/node-opcua/node-opcua-pki/releases/download/2.14.2/openssl-1.0.2u-i386-win32.zip";
203
+ // the zip file
204
+ const outputFilename = path.join(downloadFolder, path.basename(url));
205
+ warningLog(`downloading ${chalk.yellow(url)} to ${outputFilename}`);
206
+ if (fs.existsSync(outputFilename)) {
207
+ return { downloadedFile: outputFilename };
208
+ }
209
+ const response = await fetch(url, { redirect: "follow" });
210
+ if (!response.ok || !response.body) {
211
+ throw new Error(`Failed to download OpenSSL from ${url}: ${response.status} ${response.statusText}`);
212
+ }
213
+ const contentLength = parseInt(response.headers.get("content-length") || "0", 10);
214
+ let downloaded = 0;
215
+ let lastPercent = -1;
216
+ const fileStream = fs.createWriteStream(outputFilename);
217
+ // Use pipeline for proper backpressure and cleanup
218
+ const body = response.body;
219
+ body.on("data", (chunk) => {
220
+ downloaded += chunk.length;
221
+ if (contentLength > 0) {
222
+ const percent = Math.floor((downloaded / contentLength) * 100);
223
+ if (percent !== lastPercent && percent % 10 === 0) {
224
+ lastPercent = percent;
225
+ warningLog(` download progress: ${percent}%`);
226
+ }
227
+ }
228
+ });
229
+ await pipeline(body, fileStream);
230
+ // Verify the downloaded file exists and has content
231
+ const stat = fs.statSync(outputFilename);
232
+ if (stat.size === 0) {
233
+ fs.unlinkSync(outputFilename);
234
+ throw new Error(`Downloaded file is empty: ${outputFilename}`);
235
+ }
236
+ warningLog(chalk.green("Download complete: ") + `${stat.size} bytes`);
237
+ return { downloadedFile: outputFilename };
238
+ }
239
+ async function unzip_openssl(zipFilename) {
240
+ const opensslFolder = get_openssl_folder_win32();
241
+ const zipFile = await new Promise((resolve, reject) => {
242
+ yauzl.open(zipFilename, { lazyEntries: true }, (err, zipfile) => {
243
+ if (err) {
244
+ reject(err);
245
+ }
246
+ else {
247
+ if (!zipfile) {
248
+ reject(new Error("zipfile is null"));
249
+ }
250
+ else {
251
+ resolve(zipfile);
252
+ }
253
+ }
254
+ });
255
+ });
256
+ zipFile.readEntry();
257
+ await new Promise((resolve, reject) => {
258
+ zipFile.on("end", (err) => {
259
+ setImmediate(() => {
260
+ // istanbul ignore next
261
+ if (doDebug) {
262
+ warningLog("unzip done");
263
+ }
264
+ if (err) {
265
+ reject(err);
266
+ }
267
+ else {
268
+ resolve();
269
+ }
270
+ });
271
+ });
272
+ zipFile.on("entry", (entry) => {
273
+ zipFile.openReadStream(entry, (err, readStream) => {
274
+ if (err) {
275
+ return reject(err);
276
+ }
277
+ const file = path.join(opensslFolder, entry.fileName);
278
+ // istanbul ignore next
279
+ if (doDebug) {
280
+ warningLog(" unzipping :", file);
281
+ }
282
+ const writeStream = fs.createWriteStream(file, "binary");
283
+ // ensure parent directory exists
284
+ readStream?.pipe(writeStream);
285
+ writeStream.on("close", () => {
286
+ zipFile.readEntry();
287
+ });
288
+ });
289
+ });
290
+ });
291
+ }
292
+ // 1. Try system-installed OpenSSL first (e.g. on CI runners)
293
+ const systemOpenssl = await find_system_openssl_win32();
294
+ if (systemOpenssl) {
295
+ return systemOpenssl;
296
+ }
297
+ // 2. Check bundled OpenSSL at the expected local path
298
+ const opensslFolder = get_openssl_folder_win32();
299
+ const opensslExecPath = get_openssl_exec_path_win32();
300
+ if (!fs.existsSync(opensslFolder)) {
301
+ // istanbul ignore next
302
+ if (doDebug) {
303
+ warningLog("creating openssl_folder", opensslFolder);
304
+ }
305
+ fs.mkdirSync(opensslFolder);
306
+ }
307
+ const { opensslOk, version: _version } = await check_openssl_win32();
308
+ if (!opensslOk) {
309
+ // 3. Download as last resort
310
+ warningLog(chalk.yellow("openssl seems to be missing and need to be installed"));
311
+ const { downloadedFile } = await download_openssl();
312
+ // istanbul ignore next
313
+ if (doDebug) {
314
+ warningLog("deflating ", chalk.yellow(downloadedFile));
315
+ }
316
+ await unzip_openssl(downloadedFile);
317
+ const opensslExists = !!fs.existsSync(opensslExecPath);
318
+ // istanbul ignore next
319
+ if (doDebug) {
320
+ warningLog("verifying ", opensslExists, opensslExists ? chalk.green("OK ") : chalk.red(" Error"), opensslExecPath);
321
+ }
322
+ const _opensslExecPath2 = await check_openssl_win32();
323
+ return opensslExecPath;
324
+ }
325
+ else {
326
+ // istanbul ignore next
327
+ if (doDebug) {
328
+ warningLog(chalk.green("openssl is already installed and have the expected version."));
329
+ }
330
+ return opensslExecPath;
331
+ }
332
+ }
333
+ /**
334
+ *
335
+ * return path to the openssl executable
336
+ */
337
+ export async function install_prerequisite() {
338
+ // istanbul ignore else
339
+ if (process.platform !== "win32") {
340
+ return await check_system_openssl_version();
341
+ }
342
+ else {
343
+ return await install_and_check_win32_openssl_version();
344
+ }
345
+ }
346
+ export async function get_openssl_exec_path() {
347
+ if (process.platform === "win32") {
348
+ const opensslExecPath = await install_prerequisite();
349
+ if (!fs.existsSync(opensslExecPath)) {
350
+ throw new Error(`internal error cannot find ${opensslExecPath}`);
351
+ }
352
+ return opensslExecPath;
353
+ }
354
+ else {
355
+ return "openssl";
356
+ }
357
+ }
358
+ //# sourceMappingURL=install_prerequisite.js.map