Skip to content

Commit a377f84

Browse files
committed
Add crypto-verify verify secp256r1 support
1 parent 5cf4ba8 commit a377f84

File tree

2 files changed

+48
-3
lines changed

2 files changed

+48
-3
lines changed

contracts/crypto-verify/src/contract.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,16 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult<QueryResponse> {
3838
signature.as_slice(),
3939
public_key.as_slice(),
4040
)?),
41+
QueryMsg::VerifySecp256R1Signature {
42+
message,
43+
signature,
44+
public_key,
45+
} => to_json_binary(&query_verify_secp256r1(
46+
deps,
47+
message.as_slice(),
48+
signature.as_slice(),
49+
public_key.as_slice(),
50+
)?),
4151
QueryMsg::VerifyEthereumText {
4252
message,
4353
signature,
@@ -106,6 +116,25 @@ pub fn query_verify_cosmos(
106116
}
107117
}
108118

119+
pub fn query_verify_secp256r1(
120+
deps: Deps,
121+
message: &[u8],
122+
signature: &[u8],
123+
public_key: &[u8],
124+
) -> StdResult<VerifyResponse> {
125+
// Hashing
126+
let hash = Sha256::digest(message);
127+
128+
// Verification
129+
let result = deps
130+
.api
131+
.secp256r1_verify(hash.as_ref(), signature, public_key);
132+
match result {
133+
Ok(verifies) => Ok(VerifyResponse { verifies }),
134+
Err(err) => Err(err.into()),
135+
}
136+
}
137+
109138
pub fn query_verify_ethereum_text(
110139
deps: Deps,
111140
message: &str,
@@ -695,6 +724,7 @@ mod tests {
695724
ListVerificationsResponse {
696725
verification_schemes: vec![
697726
"secp256k1".into(),
727+
"secp256r1".into(),
698728
"ed25519".into(),
699729
"ed25519_batch".into()
700730
]

contracts/crypto-verify/src/msg.rs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,17 @@ pub enum QueryMsg {
1717
/// Serialized compressed (33 bytes) or uncompressed (65 bytes) public key.
1818
public_key: Binary,
1919
},
20-
/// Ethereum text verification (compatible to the eth_sign RPC/web3 enpoint).
20+
/// Cosmos format (secp256r1 verification scheme).
21+
#[returns(VerifyResponse)]
22+
VerifySecp256R1Signature {
23+
/// Message to verify.
24+
message: Binary,
25+
/// Serialized signature. Cosmos format (64 bytes).
26+
signature: Binary,
27+
/// Serialized compressed (33 bytes) or uncompressed (65 bytes) public key.
28+
public_key: Binary,
29+
},
30+
/// Ethereum text verification (compatible to the eth_sign RPC/web3 endpoint).
2131
/// This cannot be used to verify transaction.
2232
///
2333
/// See https://web3js.readthedocs.io/en/v1.2.0/web3-eth.html#sign
@@ -29,7 +39,7 @@ pub enum QueryMsg {
2939
/// Serialized signature. Fixed length format (64 bytes `r` and `s` plus the one byte `v`).
3040
signature: Binary,
3141
/// Signer address.
32-
/// This is matched case insensitive, so you can provide checksummed and non-checksummed addresses. Checksums are not validated.
42+
/// This is matched case insensitive, so you can provide check-summed and non-check-summed addresses. Checksums are not validated.
3343
signer_address: String,
3444
},
3545
#[returns(VerifyResponse)]
@@ -85,5 +95,10 @@ pub struct ListVerificationsResponse {
8595
}
8696

8797
pub(crate) fn list_verifications(_deps: Deps) -> Vec<String> {
88-
vec!["secp256k1".into(), "ed25519".into(), "ed25519_batch".into()]
98+
vec![
99+
"secp256k1".into(),
100+
"secp256r1".into(),
101+
"ed25519".into(),
102+
"ed25519_batch".into(),
103+
]
89104
}

0 commit comments

Comments
 (0)