Skip to content

Commit 54ce4be

Browse files
authored
feat: Update cacao identity resolution (#46)
1 parent 55d74d5 commit 54ce4be

File tree

2 files changed

+73
-41
lines changed

2 files changed

+73
-41
lines changed

relay_rpc/src/auth/cacao/payload.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ impl Payload {
7474
}
7575

7676
pub fn identity_key(&self) -> Result<String, CacaoError> {
77+
self.identity_key_from_audience()
78+
.or_else(|_| self.identity_key_from_resources())
79+
}
80+
81+
fn identity_key_from_resources(&self) -> Result<String, CacaoError> {
7782
let resources = self
7883
.resources
7984
.as_ref()
@@ -84,4 +89,10 @@ impl Payload {
8489
.map(|data| data.to_string())
8590
.map_err(|_| CacaoError::PayloadIdentityKey)
8691
}
92+
93+
fn identity_key_from_audience(&self) -> Result<String, CacaoError> {
94+
extract_did_data(&self.aud, DID_METHOD_KEY)
95+
.map(|data| data.to_string())
96+
.map_err(|_| CacaoError::PayloadIdentityKey)
97+
}
8798
}

relay_rpc/src/auth/cacao/tests.rs

Lines changed: 62 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,102 @@
11
use crate::auth::cacao::Cacao;
22

3-
/// Test that we can verify a Cacao
3+
/// Test that we can verify a deprecated Cacao.
44
#[test]
5-
fn verify_success() {
5+
fn cacao_verify_success() {
66
let cacao_serialized = r#"{
77
"h": {
88
"t": "eip4361"
99
},
1010
"p": {
11-
"iss": "did:pkh:eip155:1:0x262f4f5DC82ad9b803680F07Da7d901D4F71d8D1",
12-
"domain": "http://10.0.2.2:8080",
13-
"aud": "http://10.0.2.2:8080",
11+
"iss": "did:pkh:eip155:1:0xB1bad80be351061Db2F726D2dDe28E0Ebbb88D30",
12+
"domain": "keys.walletconnect.com",
13+
"aud": "https://keys.walletconnect.com",
1414
"version": "1",
15-
"nonce": "[B@c3772c7",
16-
"iat": "2023-01-17T12:15:05+01:00",
15+
"nonce": "2c586f5025cb20094329ccd83684e2b192bebb2a3f83fc91b0b27aa817fd24de",
16+
"iat": "2023-05-17T14:22:32+02:00",
1717
"resources": [
18-
"did:key:z6MkkG9nM8ksS37sq5mgeoCn5kihLkWANcm9pza5WTkq3tWZ"
18+
"did:key:z6MkhoV7JnKEFgwai4R1ui14xcPDnqVFZ3a9dUNM3fE3z3Nf"
1919
]
2020
},
2121
"s": {
2222
"t": "eip191",
23-
"s": "0xf2f0e5dc8875ef1e3d40472078b06ebe4af5fc832e464338996fb0d3134cde7613bc36416519e8dd8959655f0e89c6b7a9de55f7c95f43e8d2240f89939ed7171c"
23+
"s": "0x991f379195564ba1d131c53cc9b3cf13c03e3a8111f502fd40ca12e1d04d98ea58531295c48f852c9c35a938c778f52a2c994f109fc0e94cc4e16f62d41d54371c"
2424
}
25-
} "#;
25+
}"#;
26+
let cacao: Cacao = serde_json::from_str(cacao_serialized).unwrap();
27+
let result = cacao.verify();
28+
assert!(result.is_ok());
29+
assert!(result.map_err(|_| false).unwrap());
30+
31+
let identity_key = cacao.p.identity_key();
32+
assert!(identity_key.is_ok());
33+
assert_eq!(
34+
identity_key.unwrap(),
35+
"z6MkhoV7JnKEFgwai4R1ui14xcPDnqVFZ3a9dUNM3fE3z3Nf"
36+
)
37+
}
38+
39+
/// Test that we can verify a updated Cacao.
40+
#[test]
41+
fn cacao_verify_success_identity_in_audience() {
42+
let cacao_serialized = r#"{
43+
"h": {
44+
"t": "eip4361"
45+
},
46+
"p": {
47+
"iss": "did:pkh:eip155:1:0xdFe7d0E324ed017a74aE311E9236E6CaDB24176b",
48+
"domain": "com.walletconnect.sample.web3inbox",
49+
"aud": "did:key:z6MkvjNoiz9AXGH1igzrtB54US5hE9bZPQm1ryKGkCLwWht7",
50+
"version": "1",
51+
"nonce": "6c9435d868ce15e0a1b0987a61a975e8c0edda17054840548dabf0a3c55cf5e4",
52+
"iat": "2023-09-07T11:04:23+02:00",
53+
"statement": "I further authorize this DAPP to send and receive messages on my behalf for this domain and manage my identity at identity.walletconnect.com.",
54+
"resources": [
55+
"identity.walletconnect.com"
56+
]
57+
},
58+
"s": {
59+
"t": "eip191",
60+
"s": "0x18b8dd2595930bd4bcd8066ad9fca5c54aaab20d2ec1cf46ff90baa5a91acad80f064a2f533d9dfc75928958a1da8e4f6755e14cab325a40a3a51e4bd6f2a1c91b"
61+
}
62+
}"#;
2663
let cacao: Cacao = serde_json::from_str(cacao_serialized).unwrap();
27-
println!("{}", cacao.siwe_message().unwrap());
2864
let result = cacao.verify();
2965
assert!(result.is_ok());
3066
assert!(result.map_err(|_| false).unwrap());
3167

3268
let identity_key = cacao.p.identity_key();
3369
assert!(identity_key.is_ok());
70+
assert_eq!(
71+
identity_key.unwrap(),
72+
"z6MkvjNoiz9AXGH1igzrtB54US5hE9bZPQm1ryKGkCLwWht7"
73+
)
3474
}
3575

36-
/// Test that we can verify a Cacao with a statement
76+
/// Test that we can verify a Cacao
3777
#[test]
38-
fn verify_success_statement() {
78+
fn cacao_verify_failure() {
3979
let cacao_serialized = r#"{
4080
"h": {
4181
"t": "eip4361"
4282
},
4383
"p": {
44-
"iss": "did:pkh:eip155:1:0x262f4f5DC82ad9b803680F07Da7d901D4F71d8D1",
45-
"domain": "http://10.0.2.2:8080",
46-
"aud": "http://10.0.2.2:8080",
47-
"statement": "Test statement",
84+
"iss": "did:pkh:eip155:1:0xF5dA9A1Aa622903ae73f5eFE46485531913202AF",
85+
"domain": "keys.walletconnect.com",
86+
"aud": "https://keys.walletconnect.com",
4887
"version": "1",
49-
"nonce": "[B@c3772c7",
50-
"iat": "2023-01-17T12:15:05+01:00",
88+
"nonce": "0d98d4e5d8c19d4cff09cd25f1863bca650d2b4009bd62f04dff7171438c4773",
89+
"iat": "2023-05-17T14:14:24+02:00",
5190
"resources": [
52-
"did:key:z6MkkG9nM8ksS37sq5mgeoCn5kihLkWANcm9pza5WTkq3tWZ"
91+
"did:key:z6MkgzojB48jpTcLTatSCRHNpoMRvQbz8r13UJ1KyteHjEu9"
5392
]
5493
},
5594
"s": {
5695
"t": "eip191",
57-
"s": "0xafedb7505846dc691a4f3f70266624a91a232d68ec61454f4426e016bcb0483773296097687429c47af82b5bf16324ec4ede13e67aee5b4597c9d34b3af0e3681c"
96+
"s": "0x726caf0b066fd857889fa73a8b04cbe249161c37a9342854ec92258a85a91ca5720d6d61afe45c7a54f42373ab1c90d888257637a938af5d9f242adad43b204d1b"
5897
}
59-
} "#;
60-
let cacao: Cacao = serde_json::from_str(cacao_serialized).unwrap();
61-
println!("{}", cacao.siwe_message().unwrap());
62-
let result = cacao.verify();
63-
assert!(result.is_ok());
64-
assert!(result.map_err(|_| false).unwrap());
65-
66-
let identity_key = cacao.p.identity_key();
67-
assert!(identity_key.is_ok());
68-
}
69-
70-
/// Test that we can verify a Cacao with uppercase address
71-
#[test]
72-
fn without_lowercase_address_verify_success() {
73-
let cacao_serialized = r#"{"h":{"t":"eip4361"},"p":{"iss":"did:pkh:eip155:1:0xbD4D1935165012e7D29919dB8717A5e670a1a5b1","domain":"https://staging.keys.walletconnect.com","aud":"https://staging.keys.walletconnect.com","version":"1","nonce":"07487c09be5535dcbc341d8e35e5c9b4d3539a802089c42c5b1172dd9ed63c64","iat":"2023-01-25T15:08:36.846Z","statement":"Test","resources":["did:key:451cf9b97c64fcca05fbb0d4c40b886c94133653df5a2b6bd97bd29a0bbcdb37"]},"s":{"t":"eip191","s":"0x8496ad1dd1ddd5cb78ac26b62a6bd1c6cfff703ea3b11a9da29cfca112357ace75cac8ee28d114f9e166a6935ee9ed83151819a9e0ee738a0547116b1d978e351b"}}"#;
98+
}"#;
7499
let cacao: Cacao = serde_json::from_str(cacao_serialized).unwrap();
75100
let result = cacao.verify();
76-
assert!(result.is_ok());
77-
assert!(result.map_err(|_| false).unwrap());
78-
79-
let identity_key = cacao.p.identity_key();
80-
assert!(identity_key.is_ok());
101+
assert!(result.is_err());
81102
}

0 commit comments

Comments
 (0)