Skip to content

Commit 1fa5e3f

Browse files
save file
1 parent 4773d19 commit 1fa5e3f

1 file changed

Lines changed: 230 additions & 0 deletions

File tree

Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
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

Comments
 (0)