import { describe, expect, it } from "vitest"; import { computeWecomMsgSignature, decryptWecomEncrypted, encryptWecomPlaintext } from "./crypto.js"; describe("wecom crypto", () => { it("round-trips plaintext", () => { const encodingAESKey = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG"; // 43 chars base64 (plus '=' padding) const plaintext = JSON.stringify({ hello: "world" }); const encrypt = encryptWecomPlaintext({ encodingAESKey, receiveId: "", plaintext }); const decrypted = decryptWecomEncrypted({ encodingAESKey, receiveId: "", encrypt }); expect(decrypted).toBe(plaintext); }); it("pads correctly when raw length is a multiple of 32", () => { const encodingAESKey = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG"; // raw length = 20 + plaintext.length + receiveId.length; choose plaintext length % 32 === 12 const plaintext = "x".repeat(12); const encrypt = encryptWecomPlaintext({ encodingAESKey, receiveId: "", plaintext }); const decrypted = decryptWecomEncrypted({ encodingAESKey, receiveId: "", encrypt }); expect(decrypted).toBe(plaintext); }); it("computes sha1 msg signature", () => { const sig = computeWecomMsgSignature({ token: "token", timestamp: "123", nonce: "456", encrypt: "ENCRYPT", }); expect(sig).toMatch(/^[a-f0-9]{40}$/); }); });