Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions itests/contracts/bls12/G1AddTest.hex
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
6080604052348015600e575f5ffd5b506111568061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806323d746281461002d575b5f5ffd5b610035610037565b005b5f610060600b6040518061012001604052806101008152602001610e216101009139608061052e565b90506100ba816040518060a00160405280608081526020016110a1608091396040518060400160405280601281526020017f673161646420616464206d69736d617463680000000000000000000000000000815250610628565b5f6100e3600b6040518061012001604052806101008152602001610d216101009139608061052e565b905061013d816040518060a0016040528060808152602001611021608091396040518060400160405280601a81526020017f673161646420646f75626c696e67206731206d69736d61746368000000000000815250610628565b5f610166600b6040518061012001604052806101008152602001610c216101009139608061052e565b90506101c0816040518060a0016040528060808152602001610fa1608091396040518060400160405280601a81526020017f673161646420646f75626c696e67207031206d69736d61746368000000000000815250610628565b5f610254600b6040518060a0016040528060808152602001610aa160809139608067ffffffffffffffff8111156101fa576101f961072e565b5b6040519080825280601f01601f19166020018201604052801561022c5781602001600182028036833780820191505090505b5060405160200161023e9291906107ad565b604051602081830303815290604052608061052e565b90506102ae816040518060a0016040528060808152602001610aa1608091396040518060400160405280601c81526020017f6731616464206964656e746974792067312b30206d69736d6174636800000000815250610628565b5f610342600b6040518060a0016040528060808152602001610f2160809139608067ffffffffffffffff8111156102e8576102e761072e565b5b6040519080825280601f01601f19166020018201604052801561031a5781602001600182028036833780820191505090505b5060405160200161032c9291906107ad565b604051602081830303815290604052608061052e565b905061039c816040518060a0016040528060808152602001610f21608091396040518060400160405280601c81526020017f6731616464206964656e746974792070312b30206d69736d6174636800000000815250610628565b5f6103c5600b60405180610120016040528061010081526020016109a16101009139608061052e565b905061045481608067ffffffffffffffff8111156103e6576103e561072e565b5b6040519080825280601f01601f1916602001820160405280156104185781602001600182028036833780820191505090505b506040518060400160405280601081526020017f67316164642067312d673120213d203000000000000000000000000000000000815250610628565b5f61047d600b6040518061012001604052806101008152602001610b216101009139608061052e565b905061050c81608067ffffffffffffffff81111561049e5761049d61072e565b5b6040519080825280601f01601f1916602001820160405280156104d05781602001600182028036833780820191505090505b506040518060400160405280601081526020017f67316164642070312d703120213d203000000000000000000000000000000000815250610628565b610525600b60405180602001604052805f815250610681565b50505050505050565b60605f5f8573ffffffffffffffffffffffffffffffffffffffff168560405161055791906107d0565b5f60405180830381855afa9150503d805f811461058f576040519150601f19603f3d011682016040523d82523d5f602084013e610594565b606091505b5091509150816105d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d090610840565b60405180910390fd5b8381511461061c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610613906108a8565b60405180910390fd5b80925050509392505050565b8180519060200120838051906020012014819061067b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106729190610918565b60405180910390fd5b50505050565b5f8273ffffffffffffffffffffffffffffffffffffffff16826040516106a791906107d0565b5f60405180830381855afa9150503d805f81146106df576040519150601f19603f3d011682016040523d82523d5f602084013e6106e4565b606091505b505090508015610729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072090610982565b60405180910390fd5b505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f6107878261075b565b6107918185610765565b93506107a181856020860161076f565b80840191505092915050565b5f6107b8828561077d565b91506107c4828461077d565b91508190509392505050565b5f6107db828461077d565b915081905092915050565b5f82825260208201905092915050565b7f707265636f6d70696c65207265766572746564000000000000000000000000005f82015250565b5f61082a6013836107e6565b9150610835826107f6565b602082019050919050565b5f6020820190508181035f8301526108578161081e565b9050919050565b7f756e65787065637465642072657475726e206c656e67746800000000000000005f82015250565b5f6108926018836107e6565b915061089d8261085e565b602082019050919050565b5f6020820190508181035f8301526108bf81610886565b9050919050565b5f81519050919050565b5f601f19601f8301169050919050565b5f6108ea826108c6565b6108f481856107e6565b935061090481856020860161076f565b61090d816108d0565b840191505092915050565b5f6020820190508181035f83015261093081846108e0565b905092915050565b7f65787065637465642072657665727400000000000000000000000000000000005f82015250565b5f61096c600f836107e6565b915061097782610938565b602082019050919050565b5f6020820190508181035f83015261099981610960565b905091905056fe0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb00000000000000000000000000000000114d1d6855d545a8aa7d76c8cf2e21f267816aef1db507c96655b9d5caac42364e6f38ba0ecb751bad54dcd6b939c2ca0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e100000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a2100000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca9426000000000000000000000000000000000195e911162921ba5ed055b496420f197693d36569ec34c63d7c0529a097d49e543070afba4b707e878e53c2b779208a00000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a2100000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a210000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e100000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a2100000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a210000000000000000000000000000000015222cddbabdd764c4bee0b3720322a65ff4712c86fc4b1588d0c209210a0884fa9468e855d261c483091b2bf7de6a630000000000000000000000000000000009f9edb99bc3b75d7489735c98b16ab78b9386c5f7a1f76c7e96ac6eb5bbde30dbca31a74ec6e0f0b12229eecea33c39000000000000000000000000000000000572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e00000000000000000000000000000000166a9d8cabc673a322fda673779d8e3822ba3ecb8670e461f73bb9021d5fd76a4c56d9d4cd16bd1bba86881979749d28000000000000000000000000000000000a40300ce2dec9888b60690e9a41d3004fda4886854573974fab73b046d3147ba5b7a5bde85279ffede1b45b3918d82d0000000000000000000000000000000006d3d887e9f53b9ec4eb6cedf5607226754b07c01ace7834f57f3e7315faefb739e59018e22c492006190fba4a870025a26469706673582212202ce0e4ad7fc735a1b0efefb566665d6d0354c3829e3b9299ce0db34d808e52c764736f6c634300081e0033
69 changes: 69 additions & 0 deletions itests/contracts/bls12/G1AddTest.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract G1AddTest {
function callOk(address pc, bytes memory input, uint256 expectedLen) internal view returns (bytes memory) {
(bool ok, bytes memory out) = pc.staticcall(input);
require(ok, "precompile reverted");
require(out.length == expectedLen, "unexpected return length");
return out;
}

function expectRevert(address pc, bytes memory input) internal view {
(bool ok, ) = pc.staticcall(input);
require(!ok, "expected revert");
}

function expectEq(bytes memory a, bytes memory b, string memory what) internal pure {
require(keccak256(a) == keccak256(b), what);
}

address constant PRECOMPILE = 0x000000000000000000000000000000000000000b; // BLS12_G1ADD
uint256 constant OUT_LEN = 128;

// Vector: g1 + p1
bytes constant INPUT_ADD_G1_P1 = hex"0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e100000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a21";
bytes constant EXPECT_ADD_G1_P1 = hex"000000000000000000000000000000000a40300ce2dec9888b60690e9a41d3004fda4886854573974fab73b046d3147ba5b7a5bde85279ffede1b45b3918d82d0000000000000000000000000000000006d3d887e9f53b9ec4eb6cedf5607226754b07c01ace7834f57f3e7315faefb739e59018e22c492006190fba4a870025";
// Vector: g1 + g1 = 2*g1
bytes constant INPUT_G1_PLUS_G1 = hex"0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1";
bytes constant EXPECT_G1_PLUS_G1 = hex"000000000000000000000000000000000572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e00000000000000000000000000000000166a9d8cabc673a322fda673779d8e3822ba3ecb8670e461f73bb9021d5fd76a4c56d9d4cd16bd1bba86881979749d28";
// Vector: p1 + p1 = 2*p1
bytes constant INPUT_P1_PLUS_P1 = hex"00000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a2100000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a21";
bytes constant EXPECT_P1_PLUS_P1 = hex"0000000000000000000000000000000015222cddbabdd764c4bee0b3720322a65ff4712c86fc4b1588d0c209210a0884fa9468e855d261c483091b2bf7de6a630000000000000000000000000000000009f9edb99bc3b75d7489735c98b16ab78b9386c5f7a1f76c7e96ac6eb5bbde30dbca31a74ec6e0f0b12229eecea33c39";
// Encoded canonical points (128 bytes each) for identity tests
bytes constant G1_ENC = hex"0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1";
bytes constant P1_ENC = hex"00000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a21";
// Subtraction (add inverse) vectors -> infinity
bytes constant INPUT_G1_MINUS_G1 = hex"0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb00000000000000000000000000000000114d1d6855d545a8aa7d76c8cf2e21f267816aef1db507c96655b9d5caac42364e6f38ba0ecb751bad54dcd6b939c2ca";
bytes constant INPUT_P1_MINUS_P1 = hex"00000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a2100000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca9426000000000000000000000000000000000195e911162921ba5ed055b496420f197693d36569ec34c63d7c0529a097d49e543070afba4b707e878e53c2b779208a";

function runTests() public view {
// Positive: addition
bytes memory out1 = callOk(PRECOMPILE, INPUT_ADD_G1_P1, OUT_LEN);
expectEq(out1, EXPECT_ADD_G1_P1, "g1add add mismatch");

// Additional positives
bytes memory out2 = callOk(PRECOMPILE, INPUT_G1_PLUS_G1, OUT_LEN);
expectEq(out2, EXPECT_G1_PLUS_G1, "g1add doubling g1 mismatch");

bytes memory out3 = callOk(PRECOMPILE, INPUT_P1_PLUS_P1, OUT_LEN);
expectEq(out3, EXPECT_P1_PLUS_P1, "g1add doubling p1 mismatch");

// Identity: g1 + 0 = g1; p1 + 0 = p1
bytes memory out4 = callOk(PRECOMPILE, bytes.concat(G1_ENC, new bytes(OUT_LEN)), OUT_LEN);
expectEq(out4, G1_ENC, "g1add identity g1+0 mismatch");

bytes memory out5 = callOk(PRECOMPILE, bytes.concat(P1_ENC, new bytes(OUT_LEN)), OUT_LEN);
expectEq(out5, P1_ENC, "g1add identity p1+0 mismatch");

// Subtraction to infinity
bytes memory out6 = callOk(PRECOMPILE, INPUT_G1_MINUS_G1, OUT_LEN);
expectEq(out6, new bytes(OUT_LEN), "g1add g1-g1 != 0");

bytes memory out7 = callOk(PRECOMPILE, INPUT_P1_MINUS_P1, OUT_LEN);
expectEq(out7, new bytes(OUT_LEN), "g1add p1-p1 != 0");

// Negative: incorrect input size should revert
expectRevert(PRECOMPILE, hex"");
}
}
Loading
Loading