Skip to content

Commit 790edc4

Browse files
committed
add callformat interop test
1 parent 8356158 commit 790edc4

File tree

2 files changed

+100
-0
lines changed

2 files changed

+100
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package callformat
2+
3+
import (
4+
"crypto/sha512"
5+
"encoding/hex"
6+
"testing"
7+
8+
"github.com/oasisprotocol/curve25519-voi/primitives/x25519"
9+
"github.com/oasisprotocol/deoxysii"
10+
"github.com/oasisprotocol/oasis-core/go/common/cbor"
11+
"github.com/stretchr/testify/require"
12+
13+
"github.com/oasisprotocol/oasis-sdk/client-sdk/go/types"
14+
)
15+
16+
func TestInterop(t *testing.T) {
17+
clientSK := (x25519.PrivateKey)(sha512.Sum512_256([]byte("callformat test client")))
18+
clientPK := clientSK.Public()
19+
runtimeSK := (x25519.PrivateKey)(sha512.Sum512_256([]byte("callformat test runtime")))
20+
runtimePK := runtimeSK.Public()
21+
22+
call := types.Call{
23+
Method: "mock",
24+
Body: nil,
25+
}
26+
var nonce [deoxysii.NonceSize]byte
27+
cfg := EncodeConfig{
28+
PublicKey: &types.SignedPublicKey{PublicKey: *runtimePK},
29+
Epoch: 1,
30+
}
31+
callEnc, metadata := encodeCallEncryptedX25519DeoxysII(&call, clientPK, &clientSK, nonce, &cfg)
32+
33+
// If these change, update runtime-sdk/src/callformat.rs too.
34+
require.Equal(t, "a264626f6479f6666d6574686f64646d6f636b", hex.EncodeToString(cbor.Marshal(call)))
35+
require.Equal(t, "a264626f6479a462706b5820eedc75d3c500fc1b2d321757c383e276ab705c5a02013b3f1966e9caf73cdb0264646174615823c4635f2f9496a033a578e3f1e007be5d6cfa9631fb2fe2c8c76d26b322b6afb2fa5cdf6565706f636801656e6f6e63654f00000000000000000000000000000066666f726d617401", hex.EncodeToString(cbor.Marshal(callEnc)))
36+
37+
resultCBOR, err := hex.DecodeString("a1626f6bf6")
38+
require.NoError(t, err)
39+
var result types.CallResult
40+
err = cbor.Unmarshal(resultCBOR, &result)
41+
require.NoError(t, err)
42+
resultEncCBOR, err := hex.DecodeString("a167756e6b6e6f776ea264646174615528d1c5eedc5e54e1ef140ba905e84e0bea8daf60af656e6f6e63654f000000000000000000000000000000")
43+
require.NoError(t, err)
44+
var resultEnc types.CallResult
45+
err = cbor.Unmarshal(resultEncCBOR, &resultEnc)
46+
require.NoError(t, err)
47+
48+
resultOurs, err := DecodeResult(&resultEnc, metadata)
49+
require.NoError(t, err)
50+
require.Equal(t, &result, resultOurs)
51+
}

runtime-sdk/src/callformat.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,3 +347,52 @@ pub fn decode_result<C: Context>(
347347
}
348348
}
349349
}
350+
351+
#[cfg(test)]
352+
mod test {
353+
use digest::Digest;
354+
use oasis_core_keymanager::crypto::{InputKeyPair, KeyPair};
355+
use oasis_core_runtime::common::crypto::x25519;
356+
use crate::{callformat, crypto, module, testing, types};
357+
358+
#[test]
359+
fn test_interop() {
360+
let _guard = crypto::signature::context::test_using_chain_context();
361+
crypto::signature::context::set_chain_context(Default::default(), "test");
362+
363+
let runtime_sk = x25519::PrivateKey::from(<[u8; x25519::PRIVATE_KEY_LENGTH]>::from(sha2::Sha512_256::digest("callformat test runtime")));
364+
let runtime_pk = runtime_sk.public_key();
365+
366+
let mut mock = testing::mock::Mock::default();
367+
let our_key_pair_id = callformat::get_key_pair_id(mock.epoch);
368+
let our_key_pair = KeyPair {
369+
input_keypair: InputKeyPair {
370+
pk: runtime_pk,
371+
sk: runtime_sk,
372+
},
373+
..Default::default()
374+
};
375+
let ephemeral_keys = std::collections::HashMap::from([
376+
(our_key_pair_id, our_key_pair),
377+
]);
378+
let key_manager = testing::keymanager::MockKeyManagerClient {
379+
ephemeral_keys: ephemeral_keys.into(),
380+
..Default::default()
381+
};
382+
let ctx = mock.create_ctx_with_key_manager(Box::new(key_manager));
383+
384+
let call = cbor::from_slice::<types::transaction::Call>(hex::decode("a264626f6479f6666d6574686f64646d6f636b").unwrap().as_slice()).unwrap();
385+
let call_enc = cbor::from_slice::<types::transaction::Call>(hex::decode("a264626f6479a462706b5820eedc75d3c500fc1b2d321757c383e276ab705c5a02013b3f1966e9caf73cdb0264646174615823c4635f2f9496a033a578e3f1e007be5d6cfa9631fb2fe2c8c76d26b322b6afb2fa5cdf6565706f636801656e6f6e63654f00000000000000000000000000000066666f726d617401").unwrap().as_slice()).unwrap();
386+
387+
let (call_ours, metadata) = callformat::decode_call(&ctx, call_enc, 0).unwrap().unwrap();
388+
assert_eq!(cbor::to_vec(call_ours), cbor::to_vec(call));
389+
390+
let result_m_g = || module::CallResult::Ok(cbor::Value::Simple(cbor::SimpleValue::NullValue));
391+
let result = types::transaction::CallResult::from(result_m_g());
392+
let result_enc = callformat::encode_result(&ctx, result_m_g(), metadata);
393+
394+
// If these change, update client-sdk/go/callformat/callformat_test.go too.
395+
assert_eq!(hex::encode(cbor::to_vec(result)), "a1626f6bf6");
396+
assert_eq!(hex::encode(cbor::to_vec(result_enc)), "a167756e6b6e6f776ea264646174615528d1c5eedc5e54e1ef140ba905e84e0bea8daf60af656e6f6e63654f000000000000000000000000000000");
397+
}
398+
}

0 commit comments

Comments
 (0)