diff --git a/examples/experimental/webcrypto.js b/examples/experimental/webcrypto.js new file mode 100644 index 00000000000..12bd3518d93 --- /dev/null +++ b/examples/experimental/webcrypto.js @@ -0,0 +1,50 @@ +import { crypto } from "k6/experimental/webcrypto"; + +export default async function () { + const key = await crypto.subtle.generateKey( + { + name: "AES-CBC", + length: 256, + }, + true, + ["encrypt", "decrypt"] + ); + + const encoded = stringToArrayBuffer("Hello, World!"); + const iv = crypto.getRandomValues(new Uint8Array(16)); + + const ciphertext = await crypto.subtle.encrypt( + { + name: "AES-CBC", + iv: iv, + }, + key, + encoded + ); + + const plaintext = await crypto.subtle.decrypt( + { + name: "AES-CBC", + iv: iv, + }, + key, + ciphertext, + ); + + console.log("deciphered text == original text: ", arrayBufferToHex(plaintext) === arrayBufferToHex(encoded)) +} + +function arrayBufferToHex(buffer) { + return [...new Uint8Array(buffer)] + .map((x) => x.toString(16).padStart(2, "0")) + .join(""); +} + +function stringToArrayBuffer(str) { + var buf = new ArrayBuffer(str.length * 2); // 2 bytes for each char + var bufView = new Uint16Array(buf); + for (var i = 0, strLen = str.length; i < strLen; i++) { + bufView[i] = str.charCodeAt(i); + } + return buf; +} \ No newline at end of file