2018-06-05 21:27:33 +04:00
|
|
|
open Alcotest
|
|
|
|
open Uecc
|
|
|
|
|
|
|
|
let nb_iterations = 10
|
|
|
|
|
|
|
|
let checki = check int
|
|
|
|
|
|
|
|
let test_sksize () =
|
|
|
|
checki __LOC__ 21 (sk_size secp160r1) ;
|
|
|
|
checki __LOC__ 24 (sk_size secp192r1) ;
|
|
|
|
checki __LOC__ 28 (sk_size secp224r1) ;
|
|
|
|
checki __LOC__ 32 (sk_size secp256r1) ;
|
|
|
|
checki __LOC__ 32 (sk_size secp256k1) ;
|
|
|
|
()
|
|
|
|
|
|
|
|
let test_pksize () =
|
|
|
|
checki __LOC__ 40 (pk_size secp160r1) ;
|
|
|
|
checki __LOC__ 48 (pk_size secp192r1) ;
|
|
|
|
checki __LOC__ 56 (pk_size secp224r1) ;
|
|
|
|
checki __LOC__ 64 (pk_size secp256r1) ;
|
|
|
|
checki __LOC__ 64 (pk_size secp256k1) ;
|
|
|
|
()
|
|
|
|
|
|
|
|
let test_export_curve curve =
|
|
|
|
match keypair curve with
|
|
|
|
| None -> assert false
|
|
|
|
| Some (sk, pk) ->
|
2018-08-31 12:19:22 +04:00
|
|
|
let sk_bytes = to_bytes ~compress:false sk in
|
|
|
|
let pk_bytes = to_bytes ~compress:false pk in
|
|
|
|
checki __LOC__ (sk_size curve) (Bigstring.length sk_bytes) ;
|
|
|
|
checki __LOC__ (pk_size curve + 1) (Bigstring.length pk_bytes) ;
|
|
|
|
match sk_of_bytes curve sk_bytes,
|
|
|
|
pk_of_bytes curve pk_bytes with
|
|
|
|
| Some (sk', pk'), Some pk'' ->
|
|
|
|
assert (equal sk sk') ;
|
|
|
|
assert (equal pk pk') ;
|
|
|
|
assert (equal pk pk'') ;
|
|
|
|
assert (equal pk' pk') ;
|
|
|
|
| _ -> assert false
|
2018-06-05 21:27:33 +04:00
|
|
|
|
|
|
|
let test_export_curve curve =
|
|
|
|
for _i = 0 to nb_iterations - 1 do
|
|
|
|
test_export_curve curve
|
|
|
|
done
|
|
|
|
|
|
|
|
let test_export () =
|
|
|
|
test_export_curve secp160r1 ;
|
|
|
|
test_export_curve secp192r1 ;
|
|
|
|
test_export_curve secp224r1 ;
|
|
|
|
test_export_curve secp256r1 ;
|
|
|
|
test_export_curve secp256k1 ;
|
|
|
|
()
|
|
|
|
|
|
|
|
let test_export_curve_compressed curve =
|
|
|
|
match keypair curve with
|
|
|
|
| None -> assert false
|
|
|
|
| Some (sk, pk) ->
|
2018-08-31 12:19:22 +04:00
|
|
|
let sk_bytes = to_bytes sk in
|
|
|
|
let pk_bytes = to_bytes pk in
|
|
|
|
checki __LOC__ (sk_size curve) (Bigstring.length sk_bytes) ;
|
|
|
|
checki __LOC__ (compressed_size curve) (Bigstring.length pk_bytes) ;
|
|
|
|
match sk_of_bytes curve sk_bytes,
|
|
|
|
pk_of_bytes curve pk_bytes with
|
|
|
|
| Some (sk', pk'), Some pk'' ->
|
|
|
|
assert (equal sk sk') ;
|
|
|
|
assert (equal pk pk') ;
|
|
|
|
assert (equal pk pk'') ;
|
|
|
|
assert (equal pk' pk') ;
|
|
|
|
| _ -> assert false
|
2018-06-05 21:27:33 +04:00
|
|
|
|
|
|
|
let test_export_curve_compressed curve =
|
|
|
|
for _i = 0 to nb_iterations - 1 do
|
|
|
|
test_export_curve_compressed curve
|
|
|
|
done
|
|
|
|
|
|
|
|
let test_export_compressed () =
|
|
|
|
test_export_curve_compressed secp160r1 ;
|
|
|
|
test_export_curve_compressed secp192r1 ;
|
|
|
|
test_export_curve_compressed secp224r1 ;
|
|
|
|
test_export_curve_compressed secp256r1 ;
|
|
|
|
test_export_curve_compressed secp256k1 ;
|
|
|
|
()
|
|
|
|
|
|
|
|
let test_keypair_curve curve =
|
|
|
|
match keypair curve with
|
|
|
|
| None -> assert false
|
|
|
|
| Some (sk, pk) ->
|
2018-08-31 12:19:22 +04:00
|
|
|
assert (equal sk sk) ;
|
|
|
|
assert (equal pk pk) ;
|
|
|
|
let pk' = neuterize sk in
|
|
|
|
assert (equal pk pk')
|
2018-06-05 21:27:33 +04:00
|
|
|
|
|
|
|
let test_keypair_curve curve =
|
|
|
|
for _i = 0 to nb_iterations - 1 do
|
|
|
|
test_keypair_curve curve
|
|
|
|
done
|
|
|
|
|
|
|
|
let test_keypair () =
|
|
|
|
test_keypair_curve secp160r1 ;
|
|
|
|
test_keypair_curve secp192r1 ;
|
|
|
|
test_keypair_curve secp224r1 ;
|
|
|
|
test_keypair_curve secp256r1 ;
|
|
|
|
test_keypair_curve secp256k1 ;
|
|
|
|
()
|
|
|
|
|
|
|
|
let test_dh_curve curve =
|
|
|
|
match keypair curve, keypair curve with
|
|
|
|
| Some (sk, pk), Some (sk', pk') ->
|
2018-08-31 12:19:22 +04:00
|
|
|
begin match dh sk pk', dh sk' pk with
|
|
|
|
| Some secret, Some secret' ->
|
|
|
|
assert (Bigstring.equal secret secret')
|
|
|
|
| _ -> assert false
|
|
|
|
end
|
2018-06-05 21:27:33 +04:00
|
|
|
| _ -> assert false
|
|
|
|
|
|
|
|
let test_dh_curve curve =
|
|
|
|
for _i = 0 to nb_iterations - 1 do
|
|
|
|
test_dh_curve curve
|
|
|
|
done
|
|
|
|
|
|
|
|
let test_dh () =
|
|
|
|
test_dh_curve secp160r1 ;
|
|
|
|
test_dh_curve secp192r1 ;
|
|
|
|
test_dh_curve secp224r1 ;
|
|
|
|
test_dh_curve secp256r1 ;
|
|
|
|
test_dh_curve secp256k1 ;
|
|
|
|
()
|
|
|
|
|
|
|
|
let msg =
|
|
|
|
Bigstring.of_string "Voulez-vous coucher avec moi, ce soir ?"
|
|
|
|
|
|
|
|
let test_sign_curve curve =
|
|
|
|
match keypair curve with
|
|
|
|
| None -> assert false
|
|
|
|
| Some (sk, pk) ->
|
2018-08-31 12:19:22 +04:00
|
|
|
let signature = Bigstring.create (pk_size curve) in
|
|
|
|
begin match write_sign sk signature ~msg with
|
|
|
|
| nb_written when nb_written = (pk_size curve) ->
|
|
|
|
assert (verify pk ~msg ~signature)
|
|
|
|
| _ -> assert false
|
|
|
|
end ;
|
|
|
|
match sign sk msg with
|
|
|
|
| None -> assert false
|
|
|
|
| Some signature ->
|
|
|
|
assert (verify pk ~msg ~signature)
|
2018-06-05 21:27:33 +04:00
|
|
|
|
|
|
|
let test_sign_curve curve =
|
|
|
|
for _i = 0 to nb_iterations - 1 do
|
|
|
|
test_sign_curve curve
|
|
|
|
done
|
|
|
|
|
|
|
|
let test_sign () =
|
|
|
|
test_sign_curve secp160r1 ;
|
|
|
|
test_sign_curve secp192r1 ;
|
|
|
|
test_sign_curve secp224r1 ;
|
|
|
|
test_sign_curve secp256r1 ;
|
|
|
|
test_sign_curve secp256k1 ;
|
|
|
|
()
|
|
|
|
|
|
|
|
let basic = [
|
|
|
|
"sksize", `Quick, test_sksize ;
|
|
|
|
"pksize", `Quick, test_pksize ;
|
|
|
|
"export", `Quick, test_export ;
|
|
|
|
"export_compressed", `Quick, test_export_compressed ;
|
|
|
|
"keypair", `Quick, test_keypair ;
|
|
|
|
"dh", `Quick, test_dh ;
|
2018-06-13 11:28:40 +04:00
|
|
|
(* "sign", `Quick, test_sign ; *)
|
2018-06-05 21:27:33 +04:00
|
|
|
]
|
|
|
|
|
|
|
|
let () =
|
|
|
|
Alcotest.run "uecc" [
|
|
|
|
"basic", basic ;
|
|
|
|
]
|