Skip to content

Instantly share code, notes, and snippets.

@marcus7777
Last active July 25, 2017 11:08
Show Gist options
  • Save marcus7777/c2753942505e99f82d916d93b4316b6f to your computer and use it in GitHub Desktop.
Save marcus7777/c2753942505e99f82d916d93b4316b6f to your computer and use it in GitHub Desktop.
Web Crypto API example
// for uint8array = new TextEncoder("utf-8").encode("¢");
// for string = new TextDecoder("utf-8").decode(uint8array);
var string = new Uint8Array([0x01, 0x02])
var data = new Uint8Array([0x03, 0x04, 0x05])
var handle_error = function (error) {
cnosole.log("Error:",error)
}
window.crypto.subtle.digest({name: "SHA-256"}, string).then(function (hash) {
console.log("SHA-256:",new Uint8Array(hash))
window.crypto.subtle.importKey("raw", hash, {name: "AES-GCM"}, true, ["encrypt", "decrypt"]).then(function (key) {
var algorithm = key.algorithm
algorithm.iv = window.crypto.getRandomValues(new Uint8Array(16))
window.crypto.subtle.encrypt(algorithm, key, data).then(function (ct) {
console.log("AES-GCM encrypt:",new Uint8Array(ct))
window.crypto.subtle.decrypt(algorithm, key, ct).then(function (pt) {
console.log("AES-GCM decrypt:",new Uint8Array(pt))
}, handle_error)
}, handle_error)
}, handle_error)
}, handle_error)
function sha256(str) {
// We transform the string into an arraybuffer.
var buffer = new TextEncoder("utf-8").encode(str);
return crypto.subtle.digest("SHA-256", buffer).then(function (hash) {
return hex(hash);
});
}
function hex(buffer) {
var hexCodes = [];
var view = new DataView(buffer);
for (var i = 0; i < view.byteLength; i += 4) {
// Using getUint32 reduces the number of iterations needed (we process 4 bytes each time)
var value = view.getUint32(i)
// toString(16) will give the hex representation of the number without padding
var stringValue = value.toString(16)
// We use concatenation and slice for padding
var padding = '00000000'
var paddedValue = (padding + stringValue).slice(-padding.length)
hexCodes.push(paddedValue);
}
// Join all the hex strings into one
return hexCodes.join("");
}
sha256("foobar").then(function(digest) {
console.log(digest);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment