|
| 1 | + |
| 2 | + |
| 3 | +!async function(){ |
| 4 | + console.clear(); |
| 5 | + |
| 6 | + const crypto = require('crypto'); |
| 7 | + |
| 8 | + var {key,cert} = setup(); |
| 9 | + |
| 10 | + |
| 11 | + |
| 12 | + |
| 13 | + var secret = 'hello world'; |
| 14 | + var blob = new Blob([secret]); |
| 15 | + |
| 16 | + |
| 17 | + var encrypted_blob = await encrypt(blob,cert); |
| 18 | + var b64 = await blob_b64(encrypted_blob); |
| 19 | + console.log('Encrypted:',b64); |
| 20 | + |
| 21 | + var encrypted_blob = b64_blob(b64); |
| 22 | + var blob = await decrypt(encrypted_blob,key); |
| 23 | + var decrypted = await blob.text(); |
| 24 | + console.log('Decrypted:', decrypted); |
| 25 | + |
| 26 | + |
| 27 | + //: |
| 28 | + |
| 29 | + |
| 30 | + function extract_spki(certPem){ |
| 31 | + |
| 32 | + certPem = normalisePem(certPem); |
| 33 | + var publicKey = crypto.createPublicKey(certPem); |
| 34 | + var spkiDer = publicKey.export({type:'spki',format:'der'}); |
| 35 | + var uint8 = new Uint8Array(spkiDer); |
| 36 | + return uint8 |
| 37 | + |
| 38 | + }//extract_spki |
| 39 | + |
| 40 | + |
| 41 | + async function pub_key(cert){ |
| 42 | + |
| 43 | + var spki = extract_spki(cert); |
| 44 | + var buf = spki.buffer; |
| 45 | + var pub_key = await crypto.subtle.importKey('spki',buf,{name:'RSA-OAEP',hash:'SHA-256'},true,['encrypt']); |
| 46 | + return pub_key; |
| 47 | + |
| 48 | + }//pub_key |
| 49 | + |
| 50 | + |
| 51 | + async function encrypt(blob,cert){ |
| 52 | + |
| 53 | + var publicKey = await pub_key(cert); |
| 54 | + var buf = await blob.arrayBuffer(); |
| 55 | + var encrypted = await crypto.subtle.encrypt({name:'RSA-OAEP'},publicKey,buf); |
| 56 | + var uint8 = new Uint8Array(encrypted); |
| 57 | + var blob = new Blob([uint8]); |
| 58 | + return blob; |
| 59 | + |
| 60 | + }//encrypt |
| 61 | + |
| 62 | + |
| 63 | + //: |
| 64 | + |
| 65 | + |
| 66 | + async function priv_key(pem){ |
| 67 | + |
| 68 | + var b64 = pem.replace(/-----BEGIN PRIVATE KEY-----/, '') |
| 69 | + .replace(/-----END PRIVATE KEY-----/, '') |
| 70 | + .replace(/\s+/g, ''); |
| 71 | + var uint8 = b64_uint8(b64); |
| 72 | + var buf = uint8.buffer; |
| 73 | + var priv_key = await crypto.subtle.importKey('pkcs8',buf,{name:'RSA-OAEP',hash:'SHA-256',},true,['decrypt']); |
| 74 | + return priv_key; |
| 75 | + |
| 76 | + }//priv_key |
| 77 | + |
| 78 | + |
| 79 | + async function decrypt(blob,key){ |
| 80 | + |
| 81 | + var privateKey = await priv_key(key); |
| 82 | + var uint8 = await blob_uint8(blob); |
| 83 | + var buffer = await crypto.subtle.decrypt({name:'RSA-OAEP',},privateKey,uint8); |
| 84 | + var blob = new Blob([buffer]); |
| 85 | + return blob; |
| 86 | + |
| 87 | + }//decrypt |
| 88 | + |
| 89 | + |
| 90 | + //: |
| 91 | + |
| 92 | + |
| 93 | + function b64_uint8(b64){ |
| 94 | + |
| 95 | + var bin = atob(b64); |
| 96 | + var uint8 = bin_uint8(bin); |
| 97 | + return uint8; |
| 98 | + |
| 99 | + }//b64_uint8 |
| 100 | + |
| 101 | + |
| 102 | + async function blob_uint8(blob){ |
| 103 | + |
| 104 | + var buf = await blob.arrayBuffer(); |
| 105 | + var uint8 = new Uint8Array(buf); |
| 106 | + return uint8; |
| 107 | + |
| 108 | + }//blob_uint8 |
| 109 | + |
| 110 | + |
| 111 | + async function blob_b64(blob){ |
| 112 | + |
| 113 | + var buf = await blob.arrayBuffer(); |
| 114 | + var bytes = new Uint8Array(buf); |
| 115 | + var bin = bytes.reduce((acc,byte)=>acc+=String.fromCharCode(byte),''); |
| 116 | + var b64 = btoa(bin); |
| 117 | + return b64; |
| 118 | + |
| 119 | + }//blob_b64 |
| 120 | + |
| 121 | + |
| 122 | + function b64_blob(b64){ |
| 123 | + |
| 124 | + var bin = atob(b64); |
| 125 | + var bytes = [...bin].map(c=>c.charCodeAt(0)); |
| 126 | + var buf = new Uint8Array(bytes); |
| 127 | + var blob = new Blob([buf]); |
| 128 | + return blob; |
| 129 | + |
| 130 | + }//b64_blob |
| 131 | + |
| 132 | + |
| 133 | + function bin_uint8(bin){ |
| 134 | + |
| 135 | + var uint8 = Uint8Array.from(bin,c=>c.charCodeAt(0)); |
| 136 | + return uint8; |
| 137 | + |
| 138 | + }//bin_uint8 |
| 139 | + |
| 140 | + |
| 141 | + function normalisePem(pem){ |
| 142 | + |
| 143 | + pem = pem.replace(/\r/g,''); |
| 144 | + var lines = pem.split('\n'); |
| 145 | + var n = lines.length; |
| 146 | + for(var i=1;i<n-1;i++){ |
| 147 | + |
| 148 | + var line = lines[i]; |
| 149 | + line = line.trimStart(); |
| 150 | + lines[i] = line; |
| 151 | + |
| 152 | + }//for |
| 153 | + pem = lines.join('\n').trim(); |
| 154 | + return pem; |
| 155 | + |
| 156 | + }//normalisePem |
| 157 | + |
| 158 | + |
| 159 | + //: |
| 160 | + |
| 161 | + |
| 162 | + function setup(){ |
| 163 | + |
| 164 | + var key = ` |
| 165 | + -----BEGIN PRIVATE KEY----- |
| 166 | + MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCxmOIm6QsAC/59 |
| 167 | + OMC/fkLkf4eAuKggR8400SkbtquAk7+z/4mrdlnCnOnpUQqUEr/AN6xDJZqkbxRL |
| 168 | + ZRwtlaffZbER1cW3Tbk8xDOzmQiVF/frLJwXjiK8JzfVnqpdVym5w5nK313hJ6OX |
| 169 | + tQBrdfMgMKTA84nhbLHtW2CFbOY3yc7dntuUqRkAY53Hry3R3n5pZtJdyjTEVnoz |
| 170 | + fURCwEFfnfQxMJJ8ia5oG9w5MIZXi2s+AC2+WCEXYU3K+Wrua74M0S1cLlgRojer |
| 171 | + sOctsTpppXLpDh+OtINGiLI9citrH+nLBf61N8Vh5Pzqpx07k4J1qLoBGDXhs9IX |
| 172 | + bJZEBhuBAgMBAAECggEANyd0rILZULVo3ni+m3nZyl60tUwjoorKRmriqmGrl23L |
| 173 | + Llpg5egGbkMO/c+WSnAcLtTbYasPAJwioFuRSbLdhKpvOEu8cHXp3i5MpC0Vlj/w |
| 174 | + VY/wFfylWuuPEn+JBx3nrnJJk9CUtjT6QEYNEFJ8I/YXZHj9zA1WoJEtQ6KTSKWV |
| 175 | + c9Ni4SxYqkY0rBvzT/2gGeY2MbGPUGUENLdMFxRdPPCu4XxmM/C/vVG0jJKbvBDT |
| 176 | + 8UOSHUwGCpnVSqWAeqNYyDjvZu+unDLZXSc87QSN8Y4H9OGAJ96YW1AGcSamkz8m |
| 177 | + Qb0u4vpFnfjzhCN4IBWMZNq8DPV7J3MJwK1RzdglBQKBgQDw9X7DrWDC//+D8p8D |
| 178 | + 2UIN8OlTeVnLveUFZbQLoPPIPaEkw02K2m4Ho8+g/lHnHRygh/aRds9RiBKJ0ydv |
| 179 | + gkJwkN9JJ1YzRfpXUNCY+Dv83yXvnoVaX2db/gpFTEEYdU0f7n+GxeEfeIAepcUw |
| 180 | + 24RSQv5pwT6PhDK6D//mX9FuvwKBgQC8rt9SBPODD4lbjGEvpQGD1Y0HQGma/4Vo |
| 181 | + 9XAoqnJZCt7DgNAt52Aq9fAC2hR263x2yh4/Bx7pkDCRLAvz2UpNU3jyNRUNVszm |
| 182 | + INVv5u1vrO/dnWeqHL1IkNM6wPQzMu5HFuGzkK/hqqxHq+vx1vaXnylXAfWyh2/Y |
| 183 | + zZCakdVFvwKBgDLFd5Vhhd7ws/UofSsBbzKizXciPbJ5a7VMbbh5jIRnv/mQEVmt |
| 184 | + lruTX59rlvRcpPiKTYDvCNYEFuvliwyq5Lb1P6cZW8dn+kzFoX5p57HrjwHDZBPb |
| 185 | + wFqY168sVxcBOGP/C+3o6fuIl25dvYQC7QmsRhEgf78butiLoH75N5bfAoGBALbY |
| 186 | + K9earrRCGRTba86080vjZUAyvmQS3CDDQAZYbmk1bHw+Vv806e+X1xecaBp5x2qC |
| 187 | + IV9osh8auMXlzktnNWbLzjfBEv6TMAqOpOdE/LCtAOFcyPmD0jYBCoE0PTFkWJ4R |
| 188 | + YXUWcCqar0rhIsuASgTSm0gSwRtZvhx10HzJd8iXAoGAB4R5cCA6RAVzlJVXYVQ7 |
| 189 | + 8rAgrI4TiQ6+Jzdq9VNRyLnMJ1ABIN5RK4pa+Gd4LQuSWPyAp8PoVzrN9tv3x0om |
| 190 | + yu1oIACUws53sGrzHpEEvCsUMzzLoDjukcViWE3njfQCq8mhW8JUH15lAh/+L7rK |
| 191 | + 7mJ3nfrCVI3DR83ar/sRG4Q= |
| 192 | + -----END PRIVATE KEY----- |
| 193 | + `; |
| 194 | + |
| 195 | + var cert = ` |
| 196 | + -----BEGIN CERTIFICATE----- |
| 197 | + MIIDfDCCAmSgAwIBAgIIpL8fq0UzAwgwDQYJKoZIhvcNAQELBQAwJTEjMCEGA1UE |
| 198 | + AxMabG9jYWxob3N0IHRlc3QgY2VydGlmaWNhdGUwHhcNMjYwNDI2MTgxOTAwWhcN |
| 199 | + MjcwNDI2MTgxOTAwWjAlMSMwIQYDVQQDExpsb2NhbGhvc3QgdGVzdCBjZXJ0aWZp |
| 200 | + Y2F0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALGY4ibpCwAL/n04 |
| 201 | + wL9+QuR/h4C4qCBHzjTRKRu2q4CTv7P/iat2WcKc6elRCpQSv8A3rEMlmqRvFEtl |
| 202 | + HC2Vp99lsRHVxbdNuTzEM7OZCJUX9+ssnBeOIrwnN9Weql1XKbnDmcrfXeEno5e1 |
| 203 | + AGt18yAwpMDzieFsse1bYIVs5jfJzt2e25SpGQBjncevLdHefmlm0l3KNMRWejN9 |
| 204 | + RELAQV+d9DEwknyJrmgb3DkwhleLaz4ALb5YIRdhTcr5au5rvgzRLVwuWBGiN6uw |
| 205 | + 5y2xOmmlcukOH460g0aIsj1yK2sf6csF/rU3xWHk/OqnHTuTgnWougEYNeGz0hds |
| 206 | + lkQGG4ECAwEAAaOBrzCBrDAMBgNVHRMBAf8EAjAAMCAGA1UdEQQZMBeCCWxvY2Fs |
| 207 | + aG9zdIcEfwAAAYcEfwAAAjAdBgNVHQ4EFgQU3k/k6mVExJziZIwxZxmdsP6lPJEw |
| 208 | + CwYDVR0PBAQDAgL0MDsGA1UdJQQ0MDIGCCsGAQUFBwMCBggrBgEFBQcDAwYIKwYB |
| 209 | + BQUHAwQGCCsGAQUFBwMBBggrBgEFBQcDCDARBglghkgBhvhCAQEEBAMCAOcwDQYJ |
| 210 | + KoZIhvcNAQELBQADggEBAEyq4Fog+tbPN5jzjWz19GreYZdStt7MDPLW9nbL38TK |
| 211 | + 6DlGZV37HTGdp5F+IWDImh2gCUzPSK9D9QPWNVVG85qC3oZnSktKxjeucjBsMtMi |
| 212 | + v18gTYyCdF/nQm34czuYjnPA44RJCiqsJreBtaNERPHP+ki++nsq707dBq8pfl+r |
| 213 | + ox+kK4iUcI3x/F6CvDMru1LXxAU81kLY+F7RqJRieZr+SaOxPtlz4+U/HxY5k9FK |
| 214 | + ImLsCyhzLJREirc892Cbb8s8Q9mJKnQtydpG7U2SGd/D+Gapwql5Lg1VM+PaJgWW |
| 215 | + 8nq7W+J/VuFG+JOzYSKe9qzEVnsmnbxvxwZpW6VuFEE= |
| 216 | + -----END CERTIFICATE----- |
| 217 | + `; |
| 218 | + |
| 219 | + return {key,cert}; |
| 220 | + |
| 221 | + }//setup |
| 222 | + |
| 223 | + |
| 224 | + |
| 225 | + |
| 226 | +}(); |
| 227 | + |
| 228 | + |
| 229 | + |
| 230 | + |
0 commit comments