-
Notifications
You must be signed in to change notification settings - Fork 222
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Correctly parse base64-encoded payloads
- Loading branch information
Showing
3 changed files
with
262 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
/** | ||
* Decodes base64-encoded strings. | ||
* Copied from the core library. | ||
*/ | ||
export function base64urldecode(data: string): string { | ||
if (!data) { | ||
return data; | ||
} | ||
const padding = 4 - (data.length % 4); | ||
switch (padding) { | ||
case 2: | ||
data += '=='; | ||
break; | ||
case 3: | ||
data += '='; | ||
break; | ||
} | ||
const b64Data = data.replace(/-/g, '+').replace(/_/g, '/'); | ||
return base64decode(b64Data); | ||
} | ||
|
||
const b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; | ||
|
||
function base64decode(encodedData: string): string { | ||
// discuss at: http://locutus.io/php/base64_decode/ | ||
// original by: Tyler Akins (http://rumkin.com) | ||
// improved by: Thunder.m | ||
// improved by: Kevin van Zonneveld (http://kvz.io) | ||
// improved by: Kevin van Zonneveld (http://kvz.io) | ||
// input by: Aman Gupta | ||
// input by: Brett Zamir (http://brett-zamir.me) | ||
// bugfixed by: Onno Marsman (https://twitter.com/onnomarsman) | ||
// bugfixed by: Pellentesque Malesuada | ||
// bugfixed by: Kevin van Zonneveld (http://kvz.io) | ||
// improved by: Indigo744 | ||
// example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==') | ||
// returns 1: 'Kevin van Zonneveld' | ||
// example 2: base64_decode('YQ==') | ||
// returns 2: 'a' | ||
// example 3: base64_decode('4pyTIMOgIGxhIG1vZGU=') | ||
// returns 3: '✓ à la mode' | ||
|
||
// decodeUTF8string() | ||
// Internal function to decode properly UTF8 string | ||
// Adapted from Solution #1 at https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding | ||
const decodeUTF8string = function (str: string) { | ||
// Going backwards: from bytestream, to percent-encoding, to original string. | ||
return decodeURIComponent( | ||
str | ||
.split('') | ||
.map(function (c) { | ||
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); | ||
}) | ||
.join('') | ||
); | ||
}; | ||
|
||
let o1, | ||
o2, | ||
o3, | ||
h1, | ||
h2, | ||
h3, | ||
h4, | ||
bits, | ||
i = 0, | ||
ac = 0, | ||
dec = ''; | ||
const tmpArr: Array<string> = []; | ||
|
||
if (!encodedData) { | ||
return encodedData; | ||
} | ||
|
||
encodedData += ''; | ||
|
||
do { | ||
// unpack four hexets into three octets using index points in b64 | ||
h1 = b64.indexOf(encodedData.charAt(i++)); | ||
h2 = b64.indexOf(encodedData.charAt(i++)); | ||
h3 = b64.indexOf(encodedData.charAt(i++)); | ||
h4 = b64.indexOf(encodedData.charAt(i++)); | ||
|
||
bits = (h1 << 18) | (h2 << 12) | (h3 << 6) | h4; | ||
|
||
o1 = (bits >> 16) & 0xff; | ||
o2 = (bits >> 8) & 0xff; | ||
o3 = bits & 0xff; | ||
|
||
if (h3 === 64) { | ||
tmpArr[ac++] = String.fromCharCode(o1); | ||
} else if (h4 === 64) { | ||
tmpArr[ac++] = String.fromCharCode(o1, o2); | ||
} else { | ||
tmpArr[ac++] = String.fromCharCode(o1, o2, o3); | ||
} | ||
} while (i < encodedData.length); | ||
|
||
dec = tmpArr.join(''); | ||
|
||
return decodeUTF8string(dec.replace(/\0+$/, '')); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters