diff --git a/src/xx.ts b/src/xx.ts index 23a6f80..54d9e80 100644 --- a/src/xx.ts +++ b/src/xx.ts @@ -81,8 +81,8 @@ export class XXHandshake { } private nonceToBytes(n: uint32) : bytes { - const nonce = Buffer.alloc(12); - nonce.writeUInt32LE(n, 4); + const nonce = Buffer.alloc(12, 0x00); + nonce.writeUInt32LE(n, 4, true); return nonce; } @@ -90,22 +90,23 @@ export class XXHandshake { private encrypt(k: bytes32, n: uint32, ad: bytes, plaintext: bytes) : bytes { const nonce = this.nonceToBytes(n); const ctx = new AEAD(); + ctx.init(k, nonce); ctx.aad(ad); ctx.encrypt(plaintext); - return ctx.final(); + return plaintext; } private decrypt(k: bytes32, n: uint32, ad: bytes, ciphertext: bytes) : bytes { const nonce = this.nonceToBytes(n); - const ctx = new AEAD(); + const aead = new AEAD(); - ctx.init(k, nonce); - ctx.aad(ad); - ctx.decrypt(ciphertext); + aead.init(k, nonce); + aead.aad(ad); + aead.decrypt(ciphertext); - return ctx.final(); + return ciphertext; } private isEmptyKey(k: bytes32) : boolean { diff --git a/test/xx.test.ts b/test/xx.test.ts index 2c4f03a..69135ef 100644 --- a/test/xx.test.ts +++ b/test/xx.test.ts @@ -1,6 +1,6 @@ import { expect, assert } from "chai"; import { Buffer } from 'buffer'; -import { ed25519 } from 'bcrypto'; +import { ed25519, AEAD } from 'bcrypto'; import { XXHandshake, KeyPair } from "../src/xx"; import { loadPayloadProto, generateEd25519Keys } from "./utils"; @@ -108,4 +108,15 @@ describe("Index", () => { await doHandshake(xx); }); + it("Test symmetric encrypt and decrypt", async () => { + const xx = new XXHandshake(); + const { nsInit, nsResp } = await doHandshake(xx); + const ad = Buffer.from("authenticated"); + const message = Buffer.from("HelloCrypto"); + + xx.encryptWithAd(nsInit.cs1, ad, message); + const decrypted = xx.decryptWithAd(nsResp.cs1, ad, message); + + assert(Buffer.from("HelloCrypto").equals(decrypted), "Decrypted text buffer not equal to plaintext buffer"); + }); });