Skip to content

Commit 2929a68

Browse files
committed
Update JavaScript lib
1 parent 644386f commit 2929a68

3 files changed

Lines changed: 754 additions & 0 deletions

File tree

js/base64.js

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
/*
2+
* Copyright (c) 2014 - 2020 The GmSSL Project. All rights reserved.
3+
*
4+
* Redistribution and use in source and binary forms, with or without
5+
* modification, are permitted provided that the following conditions
6+
* are met:
7+
*
8+
* 1. Redistributions of source code must retain the above copyright
9+
* notice, this list of conditions and the following disclaimer.
10+
*
11+
* 2. Redistributions in binary form must reproduce the above copyright
12+
* notice, this list of conditions and the following disclaimer in
13+
* the documentation and/or other materials provided with the
14+
* distribution.
15+
*
16+
* 3. All advertising materials mentioning features or use of this
17+
* software must display the following acknowledgment:
18+
* "This product includes software developed by the GmSSL Project.
19+
* (http://gmssl.org/)"
20+
*
21+
* 4. The name "GmSSL Project" must not be used to endorse or promote
22+
* products derived from this software without prior written
23+
* permission. For written permission, please contact
24+
25+
*
26+
* 5. Products derived from this software may not be called "GmSSL"
27+
* nor may "GmSSL" appear in their names without prior written
28+
* permission of the GmSSL Project.
29+
*
30+
* 6. Redistributions of any form whatsoever must retain the following
31+
* acknowledgment:
32+
* "This product includes software developed by the GmSSL Project
33+
* (http://gmssl.org/)"
34+
*
35+
* THIS SOFTWARE IS PROVIDED BY THE GmSSL PROJECT ``AS IS'' AND ANY
36+
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
38+
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE GmSSL PROJECT OR
39+
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
41+
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
42+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
43+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
44+
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
45+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
46+
* OF THE POSSIBILITY OF SUCH DAMAGE.
47+
*/
48+
49+
50+
const BASE64_MAP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
51+
52+
function base64_encode(bytes) {
53+
var i = 0; j = 0;
54+
var append = bytes.length % 3 > 0 ? 3 - bytes.length % 3 : 0;
55+
for (i = 0; i < append; i++) {
56+
bytes[bytes.length] = 0;
57+
}
58+
var b64 = "";
59+
for (i = 0; j < bytes.length; j += 3) {
60+
if (j > 0 && j % 57 == 0) {
61+
b64 += '\n';
62+
}
63+
b64 += BASE64_MAP[bytes[j] >> 2]
64+
+ BASE64_MAP[(bytes[j] & 3) << 4 | bytes[j+1] >> 4]
65+
+ BASE64_MAP[(bytes[j+1] & 15) << 2 | bytes[j+2] >> 6]
66+
+ BASE64_MAP[bytes[j+2] & 63];
67+
}
68+
for (i = 0; i < append; i++) {
69+
b64 += '=';
70+
}
71+
return b64;
72+
}
73+
74+
function base64_decode(input) {
75+
var i = 0, j = 0;
76+
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
77+
var append = input.length % 4;
78+
if (append > 2) {
79+
return null;
80+
}
81+
for (i = 0; i < append; i++) {
82+
if (input.charAt(input.length - i - 1) != '=') {
83+
return null;
84+
}
85+
}
86+
var output = new Array((input.length - append) * 3 / 4);
87+
var enc1, enc2, enc3, enc4;
88+
for (i = 0, j = 0; j < output.length;) {
89+
enc1 = BASE64_MAP.indexOf(input.charAt(i++));
90+
enc2 = BASE64_MAP.indexOf(input.charAt(i++));
91+
enc3 = BASE64_MAP.indexOf(input.charAt(i++));
92+
enc4 = BASE64_MAP.indexOf(input.charAt(i++));
93+
output[j++] = (enc1 << 2) | (enc2 >> 4);
94+
output[j++] = ((enc2 & 15) << 4) | (enc3 >> 2);
95+
output[j++] = ((enc3 & 3) << 6) | enc4;
96+
}
97+
for (i = 0; i < append; i++) {
98+
if (output.pop() != 0) {
99+
return null;
100+
}
101+
}
102+
return output;
103+
}
104+
105+
function base64_test() {
106+
var bin = [1, 2, 3, 4, 5];
107+
var b64 = base64_encode(bin);
108+
var buf = base64_decode(b64);
109+
console.log(b64);
110+
console.log(buf);
111+
}

0 commit comments

Comments
 (0)