2025-11-29 17:34:24 +01:00
|
|
|
let () = Mirage_crypto_rng_unix.use_default ()
|
|
|
|
|
|
|
|
|
|
let () =
|
|
|
|
|
let priv = Mirage_crypto_pk.Rsa.generate ~bits:2048 () in
|
|
|
|
|
let pub = Mirage_crypto_pk.Rsa.pub_of_priv priv in
|
|
|
|
|
let () =
|
|
|
|
|
let open Crypto.RsaPrivateKey in
|
2026-02-07 20:29:35 +01:00
|
|
|
let priv' = priv |> to_octets |> of_octets |> Result.get_ok in
|
2025-11-29 17:34:24 +01:00
|
|
|
assert (to_octets priv = to_octets priv')
|
|
|
|
|
in
|
|
|
|
|
let () =
|
|
|
|
|
let open Crypto.RsaPublicKey in
|
2026-02-07 20:29:35 +01:00
|
|
|
let pub' = pub |> to_octets |> of_octets |> Result.get_ok in
|
2025-11-29 17:34:24 +01:00
|
|
|
assert (to_octets pub = to_octets pub')
|
|
|
|
|
in
|
|
|
|
|
()
|
|
|
|
|
|
2025-10-03 18:14:17 +02:00
|
|
|
let () =
|
2025-11-21 19:16:31 +01:00
|
|
|
let open Api in
|
2025-10-03 18:14:17 +02:00
|
|
|
let check jsont s =
|
2026-02-07 20:29:35 +01:00
|
|
|
let encode v = encode jsont v |> Result.get_ok in
|
|
|
|
|
let decode v = decode jsont v |> Result.get_ok in
|
2025-10-03 18:14:17 +02:00
|
|
|
let ts = decode s in
|
|
|
|
|
let s' = encode ts in
|
|
|
|
|
let ts' = decode s' in
|
|
|
|
|
let s'' = encode ts' in
|
|
|
|
|
assert (String.equal s' s'')
|
|
|
|
|
in
|
|
|
|
|
let check_bad jsont s =
|
|
|
|
|
let decode = decode jsont in
|
|
|
|
|
assert (Result.is_error (decode s))
|
|
|
|
|
in
|
|
|
|
|
check Timestamp.jsont {|{"t_s": 123456780}|};
|
|
|
|
|
check Timestamp.jsont {|{"t_s": "never"}|};
|
|
|
|
|
check_bad Timestamp.jsont {|{"t_s": "123456780"}|};
|
|
|
|
|
check_bad Timestamp.jsont {|{"t_s": "agagou"}|};
|
2025-10-06 19:51:56 +02:00
|
|
|
|
2025-11-30 22:44:36 +01:00
|
|
|
(* CS not implemented *)
|
|
|
|
|
check_bad DenominationKey.jsont
|
2025-10-06 19:51:56 +02:00
|
|
|
{|{"cipher": "CS", "age_mask": 18, "cs_pub": "ouhagag"}|};
|
2025-11-30 22:44:36 +01:00
|
|
|
|
|
|
|
|
(* TODO test with a valid rsa_pub value *)
|
|
|
|
|
(* TODO handle "rsa pub_of_octets failure" correctly *)
|
|
|
|
|
(* check_bad DenominationKey.jsont
|
|
|
|
|
{|{"cipher": "RSA", "age_mask": 18, "rsa_pub": "agagouh"}|}; *)
|
2025-10-03 18:14:17 +02:00
|
|
|
()
|
2025-10-03 19:54:18 +02:00
|
|
|
|
|
|
|
|
let () =
|
2025-11-21 19:09:46 +01:00
|
|
|
let open Amount in
|
2025-10-03 19:54:18 +02:00
|
|
|
let v =
|
2026-02-21 23:40:58 +01:00
|
|
|
make ~sign:(Some Sign_plus) ~currency:"KUDO" ~value:(Int64.of_int 25)
|
2025-11-21 19:09:46 +01:00
|
|
|
~fraction:(Int32.of_int 678)
|
2025-11-20 22:14:45 +01:00
|
|
|
|> Result.get_ok
|
2025-10-03 19:54:18 +02:00
|
|
|
in
|
|
|
|
|
let s = to_string v in
|
|
|
|
|
let v' = of_string s |> Result.get_ok in
|
|
|
|
|
assert (v = v');
|
2026-02-21 23:40:58 +01:00
|
|
|
let r = of_string {|~KUDO:4.9|} in
|
2025-10-03 22:42:16 +02:00
|
|
|
assert (Result.is_error r);
|
2026-02-21 23:40:58 +01:00
|
|
|
let r = of_string {|+KUDO:4.99999999999999999999999|} in
|
2025-10-03 22:42:16 +02:00
|
|
|
assert (Result.is_error r);
|
2025-10-03 19:54:18 +02:00
|
|
|
()
|
2025-10-06 18:38:04 +02:00
|
|
|
|
|
|
|
|
let () =
|
2026-02-12 11:25:57 +01:00
|
|
|
let open Headers_lib.If_none_match in
|
|
|
|
|
let ok_l =
|
|
|
|
|
[
|
|
|
|
|
"*";
|
|
|
|
|
"\"foo\"";
|
|
|
|
|
"W/\"foo\"";
|
|
|
|
|
"\"foo\", \"bar\"";
|
|
|
|
|
" , W/\"x\" , W/\"y\" , \"z\"";
|
|
|
|
|
", \"one\" , \"two\" , \"three\"";
|
|
|
|
|
"W/\"a\" , ";
|
|
|
|
|
"W/\"a\" , \"b\"";
|
|
|
|
|
]
|
|
|
|
|
in
|
|
|
|
|
let bad_l =
|
|
|
|
|
[
|
|
|
|
|
"";
|
|
|
|
|
"foo";
|
|
|
|
|
"W/foo";
|
|
|
|
|
"W/\"unterminated";
|
|
|
|
|
"\"foo\", W/";
|
|
|
|
|
"* , \"bar\"";
|
|
|
|
|
"\"a\" \"b\"";
|
|
|
|
|
"W/\"a\" W/\"b\"";
|
|
|
|
|
"\"fo\x7Fo\"";
|
|
|
|
|
" W/\"a\"";
|
|
|
|
|
"W/\"a\" ";
|
|
|
|
|
]
|
|
|
|
|
in
|
|
|
|
|
let check_ok input = assert (Result.is_ok (parse input)) in
|
2025-10-06 18:38:04 +02:00
|
|
|
let check_bad input = assert (Result.is_error (parse input)) in
|
2026-02-12 11:25:57 +01:00
|
|
|
List.iter check_ok ok_l;
|
|
|
|
|
List.iter check_bad bad_l;
|
2025-10-06 18:38:04 +02:00
|
|
|
|
|
|
|
|
()
|
2025-10-07 12:02:16 +02:00
|
|
|
|
|
|
|
|
let () =
|
2026-02-16 17:55:21 +01:00
|
|
|
let round_trip s =
|
|
|
|
|
let s' = s |> B32.encode |> B32.decode |> Result.get_ok in
|
|
|
|
|
assert (s = s')
|
|
|
|
|
in
|
|
|
|
|
let s = String.init 0xff Char.chr in
|
|
|
|
|
round_trip s;
|
|
|
|
|
let s_l = List.init 0x0f (fun i -> String.init i Char.chr) in
|
|
|
|
|
List.iter round_trip s_l;
|
2025-10-07 16:26:05 +02:00
|
|
|
|
2025-10-07 12:02:16 +02:00
|
|
|
()
|
2026-02-27 02:19:32 +01:00
|
|
|
|
|
|
|
|
let () =
|
|
|
|
|
let rsa_pub = "040000Y4J0J917YF81MQP5668F5FXCT29FDSYC5DRXG7KEZ7HKX5P4V0EZDRWC3NMX60WC13TPJN0BABH9XXMGHN8EGZD25Z47485QD7WN0BWWQ7XNB3391RGGADFFJEQDF137CP7AAEF2FSCK2ZYM89D7K8MA8D3TB3DCCGA55TZ6K63PAJ56ZPHRWDD9QKGRJ2YMDHXA8D2VBH4B9WBVSNH7JSHM1NBZDH2751YNXE25SJBDEH4AQCB61D99VE4EMSX9W6Y49BA1FCZ46CA3QGC4642SP4S5SRGCS02CBT3Z3WSX4B6RYNDPHQ21PCTG85M12ZFBEBXD382JK0ACM6KQJ56S8318E8YPD1F7DXE52S53ACC1T03DBXBBD4A2T32XMSZ9SHXPJBBGNNR9DD3NQGT3SH04002" in
|
|
|
|
|
let h_pub = "
|
|
|
|
|
|
|
|
|
|
Fmt.epr "h_pub: %s@."
|
|
|
|
|
(B32.encode @@ Hash.DenominationHash.to_octets h_pub);
|