.
This commit is contained in:
parent
e3638acde9
commit
7ddd3f648f
4 changed files with 88 additions and 90 deletions
|
|
@ -1,7 +1,7 @@
|
||||||
(* Packed Signature *)
|
(* Packed Signature *)
|
||||||
|
|
||||||
open Bin_type
|
open Bin_type
|
||||||
open Bin_type.Alias
|
open Bin_type.Aliases
|
||||||
|
|
||||||
(* EccSignaturePurpose *)
|
(* EccSignaturePurpose *)
|
||||||
module Purpose = struct
|
module Purpose = struct
|
||||||
|
|
|
||||||
145
src/bin_type.ml
145
src/bin_type.ml
|
|
@ -13,6 +13,7 @@
|
||||||
(from https://docs.taler.net/taler-developer-manual.html) *)
|
(from https://docs.taler.net/taler-developer-manual.html) *)
|
||||||
|
|
||||||
(* TODO
|
(* TODO
|
||||||
|
- correctly handle endianness
|
||||||
- check that our struct are well packed
|
- check that our struct are well packed
|
||||||
- it looks like Bin only define packed structs
|
- it looks like Bin only define packed structs
|
||||||
- we don't need to worry about struct having "P" suffix
|
- we don't need to worry about struct having "P" suffix
|
||||||
|
|
@ -26,7 +27,8 @@
|
||||||
- outdated doc(?)
|
- outdated doc(?)
|
||||||
- some missing struct documentation
|
- some missing struct documentation
|
||||||
|
|
||||||
- correctly handle endianness *)
|
- better way to have module aliases?
|
||||||
|
*)
|
||||||
|
|
||||||
(* TODO hash and C(ancer)-terminated strings
|
(* TODO hash and C(ancer)-terminated strings
|
||||||
|
|
||||||
|
|
@ -37,10 +39,6 @@
|
||||||
! not strings that are raw-bytes-data-like
|
! not strings that are raw-bytes-data-like
|
||||||
? only for "HashCode" and "ShortHashCode"
|
? only for "HashCode" and "ShortHashCode"
|
||||||
*)
|
*)
|
||||||
(* TODO
|
|
||||||
- no need to wrap types in records?
|
|
||||||
- roll back to functor mess to avoid type confusion
|
|
||||||
- or just have HashXX/BytesXX ? *)
|
|
||||||
|
|
||||||
module Taler_signatures = Include.Taler_signatures
|
module Taler_signatures = Include.Taler_signatures
|
||||||
open Crypto
|
open Crypto
|
||||||
|
|
@ -49,29 +47,15 @@ let int32_size = 4
|
||||||
let int64_size = 8
|
let int64_size = 8
|
||||||
|
|
||||||
module Bytes_32 = struct
|
module Bytes_32 = struct
|
||||||
type t = { v: string }
|
type t = string
|
||||||
|
|
||||||
let of_octets v =
|
let bin = Bin.bytes 32
|
||||||
match String.length v = 32 with
|
|
||||||
| false -> Fmt.failwith "of_octets failure: data is not 32 bytes"
|
|
||||||
| true -> { v }
|
|
||||||
|
|
||||||
let bin =
|
|
||||||
let open Bin in
|
|
||||||
record (fun v -> { v }) |+ field (bytes 32) (fun t -> t.v) |> sealr
|
|
||||||
end
|
end
|
||||||
|
|
||||||
module Bytes_64 = struct
|
module Bytes_64 = struct
|
||||||
type t = { v: string }
|
type t = string
|
||||||
|
|
||||||
let of_octets v =
|
let bin = Bin.bytes 64
|
||||||
match String.length v = 64 with
|
|
||||||
| false -> Fmt.failwith "of_octets failure: data is not 64 bytes"
|
|
||||||
| true -> { v }
|
|
||||||
|
|
||||||
let bin =
|
|
||||||
let open Bin in
|
|
||||||
record (fun v -> { v }) |+ field (bytes 64) (fun t -> t.v) |> sealr
|
|
||||||
end
|
end
|
||||||
|
|
||||||
(* microseconds since the UNIX Epoch
|
(* microseconds since the UNIX Epoch
|
||||||
|
|
@ -79,20 +63,14 @@ end
|
||||||
module INT64 = struct
|
module INT64 = struct
|
||||||
type t = int64
|
type t = int64
|
||||||
|
|
||||||
let bin =
|
let bin = Bin.neint64
|
||||||
let open Bin in
|
|
||||||
record Fun.id |+ field neint64 Fun.id |> sealr
|
|
||||||
|
|
||||||
let of_ptime v = Util.ptime_to_int64 v
|
let of_ptime v = Util.ptime_to_int64 v
|
||||||
end
|
end
|
||||||
|
|
||||||
module INT64_NBO = struct
|
module INT64_NBO = struct
|
||||||
type t = int64
|
type t = int64
|
||||||
|
|
||||||
let bin =
|
let bin = Bin.beint64
|
||||||
let open Bin in
|
|
||||||
record Fun.id |+ field beint64 Fun.id |> sealr
|
|
||||||
|
|
||||||
let of_ptime = Util.ptime_to_int64
|
let of_ptime = Util.ptime_to_int64
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -118,16 +96,7 @@ module TimestampNBO : Time_S = INT64_NBO
|
||||||
module Hash_32 = struct
|
module Hash_32 = struct
|
||||||
type t = Digestif.SHA256.t
|
type t = Digestif.SHA256.t
|
||||||
|
|
||||||
let bin =
|
let hash s = Digestif.SHA256.(digest_string s)
|
||||||
let open Bin in
|
|
||||||
map (bytes 32) Digestif.SHA256.of_raw_string Digestif.SHA256.to_raw_string
|
|
||||||
|
|
||||||
let hash s =
|
|
||||||
match String.length s = 32 with
|
|
||||||
| false ->
|
|
||||||
Fmt.failwith "SHA256 failure: data is not 32 bytes, instead is %d"
|
|
||||||
(String.length s)
|
|
||||||
| true -> Digestif.SHA256.(digest_string s)
|
|
||||||
|
|
||||||
let of_octets s =
|
let of_octets s =
|
||||||
match String.length s = 32 with
|
match String.length s = 32 with
|
||||||
|
|
@ -135,19 +104,16 @@ module Hash_32 = struct
|
||||||
| true -> Digestif.SHA256.of_raw_string s
|
| true -> Digestif.SHA256.of_raw_string s
|
||||||
|
|
||||||
let to_octets = Digestif.SHA256.to_raw_string
|
let to_octets = Digestif.SHA256.to_raw_string
|
||||||
|
|
||||||
|
let bin =
|
||||||
|
let open Bin in
|
||||||
|
map (bytes 32) of_octets to_octets
|
||||||
end
|
end
|
||||||
|
|
||||||
module Hash_64 = struct
|
module Hash_64 = struct
|
||||||
type t = Digestif.SHA512.t
|
type t = Digestif.SHA512.t
|
||||||
|
|
||||||
let bin =
|
let hash s = Digestif.SHA512.(digest_string s)
|
||||||
let open Bin in
|
|
||||||
map (bytes 64) Digestif.SHA512.of_raw_string Digestif.SHA512.to_raw_string
|
|
||||||
|
|
||||||
let hash s =
|
|
||||||
match String.length s = 64 with
|
|
||||||
| false -> Fmt.failwith "SHA512 failure: data is not 64 bytes"
|
|
||||||
| true -> Digestif.SHA512.(digest_string s)
|
|
||||||
|
|
||||||
let of_octets s =
|
let of_octets s =
|
||||||
match String.length s = 64 with
|
match String.length s = 64 with
|
||||||
|
|
@ -155,16 +121,16 @@ module Hash_64 = struct
|
||||||
| true -> Digestif.SHA512.of_raw_string s
|
| true -> Digestif.SHA512.of_raw_string s
|
||||||
|
|
||||||
let to_octets = Digestif.SHA512.to_raw_string
|
let to_octets = Digestif.SHA512.to_raw_string
|
||||||
|
|
||||||
|
let bin =
|
||||||
|
let open Bin in
|
||||||
|
map (bytes 64) of_octets to_octets
|
||||||
end
|
end
|
||||||
|
|
||||||
(* Hash over string + '\0' *)
|
(* Hash over string + '\0' *)
|
||||||
module Hash_32_cstr = struct
|
module Hash_32_cstr = struct
|
||||||
type t = Digestif.SHA256.t
|
type t = Digestif.SHA256.t
|
||||||
|
|
||||||
let bin =
|
|
||||||
let open Bin in
|
|
||||||
map (bytes 32) Digestif.SHA256.of_raw_string Digestif.SHA256.to_raw_string
|
|
||||||
|
|
||||||
let hash s =
|
let hash s =
|
||||||
let s = s ^ "\x00" in
|
let s = s ^ "\x00" in
|
||||||
Digestif.SHA256.(digest_string s)
|
Digestif.SHA256.(digest_string s)
|
||||||
|
|
@ -175,15 +141,15 @@ module Hash_32_cstr = struct
|
||||||
| true -> Digestif.SHA256.of_raw_string s
|
| true -> Digestif.SHA256.of_raw_string s
|
||||||
|
|
||||||
let to_octets = Digestif.SHA256.to_raw_string
|
let to_octets = Digestif.SHA256.to_raw_string
|
||||||
|
|
||||||
|
let bin =
|
||||||
|
let open Bin in
|
||||||
|
map (bytes 32) of_octets to_octets
|
||||||
end
|
end
|
||||||
|
|
||||||
module Hash_64_cstr = struct
|
module Hash_64_cstr = struct
|
||||||
type t = Digestif.SHA512.t
|
type t = Digestif.SHA512.t
|
||||||
|
|
||||||
let bin =
|
|
||||||
let open Bin in
|
|
||||||
map (bytes 64) Digestif.SHA512.of_raw_string Digestif.SHA512.to_raw_string
|
|
||||||
|
|
||||||
let hash s =
|
let hash s =
|
||||||
let s = s ^ "\x00" in
|
let s = s ^ "\x00" in
|
||||||
Digestif.SHA512.(digest_string s)
|
Digestif.SHA512.(digest_string s)
|
||||||
|
|
@ -194,6 +160,10 @@ module Hash_64_cstr = struct
|
||||||
| true -> Digestif.SHA512.of_raw_string s
|
| true -> Digestif.SHA512.of_raw_string s
|
||||||
|
|
||||||
let to_octets = Digestif.SHA512.to_raw_string
|
let to_octets = Digestif.SHA512.to_raw_string
|
||||||
|
|
||||||
|
let bin =
|
||||||
|
let open Bin in
|
||||||
|
map (bytes 64) of_octets to_octets
|
||||||
end
|
end
|
||||||
|
|
||||||
module type Hash_S = sig
|
module type Hash_S = sig
|
||||||
|
|
@ -205,9 +175,9 @@ module type Hash_S = sig
|
||||||
val to_octets : t -> string
|
val to_octets : t -> string
|
||||||
end
|
end
|
||||||
|
|
||||||
module DenominationHash : Hash_S = Hash_64
|
|
||||||
module FullPaytoHash : Hash_S = Hash_32
|
module FullPaytoHash : Hash_S = Hash_32
|
||||||
module NormalizedPaytoHash : Hash_S = Hash_32
|
module NormalizedPaytoHash : Hash_S = Hash_32
|
||||||
|
module DenominationHash : Hash_S = Hash_64
|
||||||
module PrivateContractHash : Hash_S = Hash_64
|
module PrivateContractHash : Hash_S = Hash_64
|
||||||
module ExtensionsPolicyHash : Hash_S = Hash_64
|
module ExtensionsPolicyHash : Hash_S = Hash_64
|
||||||
module MerchantWireHash : Hash_S = Hash_64
|
module MerchantWireHash : Hash_S = Hash_64
|
||||||
|
|
@ -217,29 +187,6 @@ module CoinPubHash : Hash_S = Hash_64
|
||||||
module OutputCommitmentHash : Hash_S = Hash_64
|
module OutputCommitmentHash : Hash_S = Hash_64
|
||||||
module HashPlanchetsP : Hash_S = Hash_64
|
module HashPlanchetsP : Hash_S = Hash_64
|
||||||
|
|
||||||
(* Keys *)
|
|
||||||
module PursePublicKey = Bytes_32
|
|
||||||
module AuditorPublicKeyP = Bytes_32
|
|
||||||
module ReservePublicKeyP = Bytes_32
|
|
||||||
module ReservePrivateKeyP = Bytes_32
|
|
||||||
module MerchantPublicKeyP = Bytes_32
|
|
||||||
module MerchantPrivateKeyP = Bytes_32
|
|
||||||
module TransferPublicKeyP = Bytes_32
|
|
||||||
module TransferPrivateKeyP = Bytes_32
|
|
||||||
module AmlOfficerPublicKeyP = Bytes_32
|
|
||||||
module AmlOfficerPrivateKeyP = Bytes_32
|
|
||||||
module ExchangePublicKeyP = Bytes_32
|
|
||||||
module ExchangePrivateKeyP = Bytes_32
|
|
||||||
module MasterPublicKeyP = Bytes_32
|
|
||||||
module MasterPrivateKeyP = Bytes_32
|
|
||||||
module MasterSignatureP = EddsaSignature
|
|
||||||
module CoinSpendPublicKeyP = Bytes_32 (* union *)
|
|
||||||
module CoinSpendPrivateKeyP = Bytes_32 (* union *)
|
|
||||||
module TokenPublicKeyP = Bytes_32 (* union *)
|
|
||||||
module ReserveSignatureP = Bytes_64
|
|
||||||
module ExchangeSignatureP = Bytes_64
|
|
||||||
module CoinSpendSignatureP = Bytes_64
|
|
||||||
|
|
||||||
(* --- Various --- *)
|
(* --- Various --- *)
|
||||||
|
|
||||||
module TransferSecretP = Bytes_64
|
module TransferSecretP = Bytes_64
|
||||||
|
|
@ -259,6 +206,7 @@ module PublicRefreshCoinNonceP = Bytes_64
|
||||||
module DenominationBlindingKeyP = Bytes_32
|
module DenominationBlindingKeyP = Bytes_32
|
||||||
module RefreshCommitmentP = Bytes_64
|
module RefreshCommitmentP = Bytes_64
|
||||||
|
|
||||||
|
(* -- TODO better: -- *)
|
||||||
module UUID = struct
|
module UUID = struct
|
||||||
(* uint32t value[4]; *)
|
(* uint32t value[4]; *)
|
||||||
type t = { value: string }
|
type t = { value: string }
|
||||||
|
|
@ -314,9 +262,7 @@ let currency_len = 12
|
||||||
|
|
||||||
(* TODO missing doc
|
(* TODO missing doc
|
||||||
found in src/include/taler/taler_amount_lib.h *)
|
found in src/include/taler/taler_amount_lib.h *)
|
||||||
(* note: added 'Bin_' preffix to avoid conflict with Amount
|
module AmountP = struct
|
||||||
when opening Bin_type *)
|
|
||||||
module Bin_amount = struct
|
|
||||||
type t = {
|
type t = {
|
||||||
value: int64;
|
value: int64;
|
||||||
fraction: int32;
|
fraction: int32;
|
||||||
|
|
@ -349,7 +295,32 @@ module AmountNBO = struct
|
||||||
|> sealr
|
|> sealr
|
||||||
end
|
end
|
||||||
|
|
||||||
(* keep this for reference? *)
|
(* TODO keep this?
|
||||||
module Alias = struct
|
some of those are actuall ecdhe, or union of eddsa|ecdhe *)
|
||||||
module Amount = Bin_amount
|
module Aliases = struct
|
||||||
|
(* TODO add Amount.bin *)
|
||||||
|
module Amount = AmountP
|
||||||
|
|
||||||
|
(* - Keys - *)
|
||||||
|
module PursePublicKey = EddsaPublicKey
|
||||||
|
module AuditorPublicKeyP = EddsaPublicKey
|
||||||
|
module ReservePublicKeyP = EddsaPublicKey
|
||||||
|
module MerchantPublicKeyP = EddsaPublicKey
|
||||||
|
module TransferPublicKeyP = EddsaPublicKey
|
||||||
|
module AmlOfficerPublicKeyP = EddsaPublicKey
|
||||||
|
module ExchangePublicKeyP = EddsaPublicKey
|
||||||
|
module MasterPublicKeyP = EddsaPublicKey
|
||||||
|
module CoinSpendPublicKeyP = EddsaPublicKey
|
||||||
|
module TokenPublicKeyP = EddsaPublicKey
|
||||||
|
module ReservePrivateKeyP = EddsaPrivateKey
|
||||||
|
module MerchantPrivateKeyP = EddsaPrivateKey
|
||||||
|
module TransferPrivateKeyP = EddsaPrivateKey
|
||||||
|
module AmlOfficerPrivateKeyP = EddsaPrivateKey
|
||||||
|
module ExchangePrivateKeyP = EddsaPrivateKey
|
||||||
|
module MasterPrivateKeyP = EddsaPrivateKey
|
||||||
|
module CoinSpendPrivateKeyP = EddsaPrivateKey
|
||||||
|
module MasterSignatureP = EddsaSignature
|
||||||
|
module ReserveSignatureP = EddsaSignature
|
||||||
|
module ExchangeSignatureP = EddsaSignature
|
||||||
|
module CoinSpendSignatureP = EddsaSignature
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,32 @@ module EddsaPublicKey = struct
|
||||||
let jsont = Jsont.of_of_string ~kind:"EddsaPublicKey" of_b32 ~enc:to_b32
|
let jsont = Jsont.of_of_string ~kind:"EddsaPublicKey" of_b32 ~enc:to_b32
|
||||||
end
|
end
|
||||||
|
|
||||||
|
module EddsaPrivateKey = struct
|
||||||
|
(* EdDSA and ECDHE public keys always point on Curve25519
|
||||||
|
and represented using the standard 256 bits Ed25519 compact format,
|
||||||
|
converted to Crockford Base32. *)
|
||||||
|
open Mirage_crypto_ec.Ed25519
|
||||||
|
|
||||||
|
type t = priv
|
||||||
|
|
||||||
|
let to_octets t = priv_to_octets t
|
||||||
|
let of_octets t = priv_of_octets t |> Result.get_ok
|
||||||
|
|
||||||
|
let bin =
|
||||||
|
let open Bin in
|
||||||
|
map (bytes 32) of_octets to_octets
|
||||||
|
|
||||||
|
let of_b32 s =
|
||||||
|
let open Syntax in
|
||||||
|
let* octets = B32.decode s in
|
||||||
|
match priv_of_octets octets with
|
||||||
|
| Error e -> Fmt.error "%a" Mirage_crypto_ec.pp_error e
|
||||||
|
| Ok priv -> Ok priv
|
||||||
|
|
||||||
|
let to_b32 t = B32.encode (to_octets t)
|
||||||
|
let jsont = Jsont.of_of_string ~kind:"EddsaPrivateKey" of_b32 ~enc:to_b32
|
||||||
|
end
|
||||||
|
|
||||||
module EddsaSignature : sig
|
module EddsaSignature : sig
|
||||||
type t
|
type t
|
||||||
|
|
||||||
|
|
@ -112,6 +138,8 @@ module RsaPublicKey = struct
|
||||||
| true -> Ok ()
|
| true -> Ok ()
|
||||||
in
|
in
|
||||||
fun s ->
|
fun s ->
|
||||||
|
Result.get_ok
|
||||||
|
@@
|
||||||
let open Syntax in
|
let open Syntax in
|
||||||
let len = String.length s in
|
let len = String.length s in
|
||||||
let* () = check (len >= 4) in
|
let* () = check (len >= 4) in
|
||||||
|
|
@ -131,7 +159,7 @@ module RsaPublicKey = struct
|
||||||
let of_b32 s =
|
let of_b32 s =
|
||||||
let open Syntax in
|
let open Syntax in
|
||||||
let* s = B32.decode s in
|
let* s = B32.decode s in
|
||||||
let* v = of_octets s in
|
let v = of_octets s in
|
||||||
let+ v = Rsa.pub ~n:v.n ~e:v.e |> unwrap_err_msg in
|
let+ v = Rsa.pub ~n:v.n ~e:v.e |> unwrap_err_msg in
|
||||||
v
|
v
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,6 @@ let mk_future_denom denom_key_signf
|
||||||
let open Bin_signature.DenominationKeyAnnouncementPS in
|
let open Bin_signature.DenominationKeyAnnouncementPS in
|
||||||
let h_denom_pub = h_pub in
|
let h_denom_pub = h_pub in
|
||||||
let h_section_name = Hash_64_cstr.hash section_name in
|
let h_section_name = Hash_64_cstr.hash section_name in
|
||||||
let _huhu = BlindedCoinHash.hash section_name in
|
|
||||||
let anchor_time = TimeAbsoluteNBO.of_ptime stamp_start in
|
let anchor_time = TimeAbsoluteNBO.of_ptime stamp_start in
|
||||||
let duration_withdraw =
|
let duration_withdraw =
|
||||||
Ptime.diff stamp_start stamp_expire_withdraw
|
Ptime.diff stamp_start stamp_expire_withdraw
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue