Skip to content

Commit

Permalink
Merge pull request #357 from Spencer17x/develop
Browse files Browse the repository at this point in the history
Feature: base64 url safe
  • Loading branch information
evanvosberg authored Jul 22, 2021
2 parents 228b0a7 + ae0696f commit aa9a708
Show file tree
Hide file tree
Showing 4 changed files with 192 additions and 3 deletions.
8 changes: 6 additions & 2 deletions grunt/config/modularize.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@ module.exports = {
"index": {
"global": "CryptoJS",
"exports": "CryptoJS",
"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"]
"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"]
},
"crypto-js": {
"pack": true,
"global": "CryptoJS",
"exports": "CryptoJS",
"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"]
"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"]
},

// hash
Expand Down Expand Up @@ -174,6 +174,10 @@ module.exports = {
"exports": "CryptoJS.enc.Base64",
"components": ["core", "enc-base64"]
},
"enc-base64url": {
"exports": "CryptoJS.enc.Base64url",
"components": ["core", "enc-base64url"]
},

// mode
"mode-cfb": {
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
"CFB",
"CTR",
"CBC",
"Base64"
"Base64",
"Base64url"
]
}
121 changes: 121 additions & 0 deletions src/enc-base64url.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
(function () {
// Shortcuts
var C = CryptoJS;
var C_lib = C.lib;
var WordArray = C_lib.WordArray;
var C_enc = C.enc;

/**
* Base64url encoding strategy.
*/
var Base64url = C_enc.Base64url = {
/**
* Converts a word array to a Base64url string.
*
* @param {WordArray} wordArray The word array.
*
* @param {boolean} urlSafe Whether to use url safe
*
* @return {string} The Base64url string.
*
* @static
*
* @example
*
* var base64String = CryptoJS.enc.Base64url.stringify(wordArray);
*/
stringify: function (wordArray, urlSafe=true) {
// Shortcuts
var words = wordArray.words;
var sigBytes = wordArray.sigBytes;
var map = urlSafe ? this._safe_map : this._map;

// Clamp excess bits
wordArray.clamp();

// Convert
var base64Chars = [];
for (var i = 0; i < sigBytes; i += 3) {
var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;

var triplet = (byte1 << 16) | (byte2 << 8) | byte3;

for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {
base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
}
}

// Add padding
var paddingChar = map.charAt(64);
if (paddingChar) {
while (base64Chars.length % 4) {
base64Chars.push(paddingChar);
}
}

return base64Chars.join('');
},

/**
* Converts a Base64url string to a word array.
*
* @param {string} base64Str The Base64url string.
*
* @param {boolean} urlSafe Whether to use url safe
*
* @return {WordArray} The word array.
*
* @static
*
* @example
*
* var wordArray = CryptoJS.enc.Base64url.parse(base64String);
*/
parse: function (base64Str, urlSafe=true) {
// Shortcuts
var base64StrLength = base64Str.length;
var map = urlSafe ? this._safe_map : this._map;
var reverseMap = this._reverseMap;

if (!reverseMap) {
reverseMap = this._reverseMap = [];
for (var j = 0; j < map.length; j++) {
reverseMap[map.charCodeAt(j)] = j;
}
}

// Ignore padding
var paddingChar = map.charAt(64);
if (paddingChar) {
var paddingIndex = base64Str.indexOf(paddingChar);
if (paddingIndex !== -1) {
base64StrLength = paddingIndex;
}
}

// Convert
return parseLoop(base64Str, base64StrLength, reverseMap);

},

_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
_safe_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',
};

function parseLoop(base64Str, base64StrLength, reverseMap) {
var words = [];
var nBytes = 0;
for (var i = 0; i < base64StrLength; i++) {
if (i % 4) {
var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);
var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);
var bitsCombined = bits1 | bits2;
words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);
nBytes++;
}
}
return WordArray.create(words, nBytes);
}
}());
63 changes: 63 additions & 0 deletions test/test1.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>CryptoJS Test Suite</title>

<!-- CryptoJS -->
<script src="../src/core.js"></script>
<script src="../src/lib-typedarrays.js"></script>
<script src="../src/x64-core.js"></script>
<script src="../src/enc-utf16.js"></script>
<script src="../src/enc-base64.js"></script>
<script src="../src/enc-base64url.js"></script>
<script src="../src/md5.js"></script>
<script src="../src/sha1.js"></script>
<script src="../src/sha256.js"></script>
<script src="../src/sha224.js"></script>
<script src="../src/sha512.js"></script>
<script src="../src/sha384.js"></script>
<script src="../src/sha3.js"></script>
<script src="../src/ripemd160.js"></script>
<script src="../src/hmac.js"></script>
<script src="../src/pbkdf2.js"></script>
<script src="../src/evpkdf.js"></script>
<script src="../src/cipher-core.js"></script>
<script src="../src/mode-cfb.js"></script>
<script src="../src/mode-ctr.js"></script>
<script src="../src/mode-ofb.js"></script>
<script src="../src/mode-ecb.js"></script>
<script src="../src/pad-ansix923.js"></script>
<script src="../src/pad-iso10126.js"></script>
<script src="../src/pad-zeropadding.js"></script>
<script src="../src/pad-iso97971.js"></script>
<script src="../src/pad-nopadding.js"></script>
<script src="../src/rc4.js"></script>
<script src="../src/rabbit.js"></script>
<script src="../src/rabbit-legacy.js"></script>
<script src="../src/aes.js"></script>
<script src="../src/tripledes.js"></script>


<!-- Test runner -->
<script>
var message = "152999073894506063@http://localhost:3000/protected/index@89effb07-588e-4bf4-ba16-c10b2a136ae9@1553508995647";
var key = "u-rXsMB_aegAnzC_CJt27plLGNqOfR2EHI5o2ro1NO";
var baseKey = CryptoJS.enc.Base64url.parse(key);
console.log("key:"+baseKey.toString());
var hash = CryptoJS.HmacSHA256(message, baseKey);
var hashInBase64 = CryptoJS.enc.Base64url.stringify(hash);
document.write(hashInBase64);
document.write("\n");
var shashInBase64 = CryptoJS.enc.Base64url.stringify(hash);
console.log("result:"+hash.toString())
document.write(shashInBase64);
console.log("done:"+shashInBase64);
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'
</script>


</head>
<body>
</body>
</html>

0 comments on commit aa9a708

Please sign in to comment.