Skip to content

Commit a18cbd9

Browse files
committed
Fixes #111: support more signing algorithms.
1 parent c999d52 commit a18cbd9

File tree

5 files changed

+238
-62
lines changed

5 files changed

+238
-62
lines changed

js/app.js

Lines changed: 75 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -267,37 +267,6 @@ $(".panel-default .panel-heading").click(function() {
267267
}
268268
}
269269

270-
var DEFAULT_HS_TOKEN = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ';
271-
272-
var DEFAULT_RS_TOKEN = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.EkN-DOsnsuRjRO6BxXemmJDm3HbxrbRzXglbN2S4sOkopdU4IsDxTI8jO19W_A4K8ZPJijNLis4EZsHeY559a4DFOd50_OqgHGuERTqYZyuhtF39yxJPAjUESwxk2J5k_4zM3O-vtd1Ghyo4IbqKKSy6J9mTniYJPenn5-HIirE';
273-
274-
var DEFAULT_PUBLIC_RSA = "\
275-
-----BEGIN PUBLIC KEY-----\n\
276-
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDdlatRjRjogo3WojgGHFHYLugd\
277-
UWAY9iR3fy4arWNA1KoS8kVw33cJibXr8bvwUAUparCwlvdbH6dvEOfou0/gCFQs\
278-
HUfQrSDv+MuSUMAe8jzKE4qW+jK+xQU9a03GUnKHkkle+Q0pX/g6jXZ7r1/xAK5D\
279-
o2kQ+X5xK9cipRgEKwIDAQAB\n\
280-
-----END PUBLIC KEY-----\
281-
";
282-
283-
var DEFAULT_PRIVATE_RSA = "\
284-
-----BEGIN RSA PRIVATE KEY-----\n\
285-
MIICWwIBAAKBgQDdlatRjRjogo3WojgGHFHYLugdUWAY9iR3fy4arWNA1KoS8kVw\
286-
33cJibXr8bvwUAUparCwlvdbH6dvEOfou0/gCFQsHUfQrSDv+MuSUMAe8jzKE4qW\
287-
+jK+xQU9a03GUnKHkkle+Q0pX/g6jXZ7r1/xAK5Do2kQ+X5xK9cipRgEKwIDAQAB\
288-
AoGAD+onAtVye4ic7VR7V50DF9bOnwRwNXrARcDhq9LWNRrRGElESYYTQ6EbatXS\
289-
3MCyjjX2eMhu/aF5YhXBwkppwxg+EOmXeh+MzL7Zh284OuPbkglAaGhV9bb6/5Cp\
290-
uGb1esyPbYW+Ty2PC0GSZfIXkXs76jXAu9TOBvD0ybc2YlkCQQDywg2R/7t3Q2OE\
291-
2+yo382CLJdrlSLVROWKwb4tb2PjhY4XAwV8d1vy0RenxTB+K5Mu57uVSTHtrMK0\
292-
GAtFr833AkEA6avx20OHo61Yela/4k5kQDtjEf1N0LfI+BcWZtxsS3jDM3i1Hp0K\
293-
Su5rsCPb8acJo5RO26gGVrfAsDcIXKC+bQJAZZ2XIpsitLyPpuiMOvBbzPavd4gY\
294-
6Z8KWrfYzJoI/Q9FuBo6rKwl4BFoToD7WIUS+hpkagwWiz+6zLoX1dbOZwJACmH5\
295-
fSSjAkLRi54PKJ8TFUeOP15h9sQzydI8zJU+upvDEKZsZc/UhT/SySDOxQ4G/523\
296-
Y0sz/OZtSWcol/UMgQJALesy++GdvoIDLfJX5GBQpuFgFenRiRDabxrE9MNUZ2aP\
297-
FaFp+DyAe+b4nDwuJaW2LURbr8AEZga7oQj0uYxcYw==\n\
298-
-----END RSA PRIVATE KEY-----\
299-
";
300-
301270
var codeMirror = CodeMirror;
302271

303272
function tabHack(instance) {
@@ -516,6 +485,8 @@ FaFp+DyAe+b4nDwuJaW2LURbr8AEZga7oQj0uYxcYw==\n\
516485
var $algRadio = $('.algorithm input[value="'+alg+'"]');
517486
$algRadio.prop('checked', true);
518487

488+
$('.algorithm option[value="'+alg+'"]').prop('selected', true);
489+
519490
fireEvent($algRadio.get(0));
520491
}
521492

@@ -650,7 +621,7 @@ FaFp+DyAe+b4nDwuJaW2LURbr8AEZga7oQj0uYxcYw==\n\
650621
var privateKeyElement = $('textarea[name="private-key"]');
651622
var publicKeyElement = $('textarea[name="public-key"]');
652623

653-
if(algorithm === 'HS256') {
624+
if(algorithm.indexOf('HS') === 0) {
654625
return secretElement.val();
655626
} else {
656627
return action === 'sign' ? privateKeyElement.val() : publicKeyElement.val();
@@ -661,34 +632,87 @@ FaFp+DyAe+b4nDwuJaW2LURbr8AEZga7oQj0uYxcYw==\n\
661632
return algorithmRadios.filter(':checked').val();
662633
}
663634

635+
function checkDefaults(requestedAlgorithm) {
636+
requestedAlgorithm = requestedAlgorithm.toLowerCase();
637+
var requestedDefaults = defaultTokens[requestedAlgorithm];
638+
639+
var token = getTrimmedValue(tokenEditor);
640+
if(!token) {
641+
token = '';
642+
}
643+
for(var alg in defaultTokens) {
644+
if(token === defaultTokens[alg].token) {
645+
if(alg === requestedAlgorithm) {
646+
break;
647+
}
648+
649+
tokenEditor.setValue(requestedDefaults.token);
650+
651+
if(requestedAlgorithm.indexOf('hs') === 0) {
652+
var secretElement = $('input[name="secret"]');
653+
654+
secretElement.val(requestedDefaults.secret);
655+
} else {
656+
var publicKey = $('.jwt-signature textarea[name=public-key]');
657+
var privateKey = $('.jwt-signature textarea[name=private-key]');
658+
659+
publicKey.val(requestedDefaults.publicKey);
660+
privateKey.val(requestedDefaults.privateKey);
661+
662+
validateKey.apply(publicKey);
663+
validateKey.apply(privateKey);
664+
}
665+
666+
break;
667+
}
668+
}
669+
}
670+
671+
function updateHeader(algorithm) {
672+
var headerStr = getTrimmedValue(headerEditor);
673+
try {
674+
var header = JSON.parse(headerStr);
675+
header.alg = algorithm;
676+
headerEditor.setValue(JSON.stringify(header, null, 2));
677+
} catch(e) {
678+
//Ignore this, we may have garbage in the editor.
679+
}
680+
}
681+
664682
function updateAlgorithm () {
665683
var algorithm = algorithmRadios.filter(':checked').val();
684+
var algoType = algorithm.substr(0, 2);
685+
var algoSize = algorithm.substr(2, 3);
666686

667687
$('.js-input').attr('data-alg', algorithm);
668688

669-
$('.jwt-signature pre')
689+
if(algoType === 'HS') {
690+
$('#hmacsha-text').text('HMACSHA' + algoSize);
691+
692+
$('.jwt-signature pre')
670693
.hide()
671-
.filter('.' + algorithm)
694+
.filter('.HS256')
695+
.show();
696+
} else {
697+
var texts = {
698+
RS: 'RSASHA',
699+
PS: 'RSAPSSSHA',
700+
ES: 'ECDSASHA'
701+
};
702+
$('#rsasha-text').text(texts[algoType] + algoSize);
703+
704+
$('.jwt-signature pre')
705+
.hide()
706+
.filter('.RS256')
672707
.show();
673-
674-
if(getTokenType() === 'id_token' && getTrimmedValue(tokenEditor) === DEFAULT_HS_TOKEN &&
675-
algorithm === 'RS256'){
676-
setDefaultsForRSA();
677-
}else if(getTokenType() === 'id_token' && getTrimmedValue(tokenEditor) === DEFAULT_RS_TOKEN &&
678-
algorithm === 'HS256'){
679-
setDefaultsForHMAC();
680708
}
681-
}
682709

683-
function setDefaultsForRSA() {
684-
tokenEditor.setValue(DEFAULT_RS_TOKEN);
685-
686-
$('.jwt-signature textarea[name=public-key]').val(DEFAULT_PUBLIC_RSA);
687-
$('.jwt-signature textarea[name=private-key]').val(DEFAULT_PRIVATE_RSA);
688-
}
710+
checkDefaults(algorithm);
711+
updateHeader(algorithm);
689712

690-
function setDefaultsForHMAC(){
691-
tokenEditor.setValue(DEFAULT_HS_TOKEN);
713+
if (window.matchMedia('(min-width: 768px)').matches) {
714+
autoHeightInput();
715+
}
692716
}
693717

694718
function updateToken() {
@@ -714,12 +738,6 @@ FaFp+DyAe+b4nDwuJaW2LURbr8AEZga7oQj0uYxcYw==\n\
714738
var $textarea = $(this);
715739
var valid = window.isValidKey($textarea.val());
716740

717-
/*if($textarea.prop('name') === 'public-key') {
718-
valid = /-----BEGIN (PUBLIC KEY|CERTIFICATE)-----(.|\n)*-----END (PUBLIC KEY|CERTIFICATE)-----/.test($textarea.val());
719-
} else {
720-
valid = /-----BEGIN RSA PRIVATE KEY-----(.|\n)*-----END RSA PRIVATE KEY-----/.test($textarea.val());
721-
}*/
722-
723741
if (valid.valid) {
724742
$textarea.removeClass('error');
725743
$textarea.val(valid.key);
@@ -792,7 +810,7 @@ FaFp+DyAe+b4nDwuJaW2LURbr8AEZga7oQj0uYxcYw==\n\
792810
}
793811

794812
loadFromStorage(function (jwt) {
795-
lastRestoredToken = jwt || DEFAULT_HS_TOKEN;
813+
lastRestoredToken = jwt || defaultTokens.hs256.token;
796814

797815
tokenEditor.setValue(
798816
lastRestoredToken

js/default-tokens.js

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
var rsaPrivateKey =
2+
'-----BEGIN RSA PRIVATE KEY-----\n' +
3+
'MIICWwIBAAKBgQDdlatRjRjogo3WojgGHFHYLugdUWAY9iR3fy4arWNA1KoS8kVw\n' +
4+
'33cJibXr8bvwUAUparCwlvdbH6dvEOfou0/gCFQsHUfQrSDv+MuSUMAe8jzKE4qW\n' +
5+
'+jK+xQU9a03GUnKHkkle+Q0pX/g6jXZ7r1/xAK5Do2kQ+X5xK9cipRgEKwIDAQAB\n' +
6+
'AoGAD+onAtVye4ic7VR7V50DF9bOnwRwNXrARcDhq9LWNRrRGElESYYTQ6EbatXS\n' +
7+
'3MCyjjX2eMhu/aF5YhXBwkppwxg+EOmXeh+MzL7Zh284OuPbkglAaGhV9bb6/5Cp\n' +
8+
'uGb1esyPbYW+Ty2PC0GSZfIXkXs76jXAu9TOBvD0ybc2YlkCQQDywg2R/7t3Q2OE\n' +
9+
'2+yo382CLJdrlSLVROWKwb4tb2PjhY4XAwV8d1vy0RenxTB+K5Mu57uVSTHtrMK0\n' +
10+
'GAtFr833AkEA6avx20OHo61Yela/4k5kQDtjEf1N0LfI+BcWZtxsS3jDM3i1Hp0K\n' +
11+
'Su5rsCPb8acJo5RO26gGVrfAsDcIXKC+bQJAZZ2XIpsitLyPpuiMOvBbzPavd4gY\n' +
12+
'6Z8KWrfYzJoI/Q9FuBo6rKwl4BFoToD7WIUS+hpkagwWiz+6zLoX1dbOZwJACmH5\n' +
13+
'fSSjAkLRi54PKJ8TFUeOP15h9sQzydI8zJU+upvDEKZsZc/UhT/SySDOxQ4G/523\n' +
14+
'Y0sz/OZtSWcol/UMgQJALesy++GdvoIDLfJX5GBQpuFgFenRiRDabxrE9MNUZ2aP\n' +
15+
'FaFp+DyAe+b4nDwuJaW2LURbr8AEZga7oQj0uYxcYw==\n' +
16+
'-----END RSA PRIVATE KEY-----';
17+
18+
var rsaPublicKey =
19+
'-----BEGIN PUBLIC KEY-----\n' +
20+
'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDdlatRjRjogo3WojgGHFHYLugd\n' +
21+
'UWAY9iR3fy4arWNA1KoS8kVw33cJibXr8bvwUAUparCwlvdbH6dvEOfou0/gCFQs\n' +
22+
'HUfQrSDv+MuSUMAe8jzKE4qW+jK+xQU9a03GUnKHkkle+Q0pX/g6jXZ7r1/xAK5D\n' +
23+
'o2kQ+X5xK9cipRgEKwIDAQAB\n' +
24+
'-----END PUBLIC KEY-----';
25+
26+
var ecPrivateKey =
27+
'-----BEGIN PRIVATE KEY-----' +
28+
'MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgevZzL1gdAFr88hb2' +
29+
'OF/2NxApJCzGCEDdfSp6VQO30hyhRANCAAQRWz+jn65BtOMvdyHKcvjBeBSDZH2r' +
30+
'1RTwjmYSi9R/zpBnuQ4EiMnCqfMPWiZqB4QdbAd0E7oH50VpuZ1P087G' +
31+
'-----END PRIVATE KEY-----';
32+
33+
var ecPublicKey =
34+
'-----BEGIN PUBLIC KEY-----' +
35+
'MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEEVs/o5+uQbTjL3chynL4wXgUg2R9' +
36+
'q9UU8I5mEovUf86QZ7kOBIjJwqnzD1omageEHWwHdBO6B+dFabmdT9POxg==' +
37+
'-----END PUBLIC KEY-----';
38+
39+
var defaultTokens = {
40+
hs256: {
41+
token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.' +
42+
'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOn' +
43+
'RydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ',
44+
secret: 'secret'
45+
},
46+
hs384: {
47+
token: '',
48+
secret: 'secret'
49+
},
50+
hs512: {
51+
token: 'eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3' +
52+
'ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.' +
53+
'YI0rUGDq5XdRw8vW2sDLRNFMN8Waol03iSFH8I4iLzuYK7FKHaQYWzPt0BJFG' +
54+
'rAmKJ6SjY0mJIMZqNQJFVpkuw',
55+
secret: 'secret'
56+
},
57+
rs256: {
58+
token: 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.' +
59+
'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRy' +
60+
'dWV9.EkN-DOsnsuRjRO6BxXemmJDm3HbxrbRzXglbN2S4sOkopdU4IsDxTI8jO1' +
61+
'9W_A4K8ZPJijNLis4EZsHeY559a4DFOd50_OqgHGuERTqYZyuhtF39yxJPAjU' +
62+
'ESwxk2J5k_4zM3O-vtd1Ghyo4IbqKKSy6J9mTniYJPenn5-HIirE',
63+
privateKey: rsaPrivateKey,
64+
publicKey: rsaPublicKey
65+
},
66+
rs384: {
67+
token: 'eyJhbGciOiJSUzM4NCIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxM' +
68+
'jM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.' +
69+
'Ffs4IGK8GkxrSxp7I8IcuHy_uUSskg2zBwScCGhg6T1o4hkdZ5ytJNRj04kD8' +
70+
'FEnUrnnUiGKgHL0MWrwmgz6Kmi6fxDSKKbiVlESPkUrgBTMaIlOheDbemy19' +
71+
'lxUJYqd7A2exNXtCW_UoSs8f3ZdYujNrbZWW8kWgLQuk4oa-0I',
72+
privateKey: rsaPrivateKey,
73+
publicKey: rsaPublicKey
74+
},
75+
rs512: {
76+
token: 'eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NT' +
77+
'Y3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.' +
78+
'yN0Dw5rVJ75rdJXKpflhwASRr4DHwlgmRY4HVMdotCdyg8fOB2sLRehLY9' +
79+
'g9isBnIuOA0aK7qWpj9cc7G8eYmaFdm95_moOJKxCgH0Rn2d2-wygdjBvMrSp' +
80+
'kxsKMdbc2tKP0rI3ZYalQ7Q86RagZNZ_JpA2V3j3JPKTQwKFGSTw',
81+
privateKey: rsaPrivateKey,
82+
publicKey: rsaPublicKey
83+
},
84+
es256: {
85+
token: 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODk' +
86+
'wIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.AZR4yap9' +
87+
'UoqRlEGkeAHjnr9vvLYAljWg8_ZtKDiaaEuN_oi55XjUNfFHfOniACB' +
88+
'46oYm1D4eVyVb8yGavbq9xQ',
89+
privateKey: ecPrivateKey,
90+
publicKey: ecPublicKey
91+
},
92+
es384: {
93+
token: 'eyJhbGciOiJFUzM4NCIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM' +
94+
'0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.' +
95+
'6zBBNCgcY_5yVr5mjhOG7-9vUUuxE7i85FtYihacGWwdQgBwQiPr8Nt' +
96+
'qG5eE2StJ7S3xBr-qyPY7fbwdJRG5fA',
97+
privateKey: ecPrivateKey,
98+
publicKey: ecPublicKey
99+
},
100+
es512: {
101+
token: '',
102+
privateKey: ecPrivateKey,
103+
publicKey: ecPublicKey
104+
},
105+
ps256: {
106+
token: '',
107+
privateKey: rsaPrivateKey,
108+
publicKey: rsaPublicKey
109+
},
110+
ps384: {
111+
token: '',
112+
privateKey: rsaPrivateKey,
113+
publicKey: rsaPublicKey
114+
},
115+
ps512: {
116+
token: '',
117+
privateKey: rsaPrivateKey,
118+
publicKey: rsaPublicKey
119+
}
120+
};
121+

js/jwt.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ window.sign = function (algorithm, header, payload, key, isSecretBase64Encoded)
8181
return error;
8282
}
8383

84-
if (algorithm === 'HS256') {
84+
if(algorithm.indexOf('HS') === 0) {
8585
if (isSecretBase64Encoded) {
8686
try {
8787
key = window.b64utob64(key);
@@ -149,7 +149,7 @@ window.verify = function (algorithm, value, key, isSecretBase64Encoded) {
149149
return { result: false, error: e };
150150
}
151151

152-
if (algorithm === 'HS256'){
152+
if(algorithm.indexOf('HS') === 0) {
153153
if (isSecretBase64Encoded) {
154154
try {
155155
key = window.b64utob64(key);
@@ -184,6 +184,9 @@ window.isValidKey = function(key) {
184184
}, {
185185
prologue: '-----BEGIN PUBLIC KEY-----\n',
186186
epilogue: '-----END PUBLIC KEY-----\n'
187+
}, {
188+
prologue: '-----BEGIN PRIVATE KEY-----\n',
189+
epilogue: '-----END PRIVATE KEY-----\n'
187190
}, {
188191
prologue: '-----BEGIN RSA PRIVATE KEY-----\n',
189192
epilogue: '-----END RSA PRIVATE KEY-----\n'

0 commit comments

Comments
 (0)