From ca3678cddbb2d3df1ed5aded07d7b684459e3fb7 Mon Sep 17 00:00:00 2001 From: Michael Theos Date: Fri, 12 Mar 2021 00:26:12 +1100 Subject: [PATCH] Range check for b64 Alphabet --- node-atob.js | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/node-atob.js b/node-atob.js index 9e2c2b1..88bf3a3 100644 --- a/node-atob.js +++ b/node-atob.js @@ -1,11 +1,24 @@ "use strict"; -const b64Alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' +// var b64Alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + +function toCharCode(ch) { + return ch.charCodeAt(0); +} + +function isValidB64Char(charCode) { + return charCode >= toCharCode('A') && charCode <= toCharCode('Z') + || charCode >= toCharCode('a') && charCode <= toCharCode('z') + || charCode >= toCharCode('0') && charCode <= toCharCode('9') + || charCode === toCharCode('+') + || charCode === toCharCode('/') + || charCode === toCharCode('='); +} function atob(str) { - for (const ch of str) - if (!b64Alphabet.includes(ch)) - throw new Error(`Invalid character '${ch}' in base64 String`); + for (var idx in str) + if (!isValidB64Char(str.charCodeAt(idx))) + throw new Error('Invalid character ' + str.charAt(idx) + ' in base64 String'); return Buffer.from(str, 'base64').toString('binary'); }