Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add urlsafe #357

Merged
merged 1 commit into from
Jul 22, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -53,6 +53,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>