Skip to content

Commit ba880a2

Browse files
committed
Fixes #216: more robust Base64 verification (do not ignore stray
characters).
1 parent bfff70b commit ba880a2

File tree

2 files changed

+39
-11
lines changed

2 files changed

+39
-11
lines changed

js/app.js

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,21 @@ FaFp+DyAe+b4nDwuJaW2LURbr8AEZga7oQj0uYxcYw==\n\
526526
var secretElement = document.getElementsByName('secret')[0];
527527
var isBase64EncodedElement = document.getElementsByName('is-base64-encoded')[0];
528528

529+
function showInvalidSignature() {
530+
var signatureElement = getFirstElementByClassName('js-signature');
531+
$(signatureElement).removeClass('valid-token');
532+
$(signatureElement).addClass('invalid-token');
533+
signatureElement.innerHTML = '<i class="icon-budicon-501"></i> invalid signature';
534+
}
535+
536+
function showValidSignature() {
537+
var signatureElement = getFirstElementByClassName('js-signature');
538+
$(signatureElement).removeClass('invalid-token');
539+
$(signatureElement).addClass('valid-token');
540+
signatureElement.innerHTML = '<i class="icon-budicon-499"></i> signature verified';
541+
$('.input').removeClass('error');
542+
}
543+
529544
function updateSignature () {
530545
var algorithm = getAlgorithm();
531546
var signatureElement = getFirstElementByClassName('js-signature');
@@ -538,6 +553,7 @@ FaFp+DyAe+b4nDwuJaW2LURbr8AEZga7oQj0uYxcYw==\n\
538553
var isBase64 = isBase64EncodedElement.checked;
539554
if (isBase64 && !window.isValidBase64String(secretElement.value)) {
540555
$(signatureContainerElement).addClass('error');
556+
showInvalidSignature();
541557
return;
542558
} else {
543559
$(signatureContainerElement).removeClass('error');
@@ -553,14 +569,9 @@ FaFp+DyAe+b4nDwuJaW2LURbr8AEZga7oQj0uYxcYw==\n\
553569
var error = result.error;
554570
result = result.result;
555571
if (!error && result) {
556-
$(signatureElement).removeClass('invalid-token');
557-
$(signatureElement).addClass('valid-token');
558-
signatureElement.innerHTML = '<i class="icon-budicon-499"></i> signature verified';
559-
$('.input').removeClass('error');
572+
showValidSignature()
560573
} else {
561-
$(signatureElement).removeClass('valid-token');
562-
$(signatureElement).addClass('invalid-token');
563-
signatureElement.innerHTML = '<i class="icon-budicon-501"></i> invalid signature';
574+
showInvalidSignature();
564575
}
565576
}
566577

js/jwt.js

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,26 @@ window.sign = function (algorithm, header, payload, key, isSecretBase64Encoded)
105105

106106
window.isValidBase64String = function (s) {
107107
try {
108-
s = window.b64utob64(s);
109-
window.CryptoJS.enc.Base64.parse(s).toString();
110-
return true;
108+
var validChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_+/=';
109+
var hasPadding = false;
110+
for(var i = 0; i < s.length; ++i) {
111+
hasPadding |= s.charAt(i) === '=';
112+
if(validChars.indexOf(s.charAt(i)) === -1) {
113+
return false;
114+
}
115+
}
116+
117+
if(hasPadding) {
118+
for(var i = s.indexOf('='); i < s.length; ++i) {
119+
if(s.charAt(i) !== '=') {
120+
return false;
121+
}
122+
}
123+
124+
return s.length % 4 === 0;
125+
}
126+
127+
return true;
111128
} catch (e) {
112129
return false;
113130
}
@@ -133,7 +150,7 @@ window.verify = function (algorithm, value, key, isSecretBase64Encoded) {
133150
if (isSecretBase64Encoded) {
134151
try {
135152
key = window.b64utob64(key);
136-
key = window.CryptoJS.enc.Base64.parse(key).toString();
153+
key = window.b64tohex(key);
137154
} catch (e) {
138155
return {result: '', error: e};
139156
}

0 commit comments

Comments
 (0)