elliptic-curve-solidity
Version:
Elliptic Curve arithmetic for up to 256-bit curves written in solidity
99 lines (91 loc) • 3.65 kB
JavaScript
const EllipticCurve = artifacts.require("./TestEllipticCurve")
contract("FastEcMul", accounts => {
const curves = ["secp256k1", "secp192k1", "secp224k1", "P256", "P192", "P224"]
for (const curve of curves) {
describe(`Arithmetic operations - Curve ${curve}`, () => {
const curveData = require(`./data/${curve}.json`)
const pp = web3.utils.toBN(curveData.params.pp)
const nn = web3.utils.toBN(curveData.params.nn)
const aa = web3.utils.toBN(curveData.params.aa)
const lambda = web3.utils.toBN(curveData.params.lambda)
const beta = web3.utils.toBN(curveData.params.beta)
let fastEcMul
before(async () => {
fastEcMul = await EllipticCurve.new()
})
// Scalar decomposition
for (const [index, test] of curveData.decomposeScalar.valid.entries()) {
it(`should decompose an scalar (${index + 1}) - ${test.description}`, async () => {
const res = await fastEcMul.decomposeScalar.call(
web3.utils.toBN(test.input.k),
nn,
lambda)
const expectedK1 = web3.utils.toBN(test.output.k1)
const expectedK2 = web3.utils.toBN(test.output.k2)
assert.equal(res[0].toString(10), expectedK1.toString())
assert.equal(res[1].toString(10), expectedK2.toString())
})
}
// Simultaneous multiplication
for (const [index, test] of curveData.simMul.valid.entries()) {
it(`should do a simultaneous multiplication (${index + 1}) - ${test.description}`, async () => {
const res = await fastEcMul.ecSimMul.call(
[
web3.utils.toBN(test.input.k1),
web3.utils.toBN(test.input.k2),
web3.utils.toBN(test.input.l1),
web3.utils.toBN(test.input.l2),
],
[
web3.utils.toBN(test.input.px),
web3.utils.toBN(test.input.py),
web3.utils.toBN(test.input.qx),
web3.utils.toBN(test.input.qy),
],
aa,
beta,
pp
)
const expectedMulX = web3.utils.toBN(test.output.x)
const expectedMulY = web3.utils.toBN(test.output.y)
assert.equal(res[0].toString(10), expectedMulX.toString())
assert.equal(res[1].toString(10), expectedMulY.toString())
})
}
// MulAddMul
for (const [index, test] of curveData.mulAddMul.valid.entries()) {
it(`should do decompose scalar and simult. multiplication (${index + 1}) - ${test.description}`, async () => {
const k = await fastEcMul.decomposeScalar.call(
web3.utils.toBN(test.input.k),
nn,
lambda)
const l = await fastEcMul.decomposeScalar.call(
web3.utils.toBN(test.input.l),
nn,
lambda)
const res = await fastEcMul.ecSimMul.call(
[
web3.utils.toBN(k[0]),
web3.utils.toBN(k[1]),
web3.utils.toBN(l[0]),
web3.utils.toBN(l[1]),
],
[
web3.utils.toBN(test.input.px),
web3.utils.toBN(test.input.py),
web3.utils.toBN(test.input.qx),
web3.utils.toBN(test.input.qy),
],
aa,
beta,
pp
)
const expectedMulX = web3.utils.toBN(test.output.x)
const expectedMulY = web3.utils.toBN(test.output.y)
assert.equal(res[0].toString(), expectedMulX.toString())
assert.equal(res[1].toString(), expectedMulY.toString())
})
}
})
}
})