diff --git a/future_keys.json b/future_keys.json new file mode 100644 index 00000000..4beaee47 --- /dev/null +++ b/future_keys.json @@ -0,0 +1 @@ +{"future_denoms":[{"section_name":"kudo_1","value":"EUR:0.01","stamp_start":{"t_s":1764354917.5913634},"stamp_expire_withdraw":{"t_s":1795890917.5913634},"stamp_expire_deposit":{"t_s":1795890917.5913634},"stamp_expire_legal":{"t_s":1795890917.5913634},"denom_pub":{"cipher":"RSA","age_mask":0,"rsa_pub":"0400026BC7HB7T66EDP1HNZWXJJAB06HQRZY754YF3HM4EBSHS9QXR0MAV9EAEWS5B1CBDK2H4CEPN25WN5NVZJNYXE1T6BEMSTZPB94T4KBQ8NCW3RPNVQQFGCB2ZAMM7A86DGF2G2PEGBG33AJEK6PZKE32ZFMP85N5Q5XAD4Q5YA76JSXC6CGMS7788V46N0K62R9ZWMFFP3G0Z5WF2FEFEYNTT9YYCVJEXH8PASR2Q298RXD6XKKY5ECM5AFHMG0EX6W7VHQYXN0B3GEEYN12FDSFND6TQKFKHA8SYR1FDRTJAD1YETJ3A3NF5CKNNDF6W47CWFCXANBX46JWPABVD9CQCHHGQ4V76A04C15GE8Z8F149DRHED2ANSNBK9ESDH3HANBJYY4R6KBE07GQXXNRWT6V0000000004002==="},"fee_withdraw":"EUR:0.00","fee_deposit":"EUR:0.00","fee_refresh":"EUR:0.00","fee_refund":"EUR:0.00","denom_secmod_sig":"SHC57K2Y60JK01KEJ54HZ1JXABKQEJVGD65M3YGM1B1M8H9860YZ0ZZT9BSX1S2DH0W91BY459YMYAW5BXVN0GY981QKK7MSWX1AA2G="},{"section_name":"kudo_2","value":"EUR:0.02","stamp_start":{"t_s":1764354917.6133766},"stamp_expire_withdraw":{"t_s":1795890917.6133766},"stamp_expire_deposit":{"t_s":1795890917.6133766},"stamp_expire_legal":{"t_s":1795890917.6133766},"denom_pub":{"cipher":"RSA","age_mask":0,"rsa_pub":"0400025RMH02FW6EF0T1SHQY4HPYBP8VGKS6Q24M8PP89J8KT6KGS44K9CR5P0TNZPGAZJ2W1Y2FGAK5V2E9DT5JTGEJHMDX4ZWXMVNQDXJ129A1C0ZCH2CA1MDYTAQARN5QH31ZN797G2QPPT2Y0F4SNDZ00ZKYHDP4JWEWC064M795N1T06B0WJYDQV7GAJ76TY7H2EHK5KP4F3K7EYKMDF9B90B4S3ZKHK16PQGZSCE4T3N80SH8HMRMDQAS5CBM9HHX5ECXXQR1DCXVDH6B838FWH5TP67X0SARPCGNXHHK06PF3Z03WWVWDPK9D82CGYQ591RRXAVYY6XXHAR4X5JNHKYVHQSKYNBHW13F8DMTZFKTKHA6ZWJT7VCWNASCJ6S9VPE98C07ZP89DSABWYBY5E9S50000000004002==="},"fee_withdraw":"EUR:0.00","fee_deposit":"EUR:0.00","fee_refresh":"EUR:0.00","fee_refund":"EUR:0.00","denom_secmod_sig":"67BFH8B6RVSWV3RNKW1S6Q70RZR1SG1AEBSQ6CPKA7A85XY9A3FKKB02P2C10M45G0WMPPRYBYVG9F6KASG5YSR1QHW5NDEAB7GSC0G="}],"future_signkeys":[{"key":"KCG1XC4HWVR98NRX918JK8V0GXS759954M5G1GZ1XJT68WREZWHG====","stamp_start":{"t_s":1764354917.591289},"stamp_expire":{"t_s":1795890917.591289},"stamp_end":{"t_s":1795890917.591289},"signkey_secmod_sig":"E4K25ER4G4Y90KGH9T05F9XQPTA1ECHK1YZVA6FS6VG9H68XYAKRFWCMGKG3AB4CQS9HX0D43R8WWXTEX5D9F0QEBQ3E72ANT26KW00="}],"master_pub":"SJ0NYND22VQP3MP7FM754RDX8HCKVWAXTHY9SQNBTPRJZ2SPM2S0====","denom_secmod_public_key":"1V9HCTYFN18MM143K6TNPQBH5QKV2YXMA7W81R1W1NDKP21N5XPG====","signkey_secmod_public_key":"238VV3ZGC9DHP3VG98V19HNTD437F2BWRJWFZFAW6Q92N8ZNFCXG===="} \ No newline at end of file diff --git a/master_signatures.json b/master_signatures.json new file mode 100644 index 00000000..e7fe5127 --- /dev/null +++ b/master_signatures.json @@ -0,0 +1 @@ +{"denom_sigs":[{"h_denom_pub":"H73GDS5MNZW1DQ62T524225X6K25Q0EXPYC6CP4S2AEQX1J2C4RND2KYZQX7EXTBG0BDW6T1HANKXBVH5SB1D8QCTE8YRVC040CR1CG=","master_sig":"J50WKZ51X21H24H2JSK8MGFJ1MF36R9M471PJ3NDQZYF7B8E2ZP9J960Q66Q5HNZ23SRF6DN5V0M0DWRPDY6X2WC96XGB0DBYFFKR38="},{"h_denom_pub":"QHFW8B4RF5JXG0JVF9E5F3D3JW9869QB55ZZ1G2NPEGMBGNH59QBPPT15SB1S3KXBN3VRJ2BKM6J8RXG2YAZJGPQS5T2MKVSADPWRX0=","master_sig":"7JHYST7T2499DM113TWE41W36TY7WG07BPB6QW7V13YKS1877RPV9HYTQ5Q8RMAG95BTR578GCJQQ96RY9JBDKW161GX8F59P7T8C3G="}],"signkey_sigs":[{"key":"KCG1XC4HWVR98NRX918JK8V0GXS759954M5G1GZ1XJT68WREZWHG====","master_sig":"9GVHW3QH80Q1XFSDQ1SJDPQPPXN16T1TR8JGGH98KCN30P76J3EXJ15SS93E910QEPTB4W96FGVK40PX7CZWDZT4M8QZFSH3N0V8210="}]} \ No newline at end of file diff --git a/src/amount.ml b/src/amount.ml index d208cfde..2b65bd2e 100644 --- a/src/amount.ml +++ b/src/amount.ml @@ -92,6 +92,13 @@ let of_string = let jsont = Jsont.of_of_string ~kind:"Amount" of_string ~enc:to_string let currency_len = 12 +let pad_currency s = + let len = String.length s in + assert (len <= 11); + let b = Bytes.make 12 '\x00' in + Bytes.blit_string s 0 b 0 len; + Bytes.to_string b + let bin = let open Bin in record (fun _value _fraction _currency -> @@ -99,7 +106,7 @@ let bin = assert false) |+ field neint64 (fun t -> t.value) |+ field neint32 (fun t -> t.fraction) - |+ field (bytes currency_len) (fun t -> t.currency) + |+ field (bytes currency_len) (fun t -> pad_currency t.currency) |> sealr let bin_nbo = @@ -107,5 +114,5 @@ let bin_nbo = record (fun _value _fraction _currency -> assert false) |+ field beint64 (fun t -> t.value) |+ field beint32 (fun t -> t.fraction) - |+ field (bytes currency_len) (fun t -> t.currency) + |+ field (bytes currency_len) (fun t -> pad_currency t.currency) |> sealr diff --git a/src/api.ml b/src/api.ml index 60954791..f6dd4427 100644 --- a/src/api.ml +++ b/src/api.ml @@ -38,7 +38,7 @@ end = struct type t = B32.t let hash s = - let open Digestif.SHA256 in + let open Digestif.SHA512 in s |> digest_string |> to_raw_string let jsont = Jsont.of_of_string ~kind:"HashCode" B32.decode ~enc:B32.encode diff --git a/src/bin_type.ml b/src/bin_type.ml index 652a0eab..38d047b5 100644 --- a/src/bin_type.ml +++ b/src/bin_type.ml @@ -120,7 +120,11 @@ module Hash_64 = struct | false -> Fmt.failwith "Hash.of_octets failure: data is not 64 bytes" | true -> Digestif.SHA512.of_raw_string s - let to_octets = Digestif.SHA512.to_raw_string + let to_octets v = + let s = Digestif.SHA512.to_raw_string v in + match String.length s = 64 with + | false -> Fmt.failwith "Hash.to_octets failure: data is not 64 bytes" + | true -> s let bin = let open Bin in diff --git a/src/crypto.ml b/src/crypto.ml index 1e2f7e2c..639a0210 100644 --- a/src/crypto.ml +++ b/src/crypto.ml @@ -113,17 +113,19 @@ module RsaPublicKey = struct String.sub src pos len |> rev_string len |> Z.of_bits let to_octets ({ n; e } : Mirage_crypto_pk.Rsa.pub) = - let n_len = Z.size n in - let e_len = Z.size e in + let n = Z.to_bits n in + let e = Z.to_bits e in + let n_len = String.length n in + let e_len = String.length e in let len = 4 + n_len + e_len in let b = Bytes.make len '\x00' in Bytes.set_uint16_be b 0 n_len; Bytes.set_uint16_be b 2 e_len; - let n = Z.to_bits n |> rev_string n_len in - let e = Z.to_bits e |> rev_string e_len in + let n = rev_string n_len n in + let e = rev_string e_len e in Bytes.blit_string n 0 b 4 n_len; Bytes.blit_string e 0 b (4 + n_len) e_len; - Bytes.unsafe_to_string b + Bytes.to_string b let of_octets = let check = function @@ -131,8 +133,6 @@ module RsaPublicKey = struct | true -> Ok () in fun s -> - Result.get_ok - @@ let open Syntax in let len = String.length s in let* () = check (len >= 4) in @@ -142,6 +142,11 @@ module RsaPublicKey = struct let n = z_of_bits_be s 4 n_len in let e = z_of_bits_be s (4 + n_len) e_len in Mirage_crypto_pk.Rsa.pub ~n ~e |> unwrap_err_msg + + let of_octets s = + match of_octets s with + | Error e -> Fmt.failwith "RsaPublicKey.of_octets failure: %s@." e + | Ok v -> v end include Binary diff --git a/tools/offline_signature.ml b/tools/offline_signature.ml index c01708b6..3e9f4b25 100644 --- a/tools/offline_signature.ml +++ b/tools/offline_signature.ml @@ -25,11 +25,11 @@ let denom_signature ~master_key Crypto.RsaPublicKey.to_octets pub in let h_denom_pub = Api.HashCode.hash pub_octets in + let master = Crypto.EddsaPrivateKey.(pub_of_priv master_key) in + let denom_hash = Bin_type.DenominationHash.hash pub_octets in let master_sig = - let open Bin_type in + (*let open Bin_type in*) let open Bin_signature.DenominationKeyValidityPS in - let master = Crypto.EddsaPrivateKey.(pub_of_priv master_key) in - let denom_hash = DenominationHash.hash pub_octets in { master; start= stamp_start;