33 lines
1.3 KiB
TypeScript
33 lines
1.3 KiB
TypeScript
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}$/);
|
|
});
|
|
});
|