<html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <style type="text/css"> pre { font-family: monospace; display: block; white-space: pre; font-size: 2em; } </style> </head> <body> <script type="text/javascript" src="../lib/olm/olm.js"></script> <script type="module"> async function main() { const Olm = window.Olm; await Olm.init({ locateFile: () => "../lib/olm/olm.wasm", }); const alice = new Olm.Account(); alice.create(); console.log("alice", alice.identity_keys()); const bob = new Olm.Account(); bob.unpickle("secret", "EWfA87or4GgQ+wqVkyuFiW9gUk3FI6QSXgp8E2dS5RFLvXgy4oFvxwQ1gVnbMkdJz2Hy9ex9UmJ/ZyuRU0aRt0IwXpw/SUNq4IQeVJ7J/miXW7rV4Ep+4RSEf945KbDrokDCS2CoL5PIfv/NYyey32gA0hMi8wWIfIlOxFBV4SBJYSC+Qd54VjprwCg0Sn9vjQouKVrM/+5jzsv9+JK5OpWW0Vrb3qrXwyAOEAQ4WlOQcqZHAyPQIw"); console.log("bob", bob.identity_keys()); // generate OTK on receiver side bob.generate_one_time_keys(1); const bobOneTimeKeys = JSON.parse(bob.one_time_keys()); const bobOneTimeKey = Object.values(bobOneTimeKeys.curve25519)[0]; // encrypt const aliceSession = new Olm.Session(); aliceSession.create_outbound( alice, JSON.parse(bob.identity_keys()).curve25519, bobOneTimeKey, ); const message = aliceSession.encrypt("hello secret world"); console.log("message", message); // decrypt const bobSession = new Olm.Session(); bobSession.create_inbound(bob, message.body); const plaintext = bobSession.decrypt(message.type, message.body); console.log("plaintext", plaintext); // remove Bob's OTK as it was used to start an olm session console.log("bob OTK before removing", bob.one_time_keys()); bob.remove_one_time_keys(bobSession); console.log("bob OTK after removing", bob.one_time_keys()); } main(); </script> </body> </html>