Skip to content

Commit 1071b8f

Browse files
committed
Merge remote-tracking branch 'origin/main' into toki
2 parents 1353e3a + 65f8deb commit 1071b8f

File tree

5 files changed

+92
-10
lines changed

5 files changed

+92
-10
lines changed

contracts/ILCPClientErrors.sol

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ interface ILCPClientErrors {
7373
error LCPClientZKDCAPRisc0ImageIdNotSet();
7474
error LCPClientZKDCAPUnexpectedIntelRootCAHash();
7575
error LCPClientZKDCAPOutputReportUnexpectedOperator(address actual, address expected);
76+
error LCPClientZKDCAPInvalidOperator();
7677

7778
error LCPClientZKDCAPDisallowedTCBStatus();
7879
error LCPClientZKDCAPDisallowedAdvisoryID();

contracts/LCPClientZKDCAPBase.sol

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,15 @@ abstract contract LCPClientZKDCAPBase is LCPClientBase {
236236
message.operator_signature
237237
);
238238
}
239+
240+
// if the operators are set, the operator address must be non-zero and active
241+
if (
242+
clientStorage.clientState.operators.length != 0
243+
&& !ensureActiveOperator(clientStorage.clientState, operator)
244+
) {
245+
revert LCPClientZKDCAPInvalidOperator();
246+
}
247+
239248
if (output.operator != address(0) && output.operator != operator) {
240249
revert LCPClientZKDCAPOutputReportUnexpectedOperator(operator, output.operator);
241250
}
@@ -379,4 +388,20 @@ abstract contract LCPClientZKDCAPBase is LCPClientBase {
379388
return (currentUpdated, false);
380389
}
381390
}
391+
392+
function ensureActiveOperator(ProtoClientState.Data storage clientState, address operator)
393+
internal
394+
view
395+
returns (bool)
396+
{
397+
if (operator == address(0)) {
398+
return false;
399+
}
400+
for (uint256 i = 0; i < clientState.operators.length; i++) {
401+
if (address(bytes20(clientState.operators[i])) == operator) {
402+
return true;
403+
}
404+
}
405+
return false;
406+
}
382407
}

lib/risc0-ethereum

Submodule risc0-ethereum updated 221 files

test/LCPClientZKDCAPTest.t.sol

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -575,11 +575,42 @@ contract LCPClientZKDCAPTest is BasicTest {
575575
DCAPValidator.Output memory output = ZKDCAPTestHelper.qvOutput();
576576
output.operator = op1.addr;
577577
IbcLightclientsLcpV1ZKDCAPRegisterEnclaveKeyMessage.Data memory message = registerEnclaveKeyMessage(output);
578-
vm.expectRevert(
579-
abi.encodeWithSelector(
580-
ILCPClientErrors.LCPClientZKDCAPOutputReportUnexpectedOperator.selector, address(0), output.operator
578+
vm.expectRevert(abi.encodeWithSelector(ILCPClientErrors.LCPClientZKDCAPInvalidOperator.selector));
579+
lc.zkDCAPRegisterEnclaveKey(clientId, message);
580+
}
581+
582+
{
583+
// if the operator signature is set by an unregistered operator, it should fail
584+
DCAPValidator.Output memory output = ZKDCAPTestHelper.qvOutput();
585+
IbcLightclientsLcpV1ZKDCAPRegisterEnclaveKeyMessage.Data memory message = registerEnclaveKeyMessage(output);
586+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(
587+
op2,
588+
keccak256(
589+
LCPOperator.computeEIP712ZKDCAPRegisterEnclaveKey(
590+
clientState.zkdcap_verifier_infos[0], keccak256(ZKDCAPTestHelper.toBytes(output))
591+
)
592+
)
593+
);
594+
message.operator_signature = abi.encodePacked(r, s, v);
595+
vm.expectRevert(abi.encodeWithSelector(ILCPClientErrors.LCPClientZKDCAPInvalidOperator.selector));
596+
lc.zkDCAPRegisterEnclaveKey(clientId, message);
597+
}
598+
599+
{
600+
// if the operator signature and operator are set by an unregistered operator, it should fail
601+
DCAPValidator.Output memory output = ZKDCAPTestHelper.qvOutput();
602+
output.operator = op2.addr;
603+
IbcLightclientsLcpV1ZKDCAPRegisterEnclaveKeyMessage.Data memory message = registerEnclaveKeyMessage(output);
604+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(
605+
op2,
606+
keccak256(
607+
LCPOperator.computeEIP712ZKDCAPRegisterEnclaveKey(
608+
clientState.zkdcap_verifier_infos[0], keccak256(ZKDCAPTestHelper.toBytes(output))
609+
)
581610
)
582611
);
612+
message.operator_signature = abi.encodePacked(r, s, v);
613+
vm.expectRevert(abi.encodeWithSelector(ILCPClientErrors.LCPClientZKDCAPInvalidOperator.selector));
583614
lc.zkDCAPRegisterEnclaveKey(clientId, message);
584615
}
585616

@@ -589,7 +620,7 @@ contract LCPClientZKDCAPTest is BasicTest {
589620
output.operator = op1.addr;
590621
IbcLightclientsLcpV1ZKDCAPRegisterEnclaveKeyMessage.Data memory message = registerEnclaveKeyMessage(output);
591622
(uint8 v, bytes32 r, bytes32 s) = vm.sign(
592-
op2,
623+
op3,
593624
keccak256(
594625
LCPOperator.computeEIP712ZKDCAPRegisterEnclaveKey(
595626
clientState.zkdcap_verifier_infos[0], keccak256(ZKDCAPTestHelper.toBytes(output))
@@ -599,7 +630,7 @@ contract LCPClientZKDCAPTest is BasicTest {
599630
message.operator_signature = abi.encodePacked(r, s, v);
600631
vm.expectRevert(
601632
abi.encodeWithSelector(
602-
ILCPClientErrors.LCPClientZKDCAPOutputReportUnexpectedOperator.selector, op2.addr, op1.addr
633+
ILCPClientErrors.LCPClientZKDCAPOutputReportUnexpectedOperator.selector, op3.addr, op1.addr
603634
)
604635
);
605636
lc.zkDCAPRegisterEnclaveKey(clientId, message);
@@ -625,12 +656,12 @@ contract LCPClientZKDCAPTest is BasicTest {
625656
}
626657

627658
{
628-
// if both operator and operator signature are not set, it should succeed
659+
// if both operator and operator signature are not set, it should fail
629660
DCAPValidator.Output memory output = ZKDCAPTestHelper.qvOutput();
630661
output.enclaveKey = address(2);
631662
IbcLightclientsLcpV1ZKDCAPRegisterEnclaveKeyMessage.Data memory message = registerEnclaveKeyMessage(output);
663+
vm.expectRevert(abi.encodeWithSelector(ILCPClientErrors.LCPClientZKDCAPInvalidOperator.selector));
632664
lc.zkDCAPRegisterEnclaveKey(clientId, message);
633-
assertEq(lc.getEKInfo(clientId, output.enclaveKey).operator, address(0));
634665
}
635666

636667
{

test/ZKDCAPVerifier.t.sol

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {DCAPValidator} from "../contracts/DCAPValidator.sol";
99
contract ZKDCAPVerifierTest is BasicTest {
1010
IRiscZeroVerifier verifier_rz11;
1111
IRiscZeroVerifier verifier_rz12;
12+
IRiscZeroVerifier verifier_rz30;
1213

1314
function setUp() public {
1415
// ref. https://github.com/risc0/risc0-ethereum/blob/4fa7de055d461b7fa948eb56107b7a172459e8fc/contracts/src/groth16/ControlID.sol#L22
@@ -21,6 +22,11 @@ contract ZKDCAPVerifierTest is BasicTest {
2122
hex"8cdad9242664be3112aba377c5425a4df735eb1c6966472b561d2855932c0469",
2223
hex"04446e66d300eb7fb45c9726bb53c793dda407a62e9601618bb43c5c14657ac0"
2324
);
25+
// https://github.com/risc0/risc0/blob/61cfbaf57615b83854424f972f23e026970b4201/risc0/circuit/recursion/src/control_id.rs#L53-L59
26+
verifier_rz30 = new RiscZeroGroth16Verifier(
27+
hex"a54dc85ac99f851c92d7c96d7318af41dbe7c0194edfcc37eb4d422a998c1f56",
28+
hex"04446e66d300eb7fb45c9726bb53c793dda407a62e9601618bb43c5c14657ac0"
29+
);
2430
}
2531

2632
/*
@@ -30,7 +36,7 @@ contract ZKDCAPVerifierTest is BasicTest {
3036
"commit":"00000003000000000500906ed50000a1acc73eb45794fa1734f14d882e91925b6006f79d3bb2460df9d01b333d700900000000679885950000000067c00a9c15150b07ff800e000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000700000000000000813c146e403f203f2784fa222b3edeac70727dee21c0b08f74883aa189e7b0ed000000000000000000000000000000000000000000000000000000000000000083d719e77deaca1470f6baf62a4d774303c899db69020f9c70ee1dfc08c7ce9e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017dcf7408c72ebe9076aebbb208d2c85e62050db4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000e494e54454c2d53412d3030333334000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e494e54454c2d53412d3030363135000000000000000000000000000000000000"
3137
}}
3238
*/
33-
function testVerify1() public view {
39+
function testVerify11() public view {
3440
verifier_rz11.verify(
3541
hex"50bd1769039405f7898272862594bc436f08dab3e5c1200e0c44b542b462fe09bb2655b700ae0374f99c5b30f8580605267de7b5d121758ae405b5b378b588deca3042a70e22eefd598a4638d7c039ffb737f45dbee0152559f25c4dc0854ab7fd7cc2f52704dc9991d84e00c48d155b0d7fbfe2d307d1fb1a573c38083d86bea39e60191110517565779f631fc0028b82ff9b224bcc627bd6fd3ee1c1ffcea67e9e921c281abaaeacabff9fb74232c9ca2914ce6fe3ec9a4584c68a888339f2e6865c9f2bb57d5a38759c09ecb3f9f9f80fd582f23b7fb47495f783a8cc2eedb99ca18b0337102df4a2e325367d954ea5154f11c03f459551f849763d75ccad9d6665c5",
3642
hex"200d1f40b5733d31e4f3bfb1f106351e878aea304b5c9e73690b9e18e2e77bb6",
@@ -49,7 +55,7 @@ contract ZKDCAPVerifierTest is BasicTest {
4955
}
5056
}
5157
*/
52-
function testVerify2() public view {
58+
function testVerify12() public view {
5359
verifier_rz12.verify(
5460
hex"c101b42b2178a72a844649d14328eb6b7a650d6fe1640c1ef2fa887bcc755597229713fb2360369704b1c06c610e6a83dbdc31bb04e1cb5a8def9c7354fc34be7e74844301db3e4f8c2cef2a91df93e191e3138ac27dac03d1a2d2bc2e18330f712e65021d34cf95c2ff4134df2a04a726de5a8d8e535f10225f00046295f8b3d3b939a626e424d04c48c94aef79267457e375ce4670ef5eb5af2c3e8fea40c4905228e617130a7a0c1ac16ed030103b02f94c89f6f5935d8a581198df573c050ea63e331b6c494238c02ff85040e720621dd81fa6d1191098cf40ac05923398e58b213c197e62e6a4394b5b5134f9770ba31805e57c2c8635e921472936bab23a56c824",
5561
hex"a7b6d5b9a35f9c4e9364e69728c87a4818fe56b361b5f5ff25bab7494074b50b",
@@ -59,6 +65,25 @@ contract ZKDCAPVerifierTest is BasicTest {
5965
);
6066
}
6167

68+
/*
69+
{
70+
"Risc0":{
71+
"image_id":"27a8d21b54ce10b06901dca7de504f7421cfcad47bae69e8783e449519d99635",
72+
"selector":"73c457ba",
73+
"seal":"2708b796ffbe2beafb20f3c313f4e8c05f8b2c1d5320a10e0e40a38f44584b9d2f1f2b0dc953ab24d707b5664bf4a4ab4b7c13ce7303f46af3ce10021fbbe3950df800fe0b015d9ece18c61a1095dbf9b9043a4fd5d7ab0593532e727c9d48a80d0bc9a26dcc2e2426bfa7747dda3a64a563d14596d9ef81b3807b958492ba13164020246d455ce5c7864b7e98af1c19c593b3e4b1723384f17a9e272e52d9cf0ef7eea2b3f3ad8622099b96b2950c304c3acb826daf42456a6e858a8c56ae7c1b295ab9e1b12107427031951322955ba7a30c613797a82ae9ffdcef77d06d4924ba37eeb963abb404775a498a34bc2d2f9222482a9e69124858e69d6ee8ccdc",
74+
"output":"0000000300000000050000000100606a000000d61f4e3d30011899d16131d4c940ef1f75ec53d7f9a70cbb3aab1f5ab0235b2b0000000068aea64900000000e8aea6484820f3376ae6b2f2034d3b7a4b48a778000000000000000000000000000000000000000000000000000000000000000005000000000000000700000000000000568b2634f9e30ab3df84ccc8a1fab58d87dcd02e02cbb62172ed4734215f0f38000000000000000000000000000000000000000000000000000000000000000083d719e77deaca1470f6baf62a4d774303c899db69020f9c70ee1dfc08c7ce9e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011770f0a82157d84d369a1935277fb8cca8b34e18000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000e494e54454c2d53412d3030333334000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e494e54454c2d53412d3030363135000000000000000000000000000000000000"
75+
}
76+
*/
77+
function testVerify30() public view {
78+
verifier_rz30.verify(
79+
hex"73c457ba2708b796ffbe2beafb20f3c313f4e8c05f8b2c1d5320a10e0e40a38f44584b9d2f1f2b0dc953ab24d707b5664bf4a4ab4b7c13ce7303f46af3ce10021fbbe3950df800fe0b015d9ece18c61a1095dbf9b9043a4fd5d7ab0593532e727c9d48a80d0bc9a26dcc2e2426bfa7747dda3a64a563d14596d9ef81b3807b958492ba13164020246d455ce5c7864b7e98af1c19c593b3e4b1723384f17a9e272e52d9cf0ef7eea2b3f3ad8622099b96b2950c304c3acb826daf42456a6e858a8c56ae7c1b295ab9e1b12107427031951322955ba7a30c613797a82ae9ffdcef77d06d4924ba37eeb963abb404775a498a34bc2d2f9222482a9e69124858e69d6ee8ccdc",
80+
hex"27a8d21b54ce10b06901dca7de504f7421cfcad47bae69e8783e449519d99635",
81+
sha256(
82+
hex"0000000300000000050000000100606a000000d61f4e3d30011899d16131d4c940ef1f75ec53d7f9a70cbb3aab1f5ab0235b2b0000000068aea64900000000e8aea6484820f3376ae6b2f2034d3b7a4b48a778000000000000000000000000000000000000000000000000000000000000000005000000000000000700000000000000568b2634f9e30ab3df84ccc8a1fab58d87dcd02e02cbb62172ed4734215f0f38000000000000000000000000000000000000000000000000000000000000000083d719e77deaca1470f6baf62a4d774303c899db69020f9c70ee1dfc08c7ce9e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011770f0a82157d84d369a1935277fb8cca8b34e18000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000e494e54454c2d53412d3030333334000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e494e54454c2d53412d3030363135000000000000000000000000000000000000"
83+
)
84+
);
85+
}
86+
6287
function testParseOutputSWHardeningNeeded() public pure {
6388
bytes memory outputBytes =
6489
hex"0000000300000000050000001200906ed50000a1acc73eb45794fa1734f14d882e91925b6006f79d3bb2460df9d01b333d70090000000067b3f1fa0000000067db736115150b07ff800e00000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000070000000000000026ae825ffce1cf9dcdf682614f4d36704e7bca087bbb5264aca9301d7824cec8000000000000000000000000000000000000000000000000000000000000000083d719e77deaca1470f6baf62a4d774303c899db69020f9c70ee1dfc08c7ce9e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c170f98628b3a01b15654fbfaad1aaf3419b2c3c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000e494e54454c2d53412d3030333334000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e494e54454c2d53412d3030363135000000000000000000000000000000000000";

0 commit comments

Comments
 (0)