Skip to content

Instantly share code, notes, and snippets.

@robotarmy
Created August 31, 2019 01:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save robotarmy/66f737c3b13646e3a81141cf6aa3b117 to your computer and use it in GitHub Desktop.
Save robotarmy/66f737c3b13646e3a81141cf6aa3b117 to your computer and use it in GitHub Desktop.
function generateCodePackagePromise() {
var base64Url = function(buffer) {
/*\
|*|
|*| Base64 / binary data / UTF-8 strings utilities (#1)
|*|
|*| https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding
|*|
|*| Author: madmurphy
|*|
\*/
var uint6ToB64 = function(nUint6) {
return nUint6 < 26 ?
nUint6 + 65 :
nUint6 < 52 ?
nUint6 + 71 :
nUint6 < 62 ?
nUint6 - 4 :
nUint6 === 62 ?
43 :
nUint6 === 63 ?
47 :
65;
}
var base64EncArr = function(aBytes) {
var eqLen = (3 - (aBytes.length % 3)) % 3,
sB64Enc = "";
for (var nMod3, nLen = aBytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++) {
nMod3 = nIdx % 3;
/* Uncomment the following line in order to split the output in lines 76-character long: */
/*
if (nIdx > 0 && (nIdx * 4 / 3) % 76 === 0) { sB64Enc += "\r\n"; }
*/
nUint24 |= aBytes[nIdx] << (16 >>> nMod3 & 24);
if (nMod3 === 2 || aBytes.length - nIdx === 1) {
sB64Enc += String.fromCharCode(uint6ToB64(nUint24 >>> 18 & 63), uint6ToB64(nUint24 >>> 12 & 63), uint6ToB64(nUint24 >>> 6 & 63), uint6ToB64(nUint24 & 63));
nUint24 = 0;
}
}
return eqLen === 0 ?
sB64Enc :
sB64Enc.substring(0, sB64Enc.length - eqLen) + (eqLen === 1 ? "=" : "==");
};
const base64 = base64EncArr(new Uint8Array(buffer));
const base64url_no_padding = base64.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=/g, '');
return base64url_no_padding;
}
var gen128x8bitNonce = function() {
var array = new Uint8Array(128); //( generate 1024bits 8*128
window.crypto.getRandomValues(array);
return array;
};
var code_verifier = gen128x8bitNonce();
var base64_verifier = base64Url(code_verifier.buffer);
const encoder = new TextEncoder();
const base64_arraybuffer = encoder.encode(base64_verifier);
return crypto.subtle.digest("SHA-256", base64_arraybuffer).then(function(code_challenge){
return {
code_verifer: base64_verifier,
code_challenge: base64Url(code_challenge),
code_challenge_method: "S256"
}
});
}
generateCodePackagePromise().then(function(package) {
package.code_challenge;
package.code_challenge_method;
package.code_verifer;
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment