1pub mod execute;
2pub mod instantiate;
3
4use cosmwasm_std::{DepsMut, Env, MessageInfo, Response};
5
6use crate::{error::Error, msg::HasDomainType};
7
8pub trait Handler {
9 fn handle(self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo) -> Result<Response, Error>;
10}
11
12pub trait RawHandler: HasDomainType {
13 fn handle_raw(
14 self,
15 deps: DepsMut<'_>,
16 env: &Env,
17 info: &MessageInfo,
18 ) -> Result<Response, Error>;
19}
20
21impl<RM> RawHandler for RM
22where
23 RM: HasDomainType,
24 RM::DomainType: Handler,
25{
26 fn handle_raw(
27 self,
28 deps: DepsMut<'_>,
29 env: &Env,
30 info: &MessageInfo,
31 ) -> Result<Response, Error> {
32 let execute: RM::DomainType = self.try_into()?;
33 execute.handle(deps, env, info)
34 }
35}
36
37#[cfg(test)]
38mod tests {
39 use cosmwasm_std::{
40 testing::{message_info, mock_dependencies, mock_env},
41 DepsMut,
42 };
43 use serde::Deserialize;
44
45 use crate::{
46 handler::Handler,
47 msg::{HasDomainType, RawExecuteMsg, RawInstantiateMsg},
48 state::SESSION,
49 };
50
51 fn parse_msg<'a, R>(msg_str: &'a str) -> R::DomainType
52 where
53 R: HasDomainType + Deserialize<'a>,
54 {
55 let raw_msg: R =
56 serde_json::from_str(msg_str).expect("deserialization failure for hard-coded RawMsg");
57 raw_msg.try_into().expect("invalid hard-coded RawMsg")
58 }
59
60 fn handle_msg<'a, R>(mut deps: DepsMut<'_>, msg_str: &'a str)
61 where
62 R: HasDomainType + Deserialize<'a>,
63 R::DomainType: Handler,
64 {
65 let msg = parse_msg::<R>(msg_str);
66 let creator = deps
67 .api
68 .addr_validate("creator")
69 .expect("Hardcoded creator");
70 let info = message_info(&creator, &[]);
71 let env = mock_env();
72 let res = msg
73 .handle(deps.branch(), &env, &info)
74 .expect("msg handler failure");
75
76 assert_eq!(0, res.messages.len());
77 }
78
79 fn instantiate(deps: DepsMut<'_>) {
80 handle_msg::<RawInstantiateMsg>(
81 deps,
82 r#"{
83 "msg": {
84 "mr_enclave": "e3c2f2a5b840d89e069acaffcadb6510ef866a73d3a9ee57100ed5f8646ee4bb"
85 },
86 "attestation": {
87 "report": {
88 "report": {
89 "id": "5246688123689513540899231107533660789",
90 "timestamp": "2024-02-07T17:06:23.913745",
91 "version": 4,
92 "epidPseudonym": "+CUyIi74LPqS6M0NF7YrSxLqPdX3MKs6D6LIPqRG/ZEB4WmxZVvxAJwdwg/0m9cYnUUQguLnJotthX645lAogfJgO8Xg5/91lSegwyUKvHmKgtjOHX/YTbVe/wmgWiBdaL+KmarY0Je459Px/FqGLWLsAF7egPAJRd1Xn88Znrs=",
93 "advisoryURL": "https://security-center.intel.com",
94 "advisoryIDs": [
95 "INTEL-SA-00161",
96 "INTEL-SA-00219",
97 "INTEL-SA-00289",
98 "INTEL-SA-00334",
99 "INTEL-SA-00615"
100 ],
101 "isvEnclaveQuoteStatus": "CONFIGURATION_AND_SW_HARDENING_NEEDED",
102 "platformInfoBlob": "150200650000080000141402040180070000000000000000000D00000C000000020000000000000CB0F08115F3DE71AE97980FE5E10B042054930ACE356C79EC44603D3F890756EC6ED73927A7C58CDE9AF1E754AEC77E335E8D80294407936BEB6404F27669FF7BB1",
103 "isvEnclaveQuoteBody": "AgABALAMAAAPAA8AAAAAAFHK9aSLRQ1iSu/jKG0xSJQAAAAAAAAAAAAAAAAAAAAAFBQCBwGAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAHAAAAAAAAAOPC8qW4QNieBprK/8rbZRDvhmpz06nuVxAO1fhkbuS7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc8uUpEUEPvz8ZkFapjVh5WlWaLoAJM/f80T0EhGInHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRE7C+d+1dDWhoDsdyBrjVh+1AZ5txMhzN1UBeTVSmggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
104 },
105 "reportsig": "YcY4SPvkfR4P2E8A5huutCeS+vY/ir+xq6disalNfNtAcUyOIOqTPVXhAZgY1M5B47Hjj1oYWf2qC2w+dnj7VcZjzO9oR0pJYdA+A7jaVrNzH2eXA79yICkuU8WE/x58I0j5vjXLoHXahaKlpZkMeTphqBY8u+FTVSdP3cWPho4viPapTfQRuEWmYq4KIq2zSr6wLg3Pz+yQ+G3e9BASVkLYxdYGTDFH1pMmfas9SEI7V4I+j8DaXmL8bucSRakmcQdmDMPGiA7mvIhSAlprzCrdxM7CHeUC6MPLN1fmFFcc9kyO/ved69j/651MWC83GgxSJ15L80U+DQzmrSW8xg=="
106 },
107 "mr_enclave": "e3c2f2a5b840d89e069acaffcadb6510ef866a73d3a9ee57100ed5f8646ee4bb",
108 "user_data": "9113b0be77ed5d0d68680ec77206b8d587ed40679b71321ccdd5405e4d54a6820000000000000000000000000000000000000000000000000000000000000000"
109 }
110 }"#,
111 );
112 }
113
114 fn session_create(deps: DepsMut<'_>) {
115 handle_msg::<RawExecuteMsg>(
116 deps,
117 r#"{
118 "session_create": {
119 "msg": {
120 "nonce": "425d87f8620e1dedeee70590cc55b164b8f01480ee59e0b1da35436a2f7c2777"
121 },
122 "attestation": {
123 "report": {
124 "report": {
125 "id": "5246688123689513540899231107533660789",
126 "timestamp": "2024-02-07T17:06:23.913745",
127 "version": 4,
128 "epidPseudonym": "+CUyIi74LPqS6M0NF7YrSxLqPdX3MKs6D6LIPqRG/ZEB4WmxZVvxAJwdwg/0m9cYnUUQguLnJotthX645lAogfJgO8Xg5/91lSegwyUKvHmKgtjOHX/YTbVe/wmgWiBdaL+KmarY0Je459Px/FqGLWLsAF7egPAJRd1Xn88Znrs=",
129 "advisoryURL": "https://security-center.intel.com",
130 "advisoryIDs": [
131 "INTEL-SA-00161",
132 "INTEL-SA-00219",
133 "INTEL-SA-00289",
134 "INTEL-SA-00334",
135 "INTEL-SA-00615"
136 ],
137 "isvEnclaveQuoteStatus": "CONFIGURATION_AND_SW_HARDENING_NEEDED",
138 "platformInfoBlob": "150200650000080000141402040180070000000000000000000D00000C000000020000000000000CB0F08115F3DE71AE97980FE5E10B042054930ACE356C79EC44603D3F890756EC6ED73927A7C58CDE9AF1E754AEC77E335E8D80294407936BEB6404F27669FF7BB1",
139 "isvEnclaveQuoteBody": "AgABALAMAAAPAA8AAAAAAFHK9aSLRQ1iSu/jKG0xSJQAAAAAAAAAAAAAAAAAAAAAFBQCBwGAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAHAAAAAAAAAOPC8qW4QNieBprK/8rbZRDvhmpz06nuVxAO1fhkbuS7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc8uUpEUEPvz8ZkFapjVh5WlWaLoAJM/f80T0EhGInHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRE7C+d+1dDWhoDsdyBrjVh+1AZ5txMhzN1UBeTVSmggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
140 },
141 "reportsig": "YcY4SPvkfR4P2E8A5huutCeS+vY/ir+xq6disalNfNtAcUyOIOqTPVXhAZgY1M5B47Hjj1oYWf2qC2w+dnj7VcZjzO9oR0pJYdA+A7jaVrNzH2eXA79yICkuU8WE/x58I0j5vjXLoHXahaKlpZkMeTphqBY8u+FTVSdP3cWPho4viPapTfQRuEWmYq4KIq2zSr6wLg3Pz+yQ+G3e9BASVkLYxdYGTDFH1pMmfas9SEI7V4I+j8DaXmL8bucSRakmcQdmDMPGiA7mvIhSAlprzCrdxM7CHeUC6MPLN1fmFFcc9kyO/ved69j/651MWC83GgxSJ15L80U+DQzmrSW8xg=="
142 },
143 "mr_enclave": "e3c2f2a5b840d89e069acaffcadb6510ef866a73d3a9ee57100ed5f8646ee4bb",
144 "user_data": "425d87f8620e1dedeee70590cc55b164b8f01480ee59e0b1da35436a2f7c27770000000000000000000000000000000000000000000000000000000000000000"
145 }
146 }
147 }"#,
148 );
149 }
150
151 fn session_set_pub_key(deps: DepsMut<'_>) {
152 handle_msg::<RawExecuteMsg>(
153 deps,
154 r#"{
155 "session_set_pub_key": {
156 "msg": {
157 "nonce": "425d87f8620e1dedeee70590cc55b164b8f01480ee59e0b1da35436a2f7c2777"
158 "pub_key": "03E67EF09213633074FB4FBF338643F4F0C574ED60EF11D03422EEB06FA38C8F3F"
159 },
160 "attestation": {
161 "report": {
162 "report": {
163 "id": "5246688123689513540899231107533660789",
164 "timestamp": "2024-02-07T17:06:23.913745",
165 "version": 4,
166 "epidPseudonym": "+CUyIi74LPqS6M0NF7YrSxLqPdX3MKs6D6LIPqRG/ZEB4WmxZVvxAJwdwg/0m9cYnUUQguLnJotthX645lAogfJgO8Xg5/91lSegwyUKvHmKgtjOHX/YTbVe/wmgWiBdaL+KmarY0Je459Px/FqGLWLsAF7egPAJRd1Xn88Znrs=",
167 "advisoryURL": "https://security-center.intel.com",
168 "advisoryIDs": [
169 "INTEL-SA-00161",
170 "INTEL-SA-00219",
171 "INTEL-SA-00289",
172 "INTEL-SA-00334",
173 "INTEL-SA-00615"
174 ],
175 "isvEnclaveQuoteStatus": "CONFIGURATION_AND_SW_HARDENING_NEEDED",
176 "platformInfoBlob": "150200650000080000141402040180070000000000000000000D00000C000000020000000000000CB0F08115F3DE71AE97980FE5E10B042054930ACE356C79EC44603D3F890756EC6ED73927A7C58CDE9AF1E754AEC77E335E8D80294407936BEB6404F27669FF7BB1",
177 "isvEnclaveQuoteBody": "AgABALAMAAAPAA8AAAAAAFHK9aSLRQ1iSu/jKG0xSJQAAAAAAAAAAAAAAAAAAAAAFBQCBwGAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAHAAAAAAAAAOPC8qW4QNieBprK/8rbZRDvhmpz06nuVxAO1fhkbuS7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc8uUpEUEPvz8ZkFapjVh5WlWaLoAJM/f80T0EhGInHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRE7C+d+1dDWhoDsdyBrjVh+1AZ5txMhzN1UBeTVSmggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
178 },
179 "reportsig": "YcY4SPvkfR4P2E8A5huutCeS+vY/ir+xq6disalNfNtAcUyOIOqTPVXhAZgY1M5B47Hjj1oYWf2qC2w+dnj7VcZjzO9oR0pJYdA+A7jaVrNzH2eXA79yICkuU8WE/x58I0j5vjXLoHXahaKlpZkMeTphqBY8u+FTVSdP3cWPho4viPapTfQRuEWmYq4KIq2zSr6wLg3Pz+yQ+G3e9BASVkLYxdYGTDFH1pMmfas9SEI7V4I+j8DaXmL8bucSRakmcQdmDMPGiA7mvIhSAlprzCrdxM7CHeUC6MPLN1fmFFcc9kyO/ved69j/651MWC83GgxSJ15L80U+DQzmrSW8xg=="
180 },
181 "mr_enclave": "e3c2f2a5b840d89e069acaffcadb6510ef866a73d3a9ee57100ed5f8646ee4bb",
182 "user_data": "425d87f8620e1dedeee70590cc55b164b8f01480ee59e0b1da35436a2f7c27770000000000000000000000000000000000000000000000000000000000000000"
183 }
184 }
185 }"#,
186 );
187 }
188
189 #[test]
190 #[ignore]
191 fn test_instantiate_handler() {
192 let mut deps = mock_dependencies();
193 instantiate(deps.as_mut());
194 }
195
196 #[test]
197 #[ignore]
198 fn test_session_create_handler() {
199 let mut deps = mock_dependencies();
200 instantiate(deps.as_mut());
201 session_create(deps.as_mut());
202 SESSION.load(&deps.storage).expect("Session not created");
203 }
204
205 #[test]
206 #[ignore]
207 fn test_session_set_pub_key_handler() {
208 let mut deps = mock_dependencies();
209 instantiate(deps.as_mut());
210 session_create(deps.as_mut());
211 session_set_pub_key(deps.as_mut());
212 SESSION.load(&deps.storage).expect("Session not created");
213 }
215}