{"_id":"openssl-browser","_rev":"9-1a61dd9039a857cbfc6298f0d201b6b4","name":"openssl-browser","dist-tags":{"latest":"2.1.0"},"versions":{"1.0.1":{"name":"openssl-browser","version":"1.0.1","keywords":["openssl","crypto","cryptography","tls","ssl","x509","certificate","hash","sha256","aes","rsa","ecdsa","wasm","webassembly","browser","umd","esm","javascript","webcrypto","encryption","decryption","keygen","pkcs7","pkcs12","pem","der","native-port","emscripten"],"license":"MIT","_id":"openssl-browser@1.0.1","maintainers":[{"name":"javascript-2020","email":"javascript.2020.io@gmail.com"}],"homepage":"https://github.com/javascript-2020/npm#readme","bugs":{"url":"https://github.com/javascript-2020/npm/issues"},"dist":{"shasum":"5ca248351aa4a04869fb2ace47a615d5b8af765b","tarball":"https://registry.npmjs.org/openssl-browser/-/openssl-browser-1.0.1.tgz","fileCount":7,"integrity":"sha512-UZLJq7tGCbKbSoh4gjpEiDjbb0KVXmM1Y7wO1ZCu9NnyUMiM+G36WTez0WlPiRAGDuuOepki70ypXcjZRr4q8Q==","signatures":[{"sig":"MEUCIQDkNikHZfNHl1CYJqLuafS6My0TAs1I2Hm9YdsdAG5HvQIgHwC3NCYPWm+VFP9SlvD/hlvHfyoXWYSbAdbYDOvdSiY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3632614},"main":"openssl.js","module":"openssl.m.js","exports":{".":{"import":"./openssl.m.js","require":"./openssl.js"}},"_npmUser":{"name":"javascript-2020","email":"javascript.2020.io@gmail.com"},"repository":{"url":"git+https://github.com/javascript-2020/npm.git","type":"git","directory":"openssl-browser"},"_npmVersion":"11.12.1","description":"Browser-ready standalone build of openssl ( UMD + ESM )","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/openssl-browser_1.0.1_1777993966785_0.3464169852777814","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"openssl-browser","version":"1.0.2","keywords":["openssl","crypto","cryptography","tls","ssl","x509","certificate","hash","sha256","aes","rsa","ecdsa","wasm","webassembly","browser","umd","esm","javascript","webcrypto","encryption","decryption","keygen","pkcs7","pkcs12","pem","der","native-port","emscripten"],"license":"MIT","_id":"openssl-browser@1.0.2","maintainers":[{"name":"javascript-2020","email":"javascript.2020.io@gmail.com"}],"homepage":"https://github.com/javascript-2020/npm#readme","bugs":{"url":"https://github.com/javascript-2020/npm/issues"},"dist":{"shasum":"621cd16853ddb7154d4d695596ba950623c18278","tarball":"https://registry.npmjs.org/openssl-browser/-/openssl-browser-1.0.2.tgz","fileCount":7,"integrity":"sha512-y4eBJSfQgbs2wATt4vFQ/KWu08yX1Q1ELQXX/TUtI4YfBtcLBxbj5y01gVuxhkvLE1gfihzlsqZAqebcmEtQHA==","signatures":[{"sig":"MEYCIQC8XhMshfk25sc8zFPRR6GfJdEGOtn+7Iz9Fd7h8NffZwIhAPkRLttafrXC8DuAiYXApI8ZCvN3q6QuEdbAYbgtd/+N","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3632619},"main":"openssl.js","module":"openssl.m.js","exports":{".":{"import":"./openssl.m.js","require":"./openssl.js"}},"_npmUser":{"name":"javascript-2020","email":"javascript.2020.io@gmail.com"},"repository":{"url":"git+https://github.com/javascript-2020/npm.git","type":"git","directory":"openssl-browser"},"_npmVersion":"11.12.1","description":"Browser-ready standalone build of openssl ( UMD + ESM )","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/openssl-browser_1.0.2_1778858560444_0.011562236277324445","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"openssl-browser","version":"2.0.0","keywords":["openssl","crypto","cryptography","tls","ssl","x509","certificate","hash","sha256","aes","rsa","ecdsa","wasm","webassembly","browser","umd","esm","javascript","webcrypto","encryption","decryption","keygen","pkcs7","pkcs12","pem","der","native-port","emscripten"],"license":"MIT","_id":"openssl-browser@2.0.0","maintainers":[{"name":"javascript-2020","email":"javascript.2020.io@gmail.com"}],"homepage":"https://github.com/javascript-2020/npm#readme","bugs":{"url":"https://github.com/javascript-2020/npm/issues"},"dist":{"shasum":"83c656434bb9d2ad0dda79c255a634317a855dba","tarball":"https://registry.npmjs.org/openssl-browser/-/openssl-browser-2.0.0.tgz","fileCount":11,"integrity":"sha512-F6c+9NNQ3DX3m6ui7u6eUtJuMnngmv6uYt/4MiT1MS9W2ligZ1Gakmky04vtEXmAwZnn807DENyk+m7dTyBf7w==","signatures":[{"sig":"MEYCIQDGW5sTMaFZqaNYshnp1xOdD4eR71lQRO9YISd6watmiwIhAMF0K7+1pNUFG9vbXvSeBnujMomNBZ5C/gbB87/D9zWa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3650258},"exports":{"import":"./openssl.mjs","require":"./openssl.js"},"_npmUser":{"name":"javascript-2020","email":"javascript.2020.io@gmail.com"},"repository":{"url":"git+https://github.com/javascript-2020/npm.git","type":"git","directory":"openssl-browser"},"_npmVersion":"11.12.1","description":"Browser-ready standalone build of openssl ( UMD + ESM )","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/openssl-browser_2.0.0_1780079348755_0.9954585005197285","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"openssl-browser","version":"2.0.1","keywords":["openssl","crypto","cryptography","tls","ssl","x509","certificate","hash","sha256","aes","rsa","ecdsa","wasm","webassembly","browser","umd","esm","javascript","webcrypto","encryption","decryption","keygen","pkcs7","pkcs12","pem","der","native-port","emscripten"],"license":"MIT","_id":"openssl-browser@2.0.1","maintainers":[{"name":"javascript-2020","email":"javascript.2020.io@gmail.com"}],"homepage":"https://github.com/javascript-2020/npm#readme","bugs":{"url":"https://github.com/javascript-2020/npm/issues"},"dist":{"shasum":"9d457c513295577a5a3ee96562eef0faa6bd3049","tarball":"https://registry.npmjs.org/openssl-browser/-/openssl-browser-2.0.1.tgz","fileCount":11,"integrity":"sha512-1y7h2MA0wC9SVISyfAuPDMyR0qon3El1msgkhHPoB0+yiSFCacqR0bBJ4rYiIkU9jcHjFcJFTPvChHJsS3ZjvQ==","signatures":[{"sig":"MEUCIFgk4eJG9Td8GQbDpy/HTjJEgkDcN7XMIAgv8HzEkH8WAiEAixw5oEMMhjifjYhx1zeZNrLV0j8Z6Inp7pspy2dJJrU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3650223},"exports":{"import":"./openssl.mjs","require":"./openssl.js"},"_npmUser":{"name":"javascript-2020","email":"javascript.2020.io@gmail.com"},"repository":{"url":"git+https://github.com/javascript-2020/npm.git","type":"git","directory":"openssl-browser"},"_npmVersion":"11.12.1","description":"Browser-ready standalone build of openssl ( UMD + ESM )","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/openssl-browser_2.0.1_1780080018034_0.9112050211603291","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"openssl-browser","version":"2.0.2","keywords":["openssl","crypto","cryptography","tls","ssl","x509","certificate","hash","sha256","aes","rsa","ecdsa","wasm","webassembly","browser","umd","esm","javascript","webcrypto","encryption","decryption","keygen","pkcs7","pkcs12","pem","der","native-port","emscripten"],"license":"MIT","_id":"openssl-browser@2.0.2","maintainers":[{"name":"javascript-2020","email":"javascript.2020.io@gmail.com"}],"homepage":"https://github.com/javascript-2020/npm#readme","bugs":{"url":"https://github.com/javascript-2020/npm/issues"},"dist":{"shasum":"2c94f67fefa275de589edfecacc2ca8e7691cfe1","tarball":"https://registry.npmjs.org/openssl-browser/-/openssl-browser-2.0.2.tgz","fileCount":11,"integrity":"sha512-rRTibCElP6kDqUTwSvLbkoN33G/kgIP0yw5V/5szhMcEH2P6IWr4OYc4WlUvnjzWTQM/v1O9YGB/w6OlXdUsHQ==","signatures":[{"sig":"MEYCIQCjTnPGpzIeWN+xcJbDjfUgYDhulTa5GCLNHzRDh/L4UAIhANPW090zp6Vfnf2lbZ5A+JuiPEq9zxgtakqKZwCVBcYy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3650228},"exports":{"import":"./openssl.mjs","require":"./openssl.js"},"_npmUser":{"name":"javascript-2020","email":"javascript.2020.io@gmail.com"},"repository":{"url":"git+https://github.com/javascript-2020/npm.git","type":"git","directory":"openssl-browser"},"_npmVersion":"11.12.1","description":"Browser-ready standalone build of openssl ( UMD + ESM )","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/openssl-browser_2.0.2_1780080317038_0.6903758229971468","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"openssl-browser","version":"2.0.3","keywords":["openssl","crypto","cryptography","tls","ssl","x509","certificate","hash","sha256","aes","rsa","ecdsa","wasm","webassembly","browser","umd","esm","javascript","webcrypto","encryption","decryption","keygen","pkcs7","pkcs12","pem","der","native-port","emscripten"],"license":"MIT","_id":"openssl-browser@2.0.3","maintainers":[{"name":"javascript-2020","email":"javascript.2020.io@gmail.com"}],"homepage":"https://github.com/javascript-2020/npm#readme","bugs":{"url":"https://github.com/javascript-2020/npm/issues"},"dist":{"shasum":"fbda272fdd41be0734df775dd3bfb2189c36e492","tarball":"https://registry.npmjs.org/openssl-browser/-/openssl-browser-2.0.3.tgz","fileCount":11,"integrity":"sha512-8n0i0oEmiFZLk4ZNLHLwyYzIEjKTZG9x8kZjKbM/un8GOtDlKiFSkj61zs2jOzqc/yec9A7tueOUqUqpUWnYLQ==","signatures":[{"sig":"MEQCIGMLNS0e23Q1UD9khdcaGlSs0CxFujkZXC2CHrREy0j4AiAXlxcVcQXfDrHvB+BPIStF4uJrSAojzMk3foCvdoMpuQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3650236},"exports":{"import":"./openssl.mjs","require":"./openssl.js"},"_npmUser":{"name":"javascript-2020","email":"javascript.2020.io@gmail.com"},"repository":{"url":"git+https://github.com/javascript-2020/npm.git","type":"git","directory":"openssl-browser"},"_npmVersion":"11.12.1","description":"Browser-ready standalone build of openssl ( UMD + ESM )","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/openssl-browser_2.0.3_1780080444282_0.608413717599332","host":"s3://npm-registry-packages-npm-production"}},"2.0.4":{"name":"openssl-browser","version":"2.0.4","keywords":["openssl","crypto","cryptography","tls","ssl","x509","certificate","hash","sha256","aes","rsa","ecdsa","wasm","webassembly","browser","umd","esm","javascript","webcrypto","encryption","decryption","keygen","pkcs7","pkcs12","pem","der","native-port","emscripten"],"license":"MIT","_id":"openssl-browser@2.0.4","maintainers":[{"name":"javascript-2020","email":"javascript.2020.io@gmail.com"}],"homepage":"https://github.com/javascript-2020/npm#readme","bugs":{"url":"https://github.com/javascript-2020/npm/issues"},"dist":{"shasum":"fabaad07ba24f40bdf81138de08a6ed535a93ddd","tarball":"https://registry.npmjs.org/openssl-browser/-/openssl-browser-2.0.4.tgz","fileCount":11,"integrity":"sha512-8AO8TZsDFXR9RIu0DG4qiAaoRcgSih6WnF7UT2nOza6bPLFJhvRuZZGp6NnPfUrzHv/0XNtiqZBo6NkSAaISIQ==","signatures":[{"sig":"MEQCICW2KO2fMLmXKv9QlNU0WoxfUmyIbjyLCm2uwt6ODw2RAiAQMTnxLZb3t6UkJ8MZPE247vwO6L/1LMAWBuDfQtvioA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3653910},"exports":{"import":"./openssl.mjs","require":"./openssl.js"},"_npmUser":{"name":"javascript-2020","email":"javascript.2020.io@gmail.com"},"repository":{"url":"git+https://github.com/javascript-2020/npm.git","type":"git","directory":"openssl-browser"},"_npmVersion":"11.12.1","description":"Browser-ready standalone build of openssl ( UMD + ESM )","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/openssl-browser_2.0.4_1780081088219_0.03815142314556064","host":"s3://npm-registry-packages-npm-production"}},"2.0.5":{"name":"openssl-browser","version":"2.0.5","keywords":["openssl","crypto","cryptography","tls","ssl","x509","certificate","hash","sha256","aes","rsa","ecdsa","wasm","webassembly","browser","umd","esm","javascript","webcrypto","encryption","decryption","keygen","pkcs7","pkcs12","pem","der","native-port","emscripten"],"license":"MIT","_id":"openssl-browser@2.0.5","maintainers":[{"name":"javascript-2020","email":"javascript.2020.io@gmail.com"}],"homepage":"https://github.com/javascript-2020/npm#readme","bugs":{"url":"https://github.com/javascript-2020/npm/issues"},"dist":{"shasum":"4a7a8126df21e7516367c7b41bffc3ab4587fe2b","tarball":"https://registry.npmjs.org/openssl-browser/-/openssl-browser-2.0.5.tgz","fileCount":11,"integrity":"sha512-0U2kMWN9FxtNwzLyUPpjon9yipeAMHihEjrwFjN6nq51ROc6XKFb+HecHbtr+tgj0fooj55wwH/4k/pPLIlufw==","signatures":[{"sig":"MEYCIQC031LcmuR/yjKj2ONItevYuMknvH6PJYbMhHYq5LDfRgIhAL/KaeVEg8xKpTo31I3PhErrC9mlaPInWjs7uSzjySIx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3655530},"exports":{"import":"./openssl.mjs","require":"./openssl.js"},"_npmUser":{"name":"javascript-2020","email":"javascript.2020.io@gmail.com"},"repository":{"url":"git+https://github.com/javascript-2020/npm.git","type":"git","directory":"openssl-browser"},"_npmVersion":"11.12.1","description":"Browser-ready standalone build of openssl ( UMD + ESM )","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/openssl-browser_2.0.5_1780139982051_0.011090614820456368","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"openssl-browser","version":"2.1.0","description":"OpenSSL in the Browser and Node.js through WebAssembly, with ESM and UMD entrypoints.","exports":{"import":"./openssl.mjs","require":"./openssl.js"},"keywords":["openssl","wasm","webassembly","browser","nodejs","umd","esm","javascript","crypto","cryptography","x509","certificate","hash","sha256","aes","rsa","ecdsa","webcrypto","encryption","decryption","keygen","pkcs7","pkcs12","pem","der","emscripten","NodeJS","Node.js"],"license":"MIT","repository":{"type":"git","url":"git+https://github.com/javascript-2020/npm.git","directory":"openssl-browser"},"_id":"openssl-browser@2.1.0","bugs":{"url":"https://github.com/javascript-2020/npm/issues"},"homepage":"https://github.com/javascript-2020/npm#readme","_nodeVersion":"25.9.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-mPxqOqpJZHoCbfg5Ps6iEPBC4ZztyAowS6xEUE15VEwtJxmo3DNRi6sZm0CtSnCIi5Rk+iqbQSljYZRWg6A5cw==","shasum":"c1ac9cf9a92b181fc89661923175fc3d8d47f2fa","tarball":"https://registry.npmjs.org/openssl-browser/-/openssl-browser-2.1.0.tgz","fileCount":9,"unpackedSize":3825369,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDb5DKuMaCT/Ll1/oFZgNrDSffQYkN7+fWTEJ2aJLtT7wIhANsVmC2P0JpoHWaLkaY82DlhNdORkNavAt3+ErwNyX2c"}]},"_npmUser":{"name":"javascript-2020","email":"javascript.2020.io@gmail.com"},"directories":{},"maintainers":[{"name":"javascript-2020","email":"javascript.2020.io@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/openssl-browser_2.1.0_1784253322656_0.39413218512698034"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-05T15:12:46.783Z","modified":"2026-07-17T01:55:22.973Z","1.0.1":"2026-05-05T15:12:46.991Z","1.0.2":"2026-05-15T15:22:40.700Z","2.0.0":"2026-05-29T18:29:08.967Z","2.0.1":"2026-05-29T18:40:18.268Z","2.0.2":"2026-05-29T18:45:17.213Z","2.0.3":"2026-05-29T18:47:24.445Z","2.0.4":"2026-05-29T18:58:08.466Z","2.0.5":"2026-05-30T11:19:42.226Z","2.1.0":"2026-07-17T01:55:22.821Z"},"bugs":{"url":"https://github.com/javascript-2020/npm/issues"},"license":"MIT","homepage":"https://github.com/javascript-2020/npm#readme","keywords":["openssl","wasm","webassembly","browser","nodejs","umd","esm","javascript","crypto","cryptography","x509","certificate","hash","sha256","aes","rsa","ecdsa","webcrypto","encryption","decryption","keygen","pkcs7","pkcs12","pem","der","emscripten","NodeJS","Node.js"],"repository":{"type":"git","url":"git+https://github.com/javascript-2020/npm.git","directory":"openssl-browser"},"description":"OpenSSL in the Browser and Node.js through WebAssembly, with ESM and UMD entrypoints.","maintainers":[{"name":"javascript-2020","email":"javascript.2020.io@gmail.com"}],"readme":"\r\n<div id=top></div>\r\n\r\n\r\n# openssl-browser\r\n\r\n[![npm version](https://img.shields.io/npm/v/openssl-browser.svg)](https://www.npmjs.com/package/openssl-browser)\r\n[![npm downloads](https://img.shields.io/npm/dm/openssl-browser.svg)](https://www.npmjs.com/package/openssl-browser)\r\n[![npm downloads](https://img.shields.io/npm/dt/openssl-browser.svg)](https://www.npmjs.com/package/openssl-browser)\r\n[![license](https://img.shields.io/npm/l/openssl-browser.svg)](./LICENSE)\r\n[![WebAssembly](https://img.shields.io/badge/WebAssembly-WASM-blueviolet.svg)](ca://s?q=webassembly_badge)\r\n[![Emscripten](https://img.shields.io/badge/Emscripten-compiled-orange.svg)](ca://s?q=emscripten_badge)\r\n\r\n\r\n` openssl-browser ` brings **OpenSSL** to the **Browser** and **Node.js** through WebAssembly, with ESM and UMD entrypoints.\r\n\r\n` OpenSSL 3.5.2 5 Aug 2025 (Library: OpenSSL 3.5.2 5 Aug 2025) `\r\n\r\n\r\n<br>\r\n\r\n\r\n## For ESM\r\n\r\n- [https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.mjs](https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.mjs)\r\n\r\n- [https://cdn.jsdelivr.net/npm/openssl-browser/openssl.mjs](https://cdn.jsdelivr.net/npm/openssl-browser/openssl.mjs)\r\n\r\n```\r\n\r\nimport {opensslmod} from 'https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.mjs';\r\n\r\n//  var {opensslmod}    = await import('https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.mjs');\r\n\r\nvar openssl   = opensslmod();\r\n\r\nawait openssl.run('-v');\r\n\r\n```\r\n\r\n\r\n<br>\r\n\r\n\r\n## For Script\r\n\r\n- [https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.js](https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.js)\r\n\r\n- [https://cdn.jsdelivr.net/npm/openssl-browser/openssl.js](https://cdn.jsdelivr.net/npm/openssl-browser/openssl.js)\r\n\r\n```\r\n\r\n<script src='https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.js'></script>\r\n\r\n<script>\r\n\r\n(async()=>{\r\n\r\n      var openssl   = opensslmod();\r\n      \r\n      await openssl.run('-v');\r\n      \r\n})();\r\n\r\n</script>\r\n\r\n```\r\n\r\n\r\n---\r\n\r\n\r\n<br>\r\n\r\n\r\n## Tools\r\n\r\n[&nbsp; &nbsp; <img width=\"25\" height=\"25\" alt=\"html editor\" title=\"html editor\" valign=\"middle\" src='https://ext-code.com/utils/editors/html-editor/images/html-editor-icon.png'>\r\n    &nbsp; **html editor** &nbsp; [ ext-code.com ]](https://ext-code.com/utils/editors/html-editor/html-editor.html)\r\n\r\n[&nbsp; &nbsp; <img  width=\"25\" height=\"25\" alt=\"js console\" title=\"js console\" valign=\"middle\" src=\"https://ext-code.com/utils/editors/js-console/images/js-console-icon.png\">\r\n  &nbsp; **js console** &nbsp; [ ext-code.com ]](https://ext-code.com/utils/editors/js-console/js-console.html)\r\n\r\nSee what is exposed in both the script src and esm modules :\r\n\r\n[&nbsp; &nbsp; <img width=\"25\" height=\"25\" alt=\"global state diff\" title=\"global state diff\" valign=\"middle\" src='https://ext-code.com/utils/misc/global-state-diff/images/global-state-diff-icon.png'>\r\n    &nbsp; **global state diff** &nbsp; [ ext-code.com ]](https://ext-code.com/utils/misc/global-state-diff/global-state-diff.html)\r\n\r\nExperiment with the package :\r\n\r\n[&nbsp; &nbsp; <img width=\"25\" height=\"25\" alt=\"nodejs terminal\" title=\"nodejs terminal\" valign=\"middle\" src='https://ext-code.com/utils/misc/nodejs-terminal/images/nodejs-terminal-icon.png'>\r\n  &nbsp; **nodejs terminal** &nbsp; [ ext-code.com ]](https://ext-code.com/utils/misc/nodejs-terminal/nodejs-terminal.html)\r\n\r\n\r\n\r\n\r\n\r\n---\r\n\r\n<br>\r\n\r\n\r\n## NodeJS Environment\r\n\r\n```\r\n\r\nnpm i openssl-browser\r\n\r\n```\r\n\r\n```\r\n\r\n(async()=>{\r\n\r\n      var opensslmod    = require('openssl-browser');\r\n      \r\n      var openssl       = opensslmod();\r\n      \r\n      await openssl.run('-v');\r\n      \r\n})();\r\n\r\n```\r\n\r\n```\r\n\r\nimport {opensslmod} from 'openssl-browser';\r\n\r\nvar openssl   = opensslmod();\r\n\r\nawait openssl.run('-v');\r\n\r\n```\r\n      \r\n\r\n<br>\r\n\r\n\r\n## Locally Hosted ( via web server )\r\n\r\n\r\nThe scripts can be hosted locally.\r\n\r\n```\r\n\r\nnpm i openssl-browser\r\n      \r\n```\r\n\r\nThe scripts can then either be copied to a prefered location\r\n\r\nor referenced via default install location, such as :\r\n\r\n```\r\n\r\nimport {opensslmod} from '/node_modules/openssl-browser/openssl.mjs';\r\n\r\n//  var {opensslmod}    = await import('/node_modules/openssl-browser/openssl.mjs');\r\n\r\nvar openssl   = opensslmod();\r\n\r\nawait openssl.run('-v');\r\n\r\n```\r\n\r\nWhen hosting locally, you may need to specify the paths for ` openssl.wasm ` and ` openssl.wasm.js `.\r\nIf omitted, the module defaults to loading the files from a remote server.  Specifying only\r\n` openssl.wasm.js ` assumes that ` openssl.wasm ` is located in the same directory.\r\n\r\n```\r\n\r\n<script src='/node_modules/openssl-browser/openssl.js'></script>\r\n\r\n<script>\r\n\r\n(async()=>{\r\n\r\n      var wasmJs    = '/node_modules/openssl-browser/openssl.wasm.js';\r\n      var openssl   = opensslmod({wasmJs});\r\n      \r\n      await openssl.run('-v');\r\n\r\n})();\r\n\r\n</script>\r\n\r\n```\r\n\r\n\r\n\r\n\r\n---\r\n\r\n\r\n<br>\r\n\r\n\r\n## API\r\n---\r\n\r\n\r\n### opensslmod\r\n\r\n---\r\n\r\nconstructor function\r\n\r\n```\r\nopensslmod(params)\r\n```\r\n\r\n- **params** : object\r\n\r\n    - **std** : defined : if std is defined on params, stdout and stderr are assumed to be truethy\r\n    \r\n    - **stdout**  : function stdout(txt) : stdout output, optional, truethy => stdout logs to console\r\n\r\n    - **stderr**  : function stderr(txt) : stderr output, optional, truethy => stderr logs to console\r\n\r\n    - **wasmJs**  : string : location of wamsJs file, optional\r\n\r\n    - **wasmBinaryFile** : string : location of wasm binary, optional\r\n\r\n    - **wasmBinary** : [arrayBuffer, buffer, uint8] :  provide the wasm binary itself, optional\r\n\r\n    - **echo** : boolean : whether to echo output to console, optional, default=true\r\n\r\n    - **df** : boolean : enable or disable debugging, optional, default=false\r\n\r\n<br>\r\n\r\n**return**\r\n\r\n- **object** : openssl api\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar openssl   = opensslmod({std:1,echo:false});\r\nawait openssl.run('-v');\r\n```\r\n\r\n```\r\nfunction stdout(){console.log.apply(console,arguments)\r\nfunction stdout(){console.log.apply(console,arguments)\r\nvar openssl   = opensslmod({stdout,stderr,echo:false});\r\nawait openssl.run('-v');\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n### openssl.df\r\n---\r\n\r\nenable or disable debugging \r\n\r\n```\r\nopenssl.df : true|false\r\n```\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nopenssl.df    = true;\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.run\r\n\r\n---\r\n\r\nrun openssl command/s, multiple arguments can be provided\r\n\r\n```\r\nasync openssl.run(stringN)\r\n```\r\n\r\n- **stringX** : 'openssl <command> [arg0] [arg1] ...'\r\n\r\n- **stringX** : '<command> [arg0] [arg1] ...'\r\n\r\n<br>\r\n\r\n**return** : {Module,code,error}\r\n\r\n- **Module** : emscripten module\r\n- **code** : number : error code\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {Module,code,error}   = await openssl.run('-v','openssl genrsa 2048 -out -');\r\n```\r\n\r\n***note***\r\n\r\n` openssl ` in the command is optional\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### hash functions : sha1, sha256, sha512, md5, blake2b512, blake2s256, sha3-256, sha3-512\r\n\r\n---\r\n\r\ngenerate the hash of value\r\n\r\n```\r\nasync hash(value,{src='digest.txt',dest='tmp.bin'}={})\r\n```\r\n\r\n- **value** : uint8|string|blob : the data to be hashed\r\n- **src** : string : the input filename\r\n- **dest** : string : the output filename\r\n\r\n<br>\r\n\r\n**return** {digest,hash,error};\r\n\r\n- **digest / hash** : string : the hash value\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {digest,error}    = await openssl.sha256('helloworld');\r\nopenssl.log('  sha256 :',digest);\r\nvar {digest,error}    = await openssl.md5('helloworld');\r\nopenssl.log('     md5 :',digest);\r\nvar {digest,error}    = await openssl['sha3-512']('helloworld');\r\nopenssl.log('sha3-512 : ',digest);\r\n\r\nvar hex               = opensslmod.md5('helloworld',true);\r\nopenssl.log(hex);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.keypair\r\n\r\n---\r\n\r\ngenerate a private and public keypair in pkcs8 form\r\n\r\n```\r\nasync openssl.keypair({keybits=4096,key_name='private.key',pub_name='public.key'}={})\r\n```\r\n\r\n- **keybits** : number : the size of the key in bits, default=4096\r\n- **key_name** : string : the output filename of the private key\r\n- **pub_name** : string : the output filename of the public key\r\n\r\n<br>\r\n\r\n**return** {privateKey,publicKey,error}\r\n\r\n- **privateKey** : string : the private key in pem form\r\n- **publicKey** : string : the public key in pem form\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {privateKey,publicKey,error}    = await openssl.keypair();\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.evpBytesToKey\r\n\r\n- EVP_BytesToKey\r\n- evpBytesToKey\r\n- evpbytestokey\r\n\r\n---\r\n\r\nThe insecure key derivation algorithm from OpenSSL.\r\n\r\n```\r\nasync openssl.evpBytesToKey({password,salt=true,keylen=32,ivlen=16})\r\n```\r\n\r\n- **password** : string : the password\r\n- **salt** : true|falsey|uint8 : \r\n  - true : auto generate a salt\r\n  - falsey : do not use a salted algorithm\r\n  - uint8 : a buffer for use as the salt\r\n- **keylen** :\r\n- **ivlen** :\r\n\r\n<br>\r\n\r\n**return** {key,iv,salt,error}\r\n\r\n- **key** : uint8 : the derived key\r\n- **iv** : uint8 : the iv\r\n- **salt** : uint8 : the salt, useful when auto generating a salt value\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {key,salt,iv,error}   = await openssl.evp_bytes_to_key({password:'123456'});\r\nopenssl.log(' key :',key,openssl.to_b64(key));\r\nopenssl.log('salt :',salt,openssl.to_b64(salt));\r\nopenssl.log('  iv :',iv,openssl.to_b64(iv));\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.pbkdf2\r\n\r\n---\r\n\r\npbkdf2 key derivatation\r\n\r\nPBKDF2 (Password-Based Key Derivation Function 2) is a cryptographic algorithm used to stretch\r\nsimple passwords into secure, hard-to-guess keys. It achieves this by combining a password with\r\na random string (salt) and hashing the result tens or hundreds of thousands of times to prevent\r\nbrute-force attacks.\r\n\r\n```\r\nasync openssl.pbkdf2(password,salt=true,iterations=200_000,keylen=32)\r\n```\r\n\r\n- **password** : string : the password\r\n- **salt** : true | falsey | uint8\r\n  - true : auto generate salt\r\n  - falsey : use no salt algorithm\r\n  - uint8 : provide a salt\r\n- **iterations** : number : number of iterations to use\r\n- **keylen** : number : size of key\r\n\r\n<br>\r\n\r\n**return** {key,salt,error}\r\n\r\n- **key** : uint8 : generated key\r\n- **salt** : uint8 : generated salt\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {key,salt,error}   = await openssl.pbkdf2({password:'123456'});\r\nopenssl.log(' key :',key,openssl.to_b64(key));\r\nopenssl.log('salt :',salt,openssl.to_b64(salt));\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n\r\n### openssl.hkdf\r\n\r\n---\r\n\r\nhkdf key derivation algorithm\r\n\r\nHKDF (HMAC-based Extract-and-Expand Key Derivation Function) is a cryptographic algorithm designed\r\nto convert a weak or generic master secret into one or more cryptographically strong, distinct keys.\r\n\r\n```\r\nasync openssl.hkdf({secret,salt=true,info=false,keylen=32})\r\n```\r\n\r\n- **secret** : string : The raw secret bytes HKDF consumes as its input.\r\n- **salt** : true | falsey | uint8 : , default=true\r\n  - true : auto generate salt\r\n  - falsey : use no salt algorithm\r\n  - uint8 : provide a salt\r\n- **info** : boolean : , default=false\r\n- **keylen** : number : size of the key, default=32\r\n\r\n<br>\r\n\r\n**return** {key,salt,info,error}\r\n\r\n- **key** : uint8 : the derived key\r\n- **salt** : uint8 : the salt\r\n- **info** : uint8 : the used info\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {key,salt,error}   = await openssl.hkdf({secret:'123456'});\r\nopenssl.log(' key :',key,openssl.to_b64(key));\r\nopenssl.log('salt :',salt,openssl.to_b64(salt));\r\n```\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.configToIni\r\n\r\n- config_ini\r\n\r\n---\r\n\r\nconvert a config json structure to an openssl ini text file\r\n\r\n```\r\nopenssl.configToIni(json)\r\n```\r\n\r\n- **json** : object|string : the configuration object\r\n  - string [ ca | server | client | codeSigning | email | ocspResponder | timestamp | ipsec | device ] : predefined default values for dev / testing \r\n\r\n<br>\r\n\r\n**return** \r\n\r\n- **string** : the ini file text\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar config    = opensslmod.config.server();\r\nopenssl.log.json(config);\r\nvar ini       = openssl.config_ini(config);\r\nopenssl.log(ini);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.sign\r\n\r\n---\r\n\r\ncreate a signature for the data using a private key, privateKey and value are optional if these\r\nalready exist within the file system\r\n\r\n```\r\nasync openssl.sign({\r\n      privateKey,value,\r\n      key_name='private.key',file_name='file.bin',sig_name='sig.bin'\r\n})\r\n```\r\n\r\n- **privateKey** : string : the privateKey in pem form, optional\r\n- **value** : uint8|string|blob|buffer : the data to be signed, optional\r\n- **key_name** : string : the private key filename, optional, default='private.key'\r\n- **file_name** : string : the name of the file on the file system, optional, default='file.bin'\r\n- **sig_name** : string : the name of the signature file, optional, default='sig.bin'\r\n\r\n<br>\r\n\r\n**return** {sig,signature,error}\r\n\r\n- **sig|signature** : string : the signature\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar js    = `\r\n      console.log('helloworld');\r\n`;\r\nvar js2   = `\r\n      console.log('worldhello');\r\n`;\r\nvar {privateKey,publicKey}    = await openssl.keypair();\r\nvar {sig,error}               = await openssl.sign({privateKey,value:js});\r\nvar {result,error}            = await openssl.sign.verify({publicKey,sig,value:js});\r\nopenssl.log('result',result);\r\nvar {result,error}            = await openssl.sign.verify({publicKey,sig,value:js2});\r\nopenssl.log('result',result);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.sign.verify\r\n\r\n---\r\n\r\nverify the signature for the data using the public key, publicKey,signature,value are optional if these already\r\nexist within the filesystem\r\n\r\n```\r\nasync openssl.sign.verify({\r\n      publicKey,value,signature,sig,\r\n      pub_name='public.key',file_name='file.bin',sig_name='sig.bin'\r\n})\r\n```\r\n\r\n- **publicKey** : string : the public key in pem format, optional\r\n- **signature|sig** : string : the signature, optional\r\n- **value** : uint8|string|blob : the data, optional\r\n- **pub_name** : string : the filename to write the public key, optional\r\n- **file_name** : string : the filename to write the data, optional\r\n- **sig_name** : string : the filename of the signature file, optional\r\n\r\n<br>\r\n\r\n**return** {result,error}\r\n\r\n- **result** : boolean : the result of the verification\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar js    = `\r\n      console.log('helloworld');\r\n`;\r\nvar js2   = `\r\n      console.log('worldhello');\r\n`;\r\nvar {privateKey,publicKey}    = await openssl.keypair();\r\nvar {sig,error}               = await openssl.sign({privateKey,value:js});\r\nvar {result,error}            = await openssl.sign.verify({publicKey,sig,value:js});\r\nopenssl.log('result',result);\r\nvar {result,error}            = await openssl.sign.verify({publicKey,sig,value:js2});\r\nopenssl.log('result',result);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.cert\r\n\r\n---\r\n\r\ngenerate an x509 certificate\r\n\r\n```\r\nasync openssl.cert({\r\n      caKey,caCert,privateKey,config,\r\n      days=365,\r\n      key_name='private.key',cert_name='cert.pem',csr_name='csr.pem',config_name='config.ini',ca_key_name='ca.key',ca_cert_name='ca.cert'      \r\n})\r\n```\r\n\r\n- **caKey** : string : the pem encoded signing key, optional\r\n- **caCert** : string : the pem encoded signing certificate, optional\r\n- **privateKey** : string : the pem encoded private key for the certificate, optional\r\n- **config** : string : the configuration for the certificate, optional\r\n- **days** : number : the number of days the certificate is valid for, optional\r\n- **key_name** : string : the filename for the private key, optional, default='private.key'\r\n- **cert_name** : string : the filename for the certificate, optional, default='cert.pem'\r\n- **csr_name** : string : the filename for the intermediate csr, optional, default='csr.pem'\r\n- **config_name** : string : the filename for the config file, optional, default='config.ini'\r\n- **ca_key_name** : string : the filename for the signing key, optional, default='ca.key'\r\n- **ca_cert_name** : string : the filename of the signing cert, optional, default='ca.cert'\r\n\r\n<br>\r\n\r\n**returns** {cert,error}\r\n\r\n- **cert** : string : pem encoded certificate\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {privateKey,cert}   = await openssl.selfsigned({config:'ca'});\r\nvar caKey               = privateKey;\r\nvar caCert              = cert;\r\nvar {privateKey,cert}   = await openssl.cert({caKey,caCert,config:'server'});\r\nvar {result,error}      = await openssl.cert.verify({caCert,cert});\r\nopenssl.log('result',result);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.cert.verify\r\n\r\n---\r\n\r\nverify an x509 certificate\r\n\r\n```\r\nasync openssl.cert.verify({\r\n      caCert,cert,chainPem,trustedPem,\r\n      cert_name='cert.pem',ca_cert_name='ca.cert',chain_name='chain.pem',trusted_name='trusted.pem'              \r\n})\r\n```\r\n\r\n- **caCert** : string : the pem encoded issuing cert, optional\r\n- **cert** : string : the pem encoded certificate to verify, optional\r\n- **chainPem** : string : the pem encoded certificate chain, optional\r\n- **trustedPem** : string : pem encoded root certificates, optional\r\n- **cert_name** : string : the filename of the cert, optional, default='cert.pem'\r\n- **ca_cert_name** : string : the filename of the issuing cert, optional, default='ca.cert'\r\n- **chain_name** : string : the filename of the chain of certificates, optional, default='chain.pem'\r\n- **trusted_name** : string : the filename of the trusted root certificates, optional, default='trusted.pem'\r\n\r\n<br>\r\n\r\n**return** {result,error}\r\n\r\n- **result** : boolean : result of the verification\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {privateKey,cert}   = await openssl.selfsigned({config:'ca'});\r\nvar caKey               = privateKey;\r\nvar caCert              = cert;\r\nvar {privateKey,cert}   = await openssl.cert({caKey,caCert,config:'server'});\r\nvar {result,error}      = await openssl.cert.verify({caCert,cert});\r\nopenssl.log('result',result);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.selfsigned\r\n\r\n- selfSigned\r\n\r\n---\r\n\r\ncreate a selfsigned certificate, parameters are optional when the files already exist\r\n\r\n```\r\nasync openssl.selfsigned({\r\n      config,privateKey,\r\n      keybits=4096,days=365,\r\n      key_name='private.key',cert_name='cert.pem',config_name='config.ini'\r\n})\r\n```\r\n\r\n- **config** : object : configuration information for the certificate, optional\r\n- **privateKey** : string : pem encoded private key, optional\r\n- **keybits** : number : the number of bits in the private key, optional, default=4096\r\n- **days** : number : the number of days to issue the certificate, optional, default=365\r\n- **key_name** : string : the filename of the private key, optional, default='private.key'\r\n- **cert_name** : string : the filename of the certificate, optional, default='cert.pem'\r\n- **config_name** : string : the filename of the ini file, optional, default='config.ini'\r\n\r\n<br>\r\n\r\n**return** {privateKey,cert,error}\r\n\r\n- **privateKey** : string : pem encoded private key\r\n- **cert** : string : pem encoded certificate\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {privateKey,cert}   = await openssl.selfsigned({config:'server'});\r\nopenssl.log(privateKey);\r\nopenssl.log(cert);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.encrypt\r\n\r\n---\r\n\r\nencrypt data using a private key\r\n\r\n```\r\nasync openssl.encrypt({\r\n      key,value,iv=null, \r\n      cipher='aes-256-ctr',ivlen=16,\r\n      file_name='file.bin',enc_name='enc.bin'\r\n})\r\n```\r\n\r\n- **key** : uint8 : key buffer, only valid keylength is 32 bits, optional will auto generate\r\n- **value** : uint8 | string | blob : data to be encrypted\r\n- **iv** : uint8 | falsey : iv for the encryption, falsey the iv is generated, default=falsey\r\n- **cipher** : string : the algorithm to use for encryption, default=aes-256-ctr\r\n- **ivlen** : number : the length of the iv, default=16\r\n- **file_name** : string : the name of the file to write the data, default='file.bin'\r\n- **enc_name** : string : the name of the encrypted output file, default='enc.bin'\r\n\r\n<br>\r\n\r\n**return** {encrypted,iv,error}\r\n\r\n- **encrypted** : uint8 : the encrypted buffer\r\n- **iv** : uint8 : the iv to used\r\n- **key** : uint8 : the key used\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar key                     = openssl.rndbytes(32);\r\nvar {encrypted,iv,error}    = await openssl.encrypt({key,value:'helloworld'});\r\nopenssl.log('encrypted :',openssl.to_b64(encrypted));\r\nopenssl.log('       iv :',openssl.to_b64(iv));\r\nvar {decrypted,error}       = await openssl.decrypt({key,iv,value:encrypted});\r\nopenssl.log.hex(decrypted);\r\nvar txt                     = openssl.text.decode(decrypted);\r\nopenssl.log(txt);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n\r\n### openssl.decrypt\r\n\r\n---\r\n\r\ndecrypt an encrypted buffer\r\n\r\n```\r\nasync openssl.decrypt({\r\n      key,iv,value,\r\n      cipher='aes-256-ctr',\r\n      enc_name='enc.bin',dec_name='dec.bin'\r\n})\r\n```\r\n\r\n- **key** : uint8 : the decryption key\r\n- **iv** : unit8 : the iv used to encrypt\r\n- **value** : uint8 : the encrypted buffer\r\n- **cipher** : string ( default=aes-256-ctr ) : the encryption algorithm used\r\n- **enc_name** : string ( optional ) : the name of the encrypted file\r\n- **dec_name** : string ( optional ) : the name of the decrypted file\r\n\r\n<br>\r\n\r\n**return** {decrypted,error}\r\n\r\n- **decrypted** : uint8 : the decrypted buffer\r\n- **error** : string : error deescription\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar key                     = openssl.rndbytes(32);\r\nvar {encrypted,iv,error}    = await openssl.encrypt({key,value:'helloworld'});\r\nopenssl.log('encrypted :',openssl.to_b64(encrypted));\r\nopenssl.log('       iv :',openssl.to_b64(iv));\r\nvar {decrypted,error}       = await openssl.decrypt({key,iv,value:encrypted});\r\nopenssl.log.hex(decrypted);\r\nvar txt                     = openssl.text.decode(decrypted);\r\nopenssl.log(txt);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n\r\n### openssl.encrypt.password\r\n\r\n---\r\n\r\nencrypt data using a password\r\n\r\n```\r\nasync openssl.encrypt.password({\r\n      password,value,\r\n      file_name='file.bin',enc_name='enc.bin'\r\n})\r\n```\r\n\r\n- **password** : string : the password to encrypt the data with\r\n- **value** : uint8 | blob | string : the data to be encrypted\r\n- **file_name** : string : the filename to write the data, default='file.bin'\r\n- **enc_name** : string : the filename of the encrypted data, default='enc.bin'\r\n\r\n<br>\r\n\r\n**return** {encrypted,error}\r\n\r\n- **encrypted** : uint8 : the encrypted buffer\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {encrypted,error}         = await openssl.encrypt.password({password:'123456',value:'hello'});\r\nvar b64                       = openssl.to_b64(encrypted);\r\nopenssl.log(b64);\r\nvar {decrypted,error}         = await openssl.decrypt.password({password:'123456',value:encrypted});\r\nopenssl.datatype(decrypted,true);\r\nvar txt                       = openssl.text.decode(decrypted);\r\nopenssl.log(txt);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n\r\n### openssl.decrypt.password\r\n\r\n---\r\n\r\ndecrypt data using a password\r\n\r\n```\r\nasync openssl.decrypt.password({\r\n      password,value,\r\n      enc_name='enc.bin',dec_name='dec.bin'\r\n})\r\n```\r\n\r\n- **password** : string : the password used to encrypt the data\r\n- **value** : uint8 | blob | string : the encrypted data\r\n- **enc_name** : string : the filename of the encrypted data, default='enc.bin'\r\n- **dec_name** : string : the filename of the decrypted data, default='dec.bin'\r\n\r\n<br>\r\n\r\n**return** {decrypted,error}\r\n\r\n- **decrypted** : uint8 : the decrypted data\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {encrypted,error}         = await openssl.encrypt.password({password:'123456',value:'hello'});\r\nvar b64                       = openssl.to_b64(encrypted);\r\nopenssl.log(b64);\r\nvar {decrypted,error}         = await openssl.decrypt.password({password:'123456',value:encrypted});\r\nopenssl.datatype(decrypted,true);\r\nvar txt                       = openssl.text.decode(decrypted);\r\nopenssl.log(txt);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n\r\n### openssl.encrypt.rsa\r\n\r\n---\r\n\r\nencrypt data using a public key\r\n\r\n```\r\nasync openssl.encrypt.rsa({\r\n      publicKey,value,\r\n      pub_name='public.key',file_name='file.bin',enc_name='enc.bin'\r\n})\r\n```\r\n\r\n- **publicKey** : string : pem encoded public key\r\n- **value** : uint8 | blob | string : the data to be encrypted\r\n- **pub_name** : string : the filename of the publicKey, default='public.key'\r\n- **file_name** : string : the filename of the data, default='file.bin'\r\n- **enc_name** : string : the filename of the encrypted data, default='enc.bin'\r\n\r\n<br>\r\n\r\n**return** {encrypted,error}\r\n\r\n- **encrypted** : uint8 : the encrypted data\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {privateKey,publicKey}    = await openssl.keypair();\r\nvar {encrypted,error}         = await openssl.encrypt.rsa({publicKey,value:'hello'});\r\nvar b64                       = openssl.to_b64(encrypted);\r\nopenssl.log(b64);\r\nvar {decrypted,error}         = await openssl.decrypt.rsa({privateKey,value:encrypted});\r\nopenssl.datatype(decrypted,true);\r\nvar txt                       = openssl.text.decode(decrypted);\r\nopenssl.log(txt);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n\r\n### openssl.decrypt.rsa\r\n\r\n---\r\n\r\ndecrypt data using a privateKey\r\n\r\n```\r\nasync openssl.decrypt.rsa({\r\n      privateKey,value,\r\n      priv_name='private.key',enc_name='enc.bin',dec_name='dec.bin'\r\n})\r\n```\r\n\r\n- **privateKey** : string : pem encoded privateKey, optional\r\n- **value** : uint8 | blob | string : the data to be decrypted, optional\r\n- **priv_name** : string : the filename of the privateKey, default='private.key'\r\n- **enc_name** : string : the filename of the encrypted data, default='enc.bin'\r\n- **dec_name** : string : the filename of the decrypted data, default='dec.bin'\r\n\r\n<br>\r\n\r\n**return** {decrypted,error}\r\n\r\n- **decrypted** : uint8 : the decrypted data\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {privateKey,publicKey}    = await openssl.keypair();\r\nvar {encrypted,error}         = await openssl.encrypt.rsa({publicKey,value:'hello'});\r\nvar b64                       = openssl.to_b64(encrypted);\r\nopenssl.log(b64);\r\nvar {decrypted,error}         = await openssl.decrypt.rsa({privateKey,value:encrypted});\r\nopenssl.datatype(decrypted,true);\r\nvar txt                       = openssl.text.decode(decrypted);\r\nopenssl.log(txt);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n\r\n### openssl.encrypt.pkcs1\r\n\r\n---\r\n\r\nencrypt data using pkcs1.  Legacy command — PKCS#1 v1.5 (old, deprecated, unsafe)\r\n\r\n```\r\nasync openssl.encrypt.pkcs1({\r\n      publicKey,value,\r\n      pub_name='public.key',file_name='file.bin',enc_name='enc.bin'\r\n})\r\n```\r\n\r\n- **publicKey** : string : pem encoded publicKey, optional\r\n- **value** : uint8 | blob | string : data to be encrypted, optional\r\n- **pub_name** : string : filename of publicKey, default='public,key'\r\n- **file_name** : string : filename of data, default='file.bin'\r\n- **enc_name** : string : filename of encrypted data, default='enc.bin'\r\n\r\n<br>\r\n\r\n**return** {encrypted,error}\r\n\r\n- **encrypted** : uint8 : the encrypted data\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {privateKey,publicKey}    = await openssl.keypair();\r\nvar {encrypted,error}         = await openssl.encrypt.pkcs1({publicKey,value:'hello'});\r\nvar b64                       = openssl.to_b64(encrypted);\r\nopenssl.log(b64);\r\nvar {decrypted,error}         = await openssl.decrypt.pkcs1({privateKey,value:encrypted});\r\nopenssl.datatype(decrypted,true);\r\nvar txt                       = openssl.text.decode(decrypted);\r\nopenssl.log(txt);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n\r\n\r\n### openssl.decrypt.pkcs1\r\n\r\n---\r\n\r\ndecrypt data using pkcs1\r\n\r\n```\r\nasync openssl.decrypt.pkcs1({\r\n      privateKey,value,\r\n      priv_name='private.key',enc_name='enc.bin',dec_name='dec.bin'\r\n})\r\n```\r\n\r\n- **privateKey** : string : pem encoded private key, optional\r\n- **value** : uint8 | blob | string : the data to be decrypted, optional\r\n- **priv_name** : string : the filename for the privateKey, default='private.key'\r\n- **enc_name** : string : the filename for the encrypted data, default='enc.bin'\r\n- **dec_name** : string : the filename for the decrypted data, default='dec.bin'\r\n\r\n<br>\r\n\r\n**return** {decrypted,error}\r\n\r\n- **decrypted** : uint8 : the decrypted data\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {privateKey,publicKey}    = await openssl.keypair();\r\nvar {encrypted,error}         = await openssl.encrypt.pkcs1({publicKey,value:'hello'});\r\nvar b64                       = openssl.to_b64(encrypted);\r\nopenssl.log(b64);\r\nvar {decrypted,error}         = await openssl.decrypt.pkcs1({privateKey,value:encrypted});\r\nopenssl.datatype(decrypted,true);\r\nvar txt                       = openssl.text.decode(decrypted);\r\nopenssl.log(txt);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n\r\n### openssl.encrypt.elipticCurve\r\n\r\n- **ec**\r\n\r\n---\r\n\r\nencrypt data using eliptic curve\r\n\r\n```\r\nasync openssl.encrypt.elipticCurve({\r\n      cert,value,\r\n      cert_name='cert.pem',file_name='file.bin',enc_name='enc.bin'\r\n})\r\n```\r\n\r\n- **cert** : string : pem encoded certificate, optional\r\n- **value** : uint8 | blob | string : the data to be encrypted, optional\r\n- **cert_name** : sting : the filename for the cert\r\n- **file_name** : string : the filename for the data\r\n- **enc_name** : string : the filename of the encrypted data\r\n\r\n<br>\r\n\r\n**return** {encrypted,error}\r\n\r\n- **encrypted** : uint8 : the encrypted data\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {privateKey,cert}   = await openssl.selfSigned({config:'client'});\r\nvar {encrypted,error}   = await openssl.encrypt.elipticCurve({cert,value:'hello'});\r\nvar b64                 = openssl.to_b64(encrypted);\r\nopenssl.log(b64);\r\nvar {decrypted,error}   = await openssl.decrypt.elipticCurve({privateKey,value:encrypted});\r\nopenssl.datatype(decrypted,true);\r\nvar txt                 = openssl.text.decode(decrypted);\r\nopenssl.log(txt);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n\r\n### openssl.decrypt.elipticCurve\r\n\r\n- **openssl.decrypt.ec**\r\n\r\n---\r\n\r\ndecrypt data using eliptic curve\r\n\r\n```\r\nasync openssl.decrypt.elipticCurve({\r\n      privateKey,value,\r\n      priv_name='pivate.key',enc_name='enc.bin',dec_name='dec.bin'              \r\n})\r\n```\r\n\r\n- **privateKey** : string : pem encoded private key, optional\r\n- **value** : uint8 | blob | string : the data to be decrypted, optional\r\n- **priv_name** : stirng : the filename of the private key\r\n- **enc_name** : string : the filename of the encrypted data\r\n- **dec_name** : string : the filename of the decrypted data\r\n\r\n<br>\r\n\r\n**return** {decrypted,error}\r\n\r\n- **decrypted** : uint8 : the decrypted data\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {privateKey,cert}   = await openssl.selfSigned({config:'client'});\r\nvar {encrypted,error}   = await openssl.encrypt.elipticCurve({cert,value:'hello'});\r\nvar b64                 = openssl.to_b64(encrypted);\r\nopenssl.log(b64);\r\nvar {decrypted,error}   = await openssl.decrypt.elipticCurve({privateKey,value:encrypted});\r\nopenssl.datatype(decrypted,true);\r\nvar txt                 = openssl.text.decode(decrypted);\r\nopenssl.log(txt);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.encrypt.smime\r\n\r\n---\r\n\r\nencrypt data using smime ( cert / privateKey )\r\n\r\n```\r\nasync openssl.encrypt.smime({\r\n      cert,value,\r\n      outform='PEM',\r\n      cert_name='cert.pem',file_name='file.bin',enc_name='enc.bin'\r\n})\r\n```\r\n\r\n- **cert**  : uint8 | blob | string : the certificate, optional\r\n- **value** : uint8 | blob | string : the data to be encrypted, optional\r\n- **outform**  : string : the output format \r\n- **cert_name** : string : the filename of the certificate\r\n- **file_name** : string : the filename of the data\r\n- **enc_name** : string : the filename of the encrypted data\r\n\r\n<br>\r\n\r\n**return** {encrypted,error}\r\n\r\n- **encrypted** : uint8 : the encrypted data \r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {privateKey,cert}   = await openssl.selfSigned({config:'client'});\r\nvar {encrypted,error}   = await openssl.encrypt.smime({cert,value:'hello'});\r\nvar b64                 = openssl.to_b64(encrypted);\r\nopenssl.log(b64);\r\nvar {decrypted,error}   = await openssl.decrypt.smime({privateKey,value:encrypted});\r\nopenssl.datatype(decrypted,true);\r\nvar txt                 = openssl.text.decode(decrypted);\r\nopenssl.log(txt);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### async openssl.decrypt.smime\r\n\r\n---\r\n\r\ndecrypt data using smime ( cert / privateKey )\r\n\r\n```\r\nasync openssl.decrypt.smime({\r\n      privateKey,value,\r\n      inform='PEM',\r\n      priv_name='private.key',enc_name='enc.bin',dec_name='dec.bin'\r\n})\r\n```\r\n\r\n- **privateKey** : uint8 | blob | string : pem encoded private key, optional\r\n- **value** : uint8 | blob | string : the data to be decrypted, optional\r\n- **inform** : string [ PEM | DER ] : the output format\r\n- **priv_name** : string : the filename for the private key\r\n- **enc_name** : string : the filename for the encrypted data\r\n- **dec_name** : string : the filename for the decrypted data\r\n\r\n<br>\r\n\r\n**return** {decrypted,error}\r\n\r\n- **decrypted** : uint8 : the decrypted data\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {privateKey,cert}   = await openssl.selfSigned({config:'client'});\r\nvar {encrypted,error}   = await openssl.encrypt.smime({cert,value:'hello'});\r\nvar b64                 = openssl.to_b64(encrypted);\r\nopenssl.log(b64);\r\nvar {decrypted,error}   = await openssl.decrypt.smime({privateKey,value:encrypted});\r\nopenssl.datatype(decrypted,true);\r\nvar txt                 = openssl.text.decode(decrypted);\r\nopenssl.log(txt);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n\r\n### openssl.readfile\r\n\r\n- **openssl.readFile**\r\n\r\n---\r\n\r\nread a file from the emscripten filesystem\r\n\r\n```\r\nopenssl.readfile(name,{Module}={})\r\n```\r\n\r\n- **name** : string : filename\r\n- **Module** : emscripten module, optional\r\n\r\n<br>\r\n\r\n**return** {uint8,error}\r\n\r\n- **uint8** : uint8array : the file data\r\n- **error** : string : a string describing the error\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {uint8,error}   = openssl.readfile('private.key');\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.readfile.uint8\r\n\r\n---\r\n\r\nread a file from the emscripten filesystem\r\n\r\n```\r\nopenssl.readfile.uint8(name,{Module}={})\r\n```\r\n\r\n- **name** : string : filename\r\n- **Module** : emscripten module, optional\r\n\r\n<br>\r\n\r\n**return** {uint8,error}\r\n\r\n- **uint8** : uint8array : the file data\r\n- **error** : string : a string describing the error\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {uint8,error}   = openssl.readfile.uint8('private.key');\r\n```\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.readfile.txt\r\n\r\n---\r\n\r\nread a file from the emscripten filesystem and automatically return the text form\r\n\r\n```\r\nopenssl.readfile.txt(name,{Module}={})\r\n```\r\n\r\n- **name** : string : filename\r\n- **Module** : emscripten module, optional\r\n\r\n<br>\r\n\r\n**return** {txt,error}\r\n\r\n- **txt** : string : the file data\r\n- **error** : string : a string describing the error\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {txt,error}   = openssl.readfile.txt('private.key');\r\n```\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.readfile.blob\r\n\r\n---\r\n\r\nread a file from the emscripten filesystem and automatically return the blob form\r\n\r\n```\r\nopenssl.readfile.blob(name,{Module}={})\r\n```\r\n\r\n- **name** : string : filename\r\n- **Module** : emscripten module, optional\r\n\r\n<br>\r\n\r\n**return** {blob,error}\r\n\r\n- **blob** : blob : the file data\r\n- **error** : string : a string describing the error\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {blob,error}    = openssl.readfile.blob('private.key');\r\n```\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.writefile\r\n\r\n- writeFile\r\n\r\n---\r\n\r\nwrite a file to the emscripten filesystem\r\n\r\n```\r\nasync openssl.writefile(name,value,{Module}={})\r\n```\r\n\r\n- **name** : string : filename\r\n- **value** : uint8|string|blob|buffer : the file data\r\n\r\n<br>\r\n\r\n**return** {ok,error}\r\n\r\n- **ok** : string : ok\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {ok,error}    = await openssl.writefile('private.key','----- BEGIN PRIVATE KEY -----');\r\n```\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.writefile.uint8\r\n\r\n---\r\n\r\nwrite a file to the emscripten filesystem, providing the data in uint8 form\r\n\r\n```\r\nopenssl.writefile.uint8(name,uint8,{Module}={})\r\n```\r\n\r\n- **name** : string : filename\r\n- **uint8** : uint8array : file data\r\n\r\n<br>\r\n\r\n**return** {ok,error}\r\n\r\n- **ok** : string : ok\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar uint8         = new Uint8Array();\r\nvar {ok,error}    = openssl.writefile.uint8('private.key',uint8);\r\n```\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.writefile.blob\r\n\r\n---\r\n\r\nwrite a file to the emscripten filesystem, providing the data in blob form\r\n\r\n```\r\nasync openssl.writefile.blob(name,blob,{Module}={})\r\n```\r\n\r\n- **name** : string : filename\r\n- **blob** : blob : file data\r\n\r\n<br>\r\n\r\n**return** {ok,error}\r\n\r\n- **ok** : string : ok\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar blob          = new Blob(['----- BEGIN RIVATE KEY -----');\r\nvar {ok,error}    = openssl.writefile.blob('private.key',blob);\r\n```\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.writefile.txt\r\n\r\n---\r\n\r\nwrite a file to the emscripten filesystem, providing the data in blob form\r\n\r\n```\r\nopenssl.writefile.txt(name,txt,{Module}={})\r\n```\r\n\r\n- **name** : string : filename\r\n- **txt** : string : file data\r\n- **Module** : emscripten module, optional\r\n\r\n<br>\r\n\r\n**return** {ok,error}\r\n\r\n- **ok** : string : ok\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {ok,error}    = openssl.writefile.txt('private.key','----- BEGIN PRIVATE KEY -----');\r\n```\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n\r\n### openssl.writefile.config\r\n\r\n---\r\n\r\nconvience function to write a config json structure to the file system, it converts it to an .ini file first\r\n\r\n```\r\nopenssl.writefile.config(name,config,{Module}={})\r\n```\r\n\r\n- **name** : string : filename\r\n- **config** : json : the configuration information\r\n- **Module** : emscripten module, optional\r\n\r\n<br>\r\n\r\n**return** {ok,error}\r\n\r\n- **ok** : string : ok\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar config        = openssl.config.server();\r\nvar {ok,error}    = openssl.writefile.config('config.ini',config);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.download\r\n---\r\n\r\nhelper function for browser to download blob from v with optional mime type\r\n\r\n```\r\nopenssl.download(v,{type,name})\r\n```\r\n\r\n- **v** : any : blob to be constructed for download\r\n- **type** : string : mime type to be set for blob, optional\r\n- **name** : string : the filename, optional\r\n\r\n<br>\r\n\r\n**return**\r\n\r\n- **undefined** : no return value\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {opensslmod}                    = await import('https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.mjs');\r\nvar openssl                         = opensslmod();\r\nawait openssl.init();\r\n\r\nawait openssl.selfsigned({config:'server',cert_name:'server.pem'});\r\n\r\nvar {txt,error}    = openssl.readfile.txt('server.pem');\r\nopenssl.log(txt);\r\n\r\nopenssl.download(txt,{name:'server.pem'});\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.download.file\r\n---\r\n\r\nhelper funciton to download file from emscriptens file system\r\n\r\n```\r\nopenssl.download.file(name)\r\n```\r\n\r\n- **name** - string : path of the file to be downloaded\r\n\r\n<br>\r\n\r\n**return** {error}\r\n\r\n- **error** : string : error description\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {opensslmod}                    = await import('https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.mjs');\r\nvar openssl                         = opensslmod();\r\nawait openssl.init();\r\n\r\nawait openssl.selfsigned({config:'server',cert_name:'server.pem'});\r\nopenssl.download.file('server.pem');\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.download.blob\r\n---\r\n\r\nhelper function to download blob\r\n\r\n```\r\nopenssl.download.blob(blob)\r\n```\r\n\r\n- **blob** : blob : the blob to be downloaded\r\n\r\n<br>\r\n\r\n**return** undefined\r\n\r\n- **undefined** : no return value\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {opensslmod}                    = await import('https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.mjs');\r\nvar openssl                         = opensslmod();\r\nawait openssl.init();\r\n\r\nvar {privateKey,publicKey,error}    = await openssl.keypair();\r\nvar blob                            = new Blob([privateKey]);\r\nopenssl.download.blob(blob,'private.key');\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.FS\r\n---\r\n\r\nexposes emscripten file system API : \r\n\r\n[ File System API [emscripten.org] ](https://emscripten.org/docs/api_reference/Filesystem-API.html)\r\n\r\n***note***\r\n\r\nnot to be confused with openssl.fs ( lowercase )\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.fs.snapshot\r\n---\r\n\r\ncreate a snapshot of the file system\r\n\r\n```\r\nopenssl.fs.snapshot({path='/',Module}={})\r\n```\r\n\r\n- **path** : string : where to take the snapshot from\r\n- **Module** : emscripten Module : the emscripten Module to take the snapshot from, optional\r\n\r\n<br>\r\n\r\n**return**\r\n\r\n- **snapshot** : snapshot of the file system\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {opensslmod}                    = await import('https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.mjs');\r\nvar openssl                         = opensslmod();\r\nawait openssl.init();\r\nawait openssl.writefile('hello.txt','hello');\r\nvar snapshot                        = openssl.fs.snapshot();\r\nconsole.log('snapshot',snapshot);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.fs.restore\r\n---\r\n\r\nrestore a snapshot\r\n\r\n```\r\nopenssl.fs.restore({path='/',snapshot,Module})\r\n```\r\n\r\n- **path** : string : where to restore the snapshot\r\n- **snapshot** : snapshot : the snapshot to restore\r\n- **Module**  : emscripten Module : the module to restore the snapshot on, uses the current module if not specified, optional\r\n\r\n<br>\r\n\r\n**return** no return value\r\n\r\n- **undefined** \r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {opensslmod}                    = await import('https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.mjs');\r\nvar openssl                         = opensslmod();\r\nawait openssl.init();\r\n\r\nawait openssl.writefile('hello.txt','hello');\r\n\r\nvar snapshot                        = openssl.fs.snapshot();\r\nconsole.log('snapshot',snapshot);\r\n\r\nvar opensslmod2                     = openssl.new();\r\nvar openssl2                        = opensslmod2();\r\nawait openssl.init();\r\n\r\nopenssl.fs.restore({snapshot});\r\n\r\nvar {txt,error}                     = openssl.readfile.txt('hello.txt');\r\nconsole.log(txt);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.fs.diff\r\n\r\n---\r\n\r\ndetermine the difference of files between snapshot1 and snapshot 2\r\n\r\n```\r\nopenssl.fs.diff(snaphot1,snapshot2)\r\n```\r\n\r\n- **snapshot1** a filesystem snapshot\r\n- **snapshot2** a file system snapshot\r\n\r\n<br>\r\n\r\n**return** \r\n\r\n- **object** : keys are file paths, values are file data\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {opensslmod}                    = await import('https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.mjs');\r\nvar openssl                         = opensslmod();\r\nawait openssl.init();\r\n\r\nawait openssl.writefile('hello.txt','hello');\r\nvar snap1   = openssl.fs.snapshot();\r\n\r\nawait openssl.writefile('world.txt','world');\r\nvar snap2   = openssl.fs.snapshot();\r\n\r\nvar list    = openssl.fs.diff(snap1,snap2);\r\nObject.keys(list).forEach((key,i)=>console.log(i,key,openssl.datatype(list[key])));\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.fs.save\r\n---\r\n\r\nsave the current snapshot\r\n\r\n```\r\nopenssl.fs.save()\r\n```\r\n\r\n- no parameters\r\n\r\n<br>\r\n\r\n**return** snapshot\r\n\r\n- **object**\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {opensslmod}                    = await import('https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.mjs');\r\nvar openssl                         = opensslmod();\r\n\r\nawait openssl.writefile('hello.txt','hello');\r\nopenssl.fs.save();\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.fs.set\r\n---\r\n\r\nset the initial snapshot\r\n\r\n```\r\nopenssl.fs.set(snapshot)\r\n```\r\n\r\n- **snapshot** : object : the snapshot to set, optional, use the current snapshot if not set\r\n\r\n<br>\r\n\r\n**return** snapshot\r\n\r\n- **object**\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {opensslmod}                    = await import('https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.mjs');\r\nvar openssl                         = opensslmod();\r\n\r\nvar {privateKey,publicKey,error}    = await openssl.keypair();\r\nopenssl.fs.set();\r\nvar list                            = openssl.fs.complete();\r\nObject.keys(list).forEach(key=>console.log(key,openssl.datatype(list[key])));\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.fs.complete\r\n---\r\n\r\ndetermine the difference of files between initial snapshot and current snapshot\r\n\r\n```\r\nopenssl.fs.complete()\r\n```\r\n\r\n<br>\r\n\r\n**return**\r\n\r\n- **object** : keys are file paths, values are file data\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {opensslmod}                    = await import('https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.mjs');\r\nvar openssl                         = opensslmod();\r\n\r\nvar {privateKey,publicKey,error}    = await openssl.keypair();\r\nvar list                            = openssl.fs.complete();\r\nObject.keys(list).forEach(key=>console.log(key,openssl.datatype(list[key])));\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.fs.clear\r\n---\r\n\r\nclear the snapshot system\r\n\r\n```\r\nopenssl.fs.clear()\r\n```\r\n\r\n**return** no return value\r\n\r\n- **undefined**\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {opensslmod}                    = await import('https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.mjs');\r\nvar openssl                         = opensslmod();\r\n\r\nvar {privateKey,publicKey,error}    = await openssl.keypair();\r\nopenssl.fs.clear();\r\nvar list                            = openssl.fs.complete();\r\nObject.keys(list).forEach(key=>console.log(key,openssl.datatype(list[key])));\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.text.encode\r\n\r\n---\r\n\r\nencode text into buffer\r\n\r\n```\r\nopenssl.text.encode(v)\r\n```\r\n\r\n- **v** : string : the text to be encoded\r\n\r\n<br>\r\n\r\n**return**\r\n\r\n- **uint8** : the encoded text\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar uint8   = openssl.text.encode('helloworld');\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.text.decode\r\n\r\n---\r\n\r\ndecode a buffer into text\r\n\r\n```\r\nopenssl.text.decode(v)\r\n```\r\n\r\n- **v** : uint8 | arrayBuffer : the text to be decoded\r\n\r\n<br>\r\n\r\n**return**\r\n\r\n- **string** : the decoded text\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nawait openssl.keypair();\r\nvar {uint8:privateKey,error}      = openssl.readfile('private.key');\r\nopenssl.log.hex(privateKey);\r\nvar txt   = openssl.text.decode(privateKey);\r\nopenssl.log(txt);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n\r\n### openssl.to_uint8\r\n\r\n---\r\n\r\nconvert value to uint8array\r\n\r\n```\r\nasync openssl.to_uint8(v,type)\r\n```\r\n\r\n- **v** : uint8 | string | arraybuffer : the value to be converted to uint8array\r\n- **type** : string : used to specify the datatype of the value to be converted ( 'bin' for binary string ), optional\r\n  - bin : binary string\r\n\r\n<br>\r\n\r\n**return**\r\n\r\n- **uint8array** : the converted value\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar uint8   = await openssl.to_uint8('hello');\r\nopenssl.datatype(uint8,true);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n\r\n### openssl.from_uint8\r\n\r\n---\r\n\r\nconvert uint8array to another type\r\n\r\n```\r\nopenssl.from_uint8(uint8,type)\r\n```\r\n\r\n- **uint8** : uint8 : the source uint8array\r\n- **type** : string [ 'blob' | 'string' ] : the type to convert the uint8array to\r\n\r\n<br>\r\n\r\n**return**\r\n\r\n- **blob** : converted blob\r\n- **string** : converted string\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar txt     = 'hello';\r\nvar uint8   = openssl.text.encode(txt);\r\nvar txt     = openssl.from_uint8(uint8,'string');\r\nopenssl.log(txt);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n\r\n### openssl.to_hex\r\n\r\n---\r\n\r\nconvert buffer to hex string\r\n\r\n```\r\nopenssl.to_hex(uint8)\r\n```\r\n\r\n- **uint8** : uint8 : the buffer to be hex encoded\r\n\r\n<br>\r\n\r\n**return**\r\n\r\n- **string** : the hex encoded string\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar txt     = 'hello';\r\nvar uint8   = openssl.text.encode(txt);\r\nopenssl.log.hex(uint8);\r\nvar hex     = openssl.to_hex(uint8);\r\nopenssl.log(hex);\r\nvar uint8   = openssl.from_hex(hex);\r\nopenssl.log.hex(uint8);\r\nvar txt     = openssl.text.decode(uint8);\r\nopenssl.log(txt);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.from_hex\r\n\r\n---\r\n\r\ndecode hex string to buffer\r\n\r\n```\r\nopenssl.from_hex(hex)\r\n```\r\n\r\n- **hex** : string : the hex encoded string\r\n\r\n<br>\r\n\r\n**return**\r\n\r\n- **uint8** : the hex decoded buffer\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar txt     = 'hello';\r\nvar uint8   = openssl.text.encode(txt);\r\nvar hex     = openssl.to_hex(uint8);\r\nopenssl.log(hex);\r\nvar uint8   = openssl.from_hex(hex);\r\nvar txt     = openssl.text.decode(uint8);\r\nopenssl.log(txt);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n\r\n### openssl.to_blob\r\n\r\n---\r\n\r\nconvert value to blob\r\n\r\n```\r\nopenssl.to_blob(v)\r\n```\r\n\r\n- **v** : uint8 | string | blob | arrayBuffer : the value to be converted\r\n- **log_flag** : truethy | true : automatically output to stdout and console.log if echo is set, true just console.log regardless of echo\r\n\r\n<br>\r\n\r\n**return** blob\r\n\r\n- **blob** : the converted blob\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar v       = 'helloworld';\r\nvar blob    = openssl.to_blob(v);\r\nopenssl.datatype(blob,true);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.from_blob\r\n\r\n---\r\n\r\nconvert blob to another value\r\n\r\n```\r\nasync openssl.from_blob(blob,type='uint8')\r\n```\r\n\r\n- **blob** : blob : the blob to be converted\r\n- **type** : string [ 'string' | 'uint8' ] : the type for the blob to be converted to\r\n\r\n<br>\r\n\r\n**return** \r\n\r\nthe converted value\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar blob    = new Blob(['helloworld']);\r\nvar txt     = await openssl.from_blob(blob,'string');\r\nopenssl.log(txt);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.to_b64\r\n\r\nencode buffer as base64\r\n\r\n```\r\nopenssl.to_b64(v,type)\r\n```\r\n\r\n- **v** : uint8 : the buffer to be encoded\r\n\r\n<br>\r\n\r\n**return**\r\n\r\n- **string** : the base64 text\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar txt     = 'helloworld';\r\nvar uint8   = openssl.text.encode(txt);\r\nopenssl.log.hex(uint8);\r\nvar b64     = openssl.to_b64(uint8);\r\nopenssl.log(b64);\r\nvar uint8   = openssl.from_b64(b64);\r\nopenssl.log.hex(uint8);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.from_b64\r\n\r\ndecode base64 to buffer\r\n\r\n```\r\nopenssl.from_b64(b64,type='uint8')\r\n```\r\n\r\n- **b64** : string : the base64\r\n- **type** : string : the return type\r\n\r\n<br>\r\n\r\n**return**\r\n\r\n- **uint8** : the decoded base64\r\n\r\n<br>\r\n\r\n***exaples***\r\n\r\n```\r\nvar txt     = 'helloworld';\r\nvar uint8   = openssl.text.encode(txt);\r\nopenssl.log.hex(uint8);\r\nvar b64     = openssl.to_b64(uint8);\r\nopenssl.log(b64);\r\nvar uint8   = openssl.from_b64(b64);\r\nopenssl.log.hex(uint8);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.normalise_pem\r\n\r\n- **openssl.norm_pem(pem)**\r\n\r\n---\r\n\r\nhelper function to normalise a pem certificate contained in a string, helps with embedding pem encoding certs in code.\r\n\r\nOutputs a string that tries to be recognisable by openssl.\r\n\r\n```\r\nopenssl.normalise_pem(pem)\r\n```\r\n\r\n- **pem** : string : pem encoded key / cert\r\n\r\n<br>\r\n\r\n**return** : string\r\n\r\n- **string** : normalised pem\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {opensslmod}                    = await import('https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.mjs');\r\nvar openssl                         = opensslmod();\r\n\r\n(()=>{\r\n\r\n        var pem   = `\r\n              -----BEGIN CERTIFICATE-----\r\n              MIIGBDCCA+ygAwIBAgIUUvpdPtk+/sKOzb388cnfFYgcLOQwDQYJKoZIhvcNAQEL\r\n              ...\r\n              QoHwT4dP9Bc=\r\n              -----END CERTIFICATE-----\r\n        `;\r\n        \r\n        pem   = openssl.norm_pem(pem);\r\n        openssl.log(pem);\r\n\r\n})();        \r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.datatype\r\n\r\n---\r\n\r\nhelper function to return the datatype of v\r\n\r\n```\r\nopenssl.datatype(v)\r\n```\r\n\r\n- **v** - any : the parameter whose datatype needs to be determined\r\n\r\n<br>\r\n\r\n**return** \r\n\r\n- **string** : the datatype\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar {opensslmod}                    = await import('https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.mjs');\r\nvar openssl                         = opensslmod();\r\n\r\nvar a       = [];\r\nvar type    = openssl.datatype(a);\r\nconsole.log(type);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.rndbytes\r\n\r\n---\r\n\r\ngenerate a buffer of random values\r\n\r\n```\r\nopenssl.rndbytes(n=32)\r\n```\r\n\r\n- **n** : number : the number of bytes\r\n\r\n<br>\r\n\r\n**return**\r\n\r\n- **uint8array** : the random bytes\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar uint8   = openssl.rndbytes();\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.config[name]()\r\n\r\n- **name = [ ca | server | client | codeSigning | email | ocspResponder | timestmap | ipsec | device ]**\r\n \r\n---\r\n\r\ngenerate a template config object\r\n\r\n```\r\nopenssl.config[name]()\r\n```\r\n\r\n<br>\r\n\r\n**return**\r\n\r\n- **object** : configuration object\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar config    = openssl.config.ca();\r\nopenssl.log.json(config);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.log\r\n\r\n---\r\n\r\nhelper function to log to the console and stdout, uses echo flag and stdout paramseter\r\n\r\n```\r\nopenssl.log(argN)\r\n```\r\n\r\n- **argN** : any : sequence of arguments to be logged\r\n\r\n<br>\r\n\r\n**return** no return value\r\n\r\n- **undefined**\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nopenssl.log('helloworld');\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.log.json\r\n\r\n---\r\n\r\nhelper function to perform JSON.stringify then log\r\n\r\n```\r\nopenssl.log.json(v)\r\n```\r\n\r\n- **v** : any : the value to be logged\r\n\r\n<br>\r\n\r\n**return** no return value\r\n\r\n- **undefined**\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nopenssl.log.json([1,2,3]);\r\n```\r\n\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n### openssl.log.hex\r\n\r\n---\r\n\r\nhelper function to log a hex dump of value\r\n\r\n```\r\nopenssl.log.hex(v)\r\n```\r\n\r\n- **v** : uint8 : the value to be hex dumped\r\n\r\n<br>\r\n\r\n**return** no return value\r\n\r\n- **undefined**\r\n\r\n<br>\r\n\r\n***examples***\r\n\r\n```\r\nvar uint8   = [1,2,3];\r\nopenssl.log.hex(uint8);\r\n```\r\n\r\n<br>\r\n\r\n---\r\n\r\n---\r\n\r\n\r\n\r\n---\r\n\r\n<br>\r\n\r\n\r\n## Further Reading\r\n\r\n[https://docs.openssl.org/master/](https://docs.openssl.org/master/)\r\n\r\n[https://emscripten.org/docs/api_reference/Filesystem-API.html](https://emscripten.org/docs/api_reference/Filesystem-API.html)\r\n\r\n\r\n<br>\r\n\r\n\r\n## See Also\r\n\r\n[https://www.npmjs.com/package/node-forge-browser](https://www.npmjs.com/package/node-forge-browser)\r\n\r\n[https://ext-code.com/utils/x509/index.html](https://ext-code.com/utils/x509/index.html)\r\n\r\n[https://ext-code.com/utils/x509/generate-https-certificate/generate-https-certificate.html](https://ext-code.com/utils/x509/generate-https-certificate/generate-https-certificate.html)\r\n\r\n[https://ext-code.com/utils/x509/certificate-info/certificate-info.html](https://ext-code.com/utils/x509/certificate-info/certificate-info.html)\r\n\r\n\r\n---\r\n\r\n\r\n<br>\r\n\r\n\r\n## Examples\r\n\r\n\r\n### Browser\r\n\r\n```\r\n\r\n<script type=module>\r\n\r\n        import {opensslmod} from 'https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.mjs';\r\n        \r\n  \r\n        var stdout    = console.log.bind(console,'[ stdout ]');\r\n        var stderr    = console.log.bind(console,'[ stderr ]');\r\n        \r\n        var openssl   = opensslmod({stdout,stderr,echo:false});\r\n        \r\n        \r\n        await openssl.run('openssl -v');\r\n\r\n        \r\n        await openssl.run('openssl genrsa -out test.key 2048');\r\n        var key   = openssl.FS.readFile('test.key',{encoding:'utf8'});\r\n        console.log(key);\r\n        \r\n        \r\n        await openssl.run('req -new -x509 -key test.key -out test.pem -subj /CN=webcontainer-test');\r\n        var cert   = openssl.FS.readFile('test.pem',{encoding:'utf8'});\r\n        console.log(cert);\r\n\r\n        var result    = openssl.fs.complete();\r\n        console.log(result);\r\n        \r\n        \r\n        //  openssl.fs.download.file('test.pem');\r\n        //  openssl.fs.download(cert,'cert.pem');\r\n        \r\n        \r\n</script>\r\n\r\n```\r\n\r\n---\r\n\r\n\r\n### Browser\r\n\r\n```\r\n\r\n<script type=module>\r\n\r\n        var {opensslmod}    = await import('https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.mjs');\r\n        \r\n  \r\n        var stdout    = console.log.bind(console,'[ stdout ]');\r\n        var stderr    = console.log.bind(console,'[ stderr ]');\r\n        \r\n        var openssl   = opensslmod({stdout,stderr,echo:false});\r\n        \r\n        \r\n        await openssl.run('openssl -v');\r\n\r\n        \r\n        await openssl.run(\r\n              'openssl genrsa -out test.key 2048',\r\n              'openssl req -new -x509 -key test.key -out test.pem -subj /CN=webcontainer-test'\r\n        );\r\n        \r\n        \r\n        var key   = openssl.FS.readFile('test.key',{encoding:'utf8'});\r\n        console.log(key);\r\n        \r\n        var cert   = openssl.FS.readFile('test.pem',{encoding:'utf8'});\r\n        console.log(cert);\r\n\r\n        var result    = openssl.fs.complete();\r\n        console.log(result);\r\n        \r\n\r\n        //  openssl.fs.download.file('test.pem');\r\n        //  openssl.fs.download(cert,'cert.pem');\r\n        \r\n</script>\r\n\r\n```\r\n\r\n---\r\n\r\n\r\n### Browser\r\n\r\n```\r\n\r\n<script src='https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.js'></script>\r\n\r\n<script>\r\n\r\n(async()=>{\r\n  \r\n        var openssl   = opensslmod();\r\n        \r\n        await openssl.run('openssl -v');\r\n\r\n        \r\n        await openssl.run('openssl genrsa -out test.key 2048');\r\n        var key   = openssl.FS.readFile('test.key',{encoding:'utf8'});\r\n        console.log(key);\r\n        \r\n        \r\n        await openssl.run('req -new -x509 -key test.key -out test.pem -subj /CN=webcontainer-test');\r\n        var cert   = openssl.FS.readFile('test.pem',{encoding:'utf8'});\r\n        console.log(cert);\r\n\r\n        var result    = openssl.fs.complete();\r\n        console.log(result);\r\n\r\n\r\n        //  openssl.fs.download.file('test.pem');\r\n        //  openssl.fs.download(cert,'cert.pem');\r\n        \r\n})();\r\n\r\n</script>\r\n\r\n```\r\n\r\n---\r\n\r\n### NodeJS\r\n\r\n```\r\nnpm i openssl-browser\r\n```\r\n\r\n```\r\n\r\n        import {opensslmod} from 'openssl-browser';\r\n                                                                                  console.log('test.node.mjs');\r\n        var openssl   = opensslmod({echo:true,df:false});\r\n        \r\n        await openssl.run('-v');\r\n\r\n        \r\n        var {hash,error}    = await openssl.sha512('helloworld');\r\n                                                                                  console.log('sha512 : ');\r\n                                                                                  console.log(hash);\r\n\r\n```\r\n\r\n---\r\n\r\n### NodeJS\r\n\r\n```\r\nnpm i openssl-browser\r\n```\r\n\r\n```\r\n\r\n(async()=>{\r\n                                                                                console.log('test.node.js');      \r\n        var opensslmod    = require('openssl-browser');\r\n        \r\n        var openssl   = opensslmod({echo:true});\r\n        \r\n        await openssl.run('-v');\r\n\r\n\r\n        var {privateKey,publicKey}    = await openssl.generateKeyPair();\r\n                                                                                console.log('privateKey :');\r\n                                                                                console.log(privateKey);\r\n                                                                                \r\n                                                                                console.log('publicKey :');\r\n                                                                                console.log(publicKey);\r\n      \r\n})();\r\n\r\n```\r\n\r\n---\r\n\r\n\r\n### Browser\r\n\r\n```\r\n\r\n<style>#output{font-family:monospace}</style>\r\n\r\n<h3>openssl-browser</h3>\r\n\r\n<pre id=output></pre>\r\n\r\n\r\n<script type=module>\r\n                                                                                console.clear();\r\n                                                                                console.log('http-local.html');\r\n\r\n        var {opensslmod}    = await import('https://libs.ext-code.com/js/crypto/openssl/v2.0.0/openssl.mjs');\r\n        \r\n        var stdout    = txt=>output.append('[ stdout ] ',txt,'\\n');\r\n        var stderr    = txt=>output.append('[ stderr ] ',txt,'\\n');\r\n        \r\n        var openssl   = opensslmod({stdout,stderr});\r\n        openssl.df    = true;\r\n                                                                                //  create the emscripten filesystem for this example\r\n        \r\n        await openssl.init();\r\n        \r\n        \r\n        var txt   = `\r\n[ req ]\r\ndistinguished_name = req_distinguished_name\r\nx509_extensions = v3_ca\r\nprompt = no\r\n\r\n[ req_distinguished_name ]\r\nC  = GB\r\nST = England\r\nL  = Sheffield\r\nO  = My Organisation\r\nOU = Certificate Authority\r\nCN = My Test CA\r\nemailAddress = admin@example.com\r\n\r\n[ v3_ca ]\r\nbasicConstraints = critical, CA:TRUE\r\nkeyUsage = critical, keyCertSign, cRLSign\r\nsubjectKeyIdentifier = hash\r\nnameConstraints = critical, @nc\r\n\r\n[ nc ]\r\npermitted;DNS.1 = example.com\r\npermitted;DNS.2 = .example.com\r\npermitted;DNS.3 = .internal.local\r\nexcluded;DNS.1 = .malicious.com\r\npermitted;IP.1 = 192.168.0.0/255.255.0.0\r\npermitted;IP.2 = 10.0.0.0/255.0.0.0\r\n`;\r\n\r\n        openssl.FS.writeFile('ca-ext.ini',txt);\r\n        \r\n        await openssl.run(\r\n              'openssl genrsa -out ca.key 2048',\r\n              'openssl req -new -x509 -key ca.key -out ca.cert -days 365 -config ca-ext.ini -extensions v3_ca',\r\n              'openssl x509 -in ca.cert -text -noout'\r\n        );\r\n        \r\n        var txt   = openssl.FS.readFile('ca.key',{encoding:'utf8'});\r\n        stdout('ca.key');\r\n        stdout(txt);\r\n        var txt   = openssl.FS.readFile('ca.cert',{encoding:'utf8'});\r\n        stdout('ca.cert');\r\n        stdout(txt);\r\n\r\n        var txt   = `\r\n[ req ]\r\ndistinguished_name = req_distinguished_name\r\nreq_extensions     = v3_req\r\nprompt             = no\r\n\r\n[ req_distinguished_name ]\r\nC  = GB\r\nST = England\r\nL  = Sheffield\r\nO  = My Organisation\r\nOU = Web Services\r\nCN = example.com\r\n\r\n[ v3_req ]\r\nbasicConstraints = CA:FALSE\r\nkeyUsage         = digitalSignature, keyEncipherment\r\nextendedKeyUsage = serverAuth, clientAuth\r\nsubjectAltName   = @san\r\n\r\n[ san ]\r\nDNS.1 = example.com\r\nDNS.2 = www.example.com\r\nDNS.2 = api.example.com\r\nIP.1  = 192.168.1.10\r\nIP.2  = 10.0.0.5\r\n        `;\r\n        \r\n        openssl.FS.writeFile('ext.ini',txt);\r\n        \r\n        await openssl.run(\r\n              'openssl genrsa -out server.key 2048',\r\n              'openssl req -new -key server.key -out server.csr -config ext.ini',\r\n              'openssl x509 -req -in server.csr -CA ca.cert -CAkey ca.key -CAcreateserial -out server.cert -days 365 -extensions v3_req -extfile ext.ini',\r\n              'openssl x509 -in server.cert -text -noout'\r\n        );\r\n        \r\n        var txt   = openssl.FS.readFile('server.key',{encoding:'utf8'});\r\n        stdout('server.key');\r\n        stdout(txt);\r\n        var txt   = openssl.FS.readFile('server.cert',{encoding:'utf8'});\r\n        stdout('server.cert');\r\n        stdout(txt);\r\n\r\n        stdout('verify');\r\n        await openssl.run(\r\n              'openssl verify -CAfile ca.cert server.cert'\r\n        );\r\n        \r\n\r\n</script>\r\n\r\n```\r\n\r\n---\r\n\r\n\r\n#### note : locally hosted\r\n\r\n```\r\n\r\nnpm i openssl-browser\r\n\r\n```\r\n\r\nthen run a local web server\r\n\r\n```\r\n\r\n<style>#output{font-family:monospace}</style>\r\n\r\n<h3>openssl-browser</h3>\r\n\r\n<pre id=output></pre>\r\n\r\n\r\n<script type=module>\r\n                                                                                console.clear();\r\n                                                                                console.log('http-local.html');\r\n\r\n        import {opensslmod} from '/node_modules/openssl-browser/openssl.mjs';\r\n        \r\n        var stdout    = txt=>output.append('[ stdout ] ',txt,'\\n');\r\n        var stderr    = txt=>output.append('[ stderr ] ',txt,'\\n');\r\n        var wasmJs    = '/node_modules/openssl-browser/openssl.wasm.js';\r\n        \r\n        var openssl   = opensslmod({stdout,stderr,wasmJs});\r\n        openssl.df    = true;\r\n                                                                                //  create the emscripten filesystem for this example\r\n        \r\n        await openssl.init();\r\n        \r\n        \r\n        var txt   = `\r\n[ req ]\r\ndistinguished_name = req_distinguished_name\r\nx509_extensions = v3_ca\r\nprompt = no\r\n\r\n[ req_distinguished_name ]\r\nC  = GB\r\nST = England\r\nL  = Sheffield\r\nO  = My Organisation\r\nOU = Certificate Authority\r\nCN = My Test CA\r\nemailAddress = admin@example.com\r\n\r\n[ v3_ca ]\r\nbasicConstraints = critical, CA:TRUE\r\nkeyUsage = critical, keyCertSign, cRLSign\r\nsubjectKeyIdentifier = hash\r\nnameConstraints = critical, @nc\r\n\r\n[ nc ]\r\npermitted;DNS.1 = example.com\r\npermitted;DNS.2 = .example.com\r\npermitted;DNS.3 = .internal.local\r\nexcluded;DNS.1 = .malicious.com\r\npermitted;IP.1 = 192.168.0.0/255.255.0.0\r\npermitted;IP.2 = 10.0.0.0/255.0.0.0\r\n`;\r\n\r\n        openssl.FS.writeFile('ca-ext.ini',txt);\r\n        \r\n        await openssl.run(\r\n              'openssl genrsa -out ca.key 2048',\r\n              'openssl req -new -x509 -key ca.key -out ca.cert -days 365 -config ca-ext.ini -extensions v3_ca',\r\n              'openssl x509 -in ca.cert -text -noout'\r\n        );\r\n        \r\n        var txt   = openssl.FS.readFile('ca.k","readmeFilename":"readme.md"}