Skip to content

Commit aa9a708

Browse files
authored
Merge pull request #357 from Spencer17x/develop
Feature: base64 url safe
2 parents 228b0a7 + ae0696f commit aa9a708

File tree

4 files changed

+192
-3
lines changed

4 files changed

+192
-3
lines changed

grunt/config/modularize.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ module.exports = {
1313
"index": {
1414
"global": "CryptoJS",
1515
"exports": "CryptoJS",
16-
"components": ["core", "x64-core", "lib-typedarrays", "enc-utf16", "enc-base64", "md5", "sha1", "sha256", "sha224", "sha512", "sha384", "sha3", "ripemd160", "hmac", "pbkdf2", "evpkdf", "cipher-core", "mode-cfb", "mode-ctr", "mode-ctr-gladman", "mode-ofb", "mode-ecb", "pad-ansix923", "pad-iso10126", "pad-iso97971", "pad-zeropadding", "pad-nopadding", "format-hex", "aes", "tripledes", "rc4", "rabbit", "rabbit-legacy"]
16+
"components": ["core", "x64-core", "lib-typedarrays", "enc-utf16", "enc-base64", "enc-base64url", "md5", "sha1", "sha256", "sha224", "sha512", "sha384", "sha3", "ripemd160", "hmac", "pbkdf2", "evpkdf", "cipher-core", "mode-cfb", "mode-ctr", "mode-ctr-gladman", "mode-ofb", "mode-ecb", "pad-ansix923", "pad-iso10126", "pad-iso97971", "pad-zeropadding", "pad-nopadding", "format-hex", "aes", "tripledes", "rc4", "rabbit", "rabbit-legacy"]
1717
},
1818
"crypto-js": {
1919
"pack": true,
2020
"global": "CryptoJS",
2121
"exports": "CryptoJS",
22-
"components": ["core", "x64-core", "lib-typedarrays", "enc-utf16", "enc-base64", "md5", "sha1", "sha256", "sha224", "sha512", "sha384", "sha3", "ripemd160", "hmac", "pbkdf2", "evpkdf", "cipher-core", "mode-cfb", "mode-ctr", "mode-ctr-gladman", "mode-ofb", "mode-ecb", "pad-ansix923", "pad-iso10126", "pad-iso97971", "pad-zeropadding", "pad-nopadding", "format-hex", "aes", "tripledes", "rc4", "rabbit", "rabbit-legacy"]
22+
"components": ["core", "x64-core", "lib-typedarrays", "enc-utf16", "enc-base64", "enc-base64url", "md5", "sha1", "sha256", "sha224", "sha512", "sha384", "sha3", "ripemd160", "hmac", "pbkdf2", "evpkdf", "cipher-core", "mode-cfb", "mode-ctr", "mode-ctr-gladman", "mode-ofb", "mode-ecb", "pad-ansix923", "pad-iso10126", "pad-iso97971", "pad-zeropadding", "pad-nopadding", "format-hex", "aes", "tripledes", "rc4", "rabbit", "rabbit-legacy"]
2323
},
2424

2525
// hash
@@ -174,6 +174,10 @@ module.exports = {
174174
"exports": "CryptoJS.enc.Base64",
175175
"components": ["core", "enc-base64"]
176176
},
177+
"enc-base64url": {
178+
"exports": "CryptoJS.enc.Base64url",
179+
"components": ["core", "enc-base64url"]
180+
},
177181

178182
// mode
179183
"mode-cfb": {

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
"CFB",
5757
"CTR",
5858
"CBC",
59-
"Base64"
59+
"Base64",
60+
"Base64url"
6061
]
6162
}

src/enc-base64url.js

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
(function () {
2+
// Shortcuts
3+
var C = CryptoJS;
4+
var C_lib = C.lib;
5+
var WordArray = C_lib.WordArray;
6+
var C_enc = C.enc;
7+
8+
/**
9+
* Base64url encoding strategy.
10+
*/
11+
var Base64url = C_enc.Base64url = {
12+
/**
13+
* Converts a word array to a Base64url string.
14+
*
15+
* @param {WordArray} wordArray The word array.
16+
*
17+
* @param {boolean} urlSafe Whether to use url safe
18+
*
19+
* @return {string} The Base64url string.
20+
*
21+
* @static
22+
*
23+
* @example
24+
*
25+
* var base64String = CryptoJS.enc.Base64url.stringify(wordArray);
26+
*/
27+
stringify: function (wordArray, urlSafe=true) {
28+
// Shortcuts
29+
var words = wordArray.words;
30+
var sigBytes = wordArray.sigBytes;
31+
var map = urlSafe ? this._safe_map : this._map;
32+
33+
// Clamp excess bits
34+
wordArray.clamp();
35+
36+
// Convert
37+
var base64Chars = [];
38+
for (var i = 0; i < sigBytes; i += 3) {
39+
var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
40+
var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
41+
var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
42+
43+
var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
44+
45+
for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {
46+
base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
47+
}
48+
}
49+
50+
// Add padding
51+
var paddingChar = map.charAt(64);
52+
if (paddingChar) {
53+
while (base64Chars.length % 4) {
54+
base64Chars.push(paddingChar);
55+
}
56+
}
57+
58+
return base64Chars.join('');
59+
},
60+
61+
/**
62+
* Converts a Base64url string to a word array.
63+
*
64+
* @param {string} base64Str The Base64url string.
65+
*
66+
* @param {boolean} urlSafe Whether to use url safe
67+
*
68+
* @return {WordArray} The word array.
69+
*
70+
* @static
71+
*
72+
* @example
73+
*
74+
* var wordArray = CryptoJS.enc.Base64url.parse(base64String);
75+
*/
76+
parse: function (base64Str, urlSafe=true) {
77+
// Shortcuts
78+
var base64StrLength = base64Str.length;
79+
var map = urlSafe ? this._safe_map : this._map;
80+
var reverseMap = this._reverseMap;
81+
82+
if (!reverseMap) {
83+
reverseMap = this._reverseMap = [];
84+
for (var j = 0; j < map.length; j++) {
85+
reverseMap[map.charCodeAt(j)] = j;
86+
}
87+
}
88+
89+
// Ignore padding
90+
var paddingChar = map.charAt(64);
91+
if (paddingChar) {
92+
var paddingIndex = base64Str.indexOf(paddingChar);
93+
if (paddingIndex !== -1) {
94+
base64StrLength = paddingIndex;
95+
}
96+
}
97+
98+
// Convert
99+
return parseLoop(base64Str, base64StrLength, reverseMap);
100+
101+
},
102+
103+
_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
104+
_safe_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',
105+
};
106+
107+
function parseLoop(base64Str, base64StrLength, reverseMap) {
108+
var words = [];
109+
var nBytes = 0;
110+
for (var i = 0; i < base64StrLength; i++) {
111+
if (i % 4) {
112+
var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);
113+
var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);
114+
var bitsCombined = bits1 | bits2;
115+
words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);
116+
nBytes++;
117+
}
118+
}
119+
return WordArray.create(words, nBytes);
120+
}
121+
}());

test/test1.html

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<!doctype html>
2+
<html>
3+
<head>
4+
<meta charset="utf-8">
5+
<title>CryptoJS Test Suite</title>
6+
7+
<!-- CryptoJS -->
8+
<script src="../src/core.js"></script>
9+
<script src="../src/lib-typedarrays.js"></script>
10+
<script src="../src/x64-core.js"></script>
11+
<script src="../src/enc-utf16.js"></script>
12+
<script src="../src/enc-base64.js"></script>
13+
<script src="../src/enc-base64url.js"></script>
14+
<script src="../src/md5.js"></script>
15+
<script src="../src/sha1.js"></script>
16+
<script src="../src/sha256.js"></script>
17+
<script src="../src/sha224.js"></script>
18+
<script src="../src/sha512.js"></script>
19+
<script src="../src/sha384.js"></script>
20+
<script src="../src/sha3.js"></script>
21+
<script src="../src/ripemd160.js"></script>
22+
<script src="../src/hmac.js"></script>
23+
<script src="../src/pbkdf2.js"></script>
24+
<script src="../src/evpkdf.js"></script>
25+
<script src="../src/cipher-core.js"></script>
26+
<script src="../src/mode-cfb.js"></script>
27+
<script src="../src/mode-ctr.js"></script>
28+
<script src="../src/mode-ofb.js"></script>
29+
<script src="../src/mode-ecb.js"></script>
30+
<script src="../src/pad-ansix923.js"></script>
31+
<script src="../src/pad-iso10126.js"></script>
32+
<script src="../src/pad-zeropadding.js"></script>
33+
<script src="../src/pad-iso97971.js"></script>
34+
<script src="../src/pad-nopadding.js"></script>
35+
<script src="../src/rc4.js"></script>
36+
<script src="../src/rabbit.js"></script>
37+
<script src="../src/rabbit-legacy.js"></script>
38+
<script src="../src/aes.js"></script>
39+
<script src="../src/tripledes.js"></script>
40+
41+
42+
<!-- Test runner -->
43+
<script>
44+
var message = "152999073894506063@http://localhost:3000/protected/index@89effb07-588e-4bf4-ba16-c10b2a136ae9@1553508995647";
45+
var key = "u-rXsMB_aegAnzC_CJt27plLGNqOfR2EHI5o2ro1NO";
46+
var baseKey = CryptoJS.enc.Base64url.parse(key);
47+
console.log("key:"+baseKey.toString());
48+
var hash = CryptoJS.HmacSHA256(message, baseKey);
49+
var hashInBase64 = CryptoJS.enc.Base64url.stringify(hash);
50+
document.write(hashInBase64);
51+
document.write("\n");
52+
var shashInBase64 = CryptoJS.enc.Base64url.stringify(hash);
53+
console.log("result:"+hash.toString())
54+
document.write(shashInBase64);
55+
console.log("done:"+shashInBase64);
56+
var url = 'http://www.ctyun.cn/serviceValidate?service=http://localhost:3000/protected/index&ticket=89effb07-588e-4bf4-ba16-c10b2a136ae9&timestamp=1553508995647&appId=152999073894506063&signature=evvc3Ix87nk-KkuIaQJrLP7Vu76dTsh-BwnC6AHXFfU'
57+
</script>
58+
59+
60+
</head>
61+
<body>
62+
</body>
63+
</html>

0 commit comments

Comments
 (0)