// 依赖: Node.js 18+ (内置 crypto 与 fetch)
const crypto = require('crypto');

const BASE = '{{BASE}}';
const CODE = 'YOUR-CARD-KEY';

// RSA-OAEP(SHA-1) 分块加/解密, 每块 190 字节, 以 | 连接
function encrypt(plain, publicKey) {
  const buf = Buffer.from(plain, 'utf8');
  const parts = [];
  for (let i = 0; i < buf.length; i += 190) {
    const enc = crypto.publicEncrypt(
      { key: publicKey, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING, oaepHash: 'sha1' },
      buf.subarray(i, i + 190)
    );
    parts.push(enc.toString('base64'));
  }
  return parts.join('|');
}
function decrypt(cipher, privateKey) {
  return cipher.split('|').map((c) =>
    crypto.privateDecrypt(
      { key: privateKey, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING, oaepHash: 'sha1' },
      Buffer.from(c, 'base64')
    ).toString('utf8')
  ).join('');
}

(async () => {
  // 1. 获取服务器公钥
  const pubResp = await (await fetch('{{PUBKEY}}')).json();
  const serverPub = pubResp.data.public_key;

  // 2. 生成客户端密钥对
  const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', { modulusLength: 2048 });
  const clientPub = publicKey.export({ type: 'spki', format: 'pem' });

  // 3. 组装并加密请求
  const payload = JSON.stringify({
    code: CODE,
    timestamp: Math.floor(Date.now() / 1000),
    client_public_key: clientPub,
  });

  // 4. 发送请求
  const res = await fetch('{{VERIFY}}', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ encrypted: encrypt(payload, serverPub) }),
  });
  const data = await res.json();

  // 5. 解密响应
  console.log(data.encrypted ? decrypt(data.encrypted, privateKey) : JSON.stringify(data));
})();
