diff --git a/src/bin_type.ml b/src/bin_type.ml index 75d5fd5f..c2a0ffc6 100644 --- a/src/bin_type.ml +++ b/src/bin_type.ml @@ -108,6 +108,13 @@ module Hash_32 = struct let bin = let open Bin in map (bytes 32) of_octets to_octets + + let caqti : t Caqti_type.t = + let open Caqti_type in + custom + ~encode:(fun v -> Ok (to_octets v)) + ~decode:(fun v -> Ok (of_octets v)) + octets end module Hash_64 = struct @@ -125,51 +132,37 @@ module Hash_64 = struct let bin = let open Bin in map (bytes 64) of_octets to_octets + + let caqti : t Caqti_type.t = + let open Caqti_type in + custom + ~encode:(fun v -> Ok (to_octets v)) + ~decode:(fun v -> Ok (of_octets v)) + octets end (* Hash over string + '\0' *) module Hash_32_cstr = struct - type t = Digestif.SHA256.t + include Hash_32 let hash s = let s = s ^ "\x00" in Digestif.SHA256.(digest_string s) - - let of_octets s = - match String.length s = 32 with - | false -> Fmt.failwith "Hash.of_octets failure: data is not 32 bytes" - | true -> Digestif.SHA256.of_raw_string s - - let to_octets = Digestif.SHA256.to_raw_string - - let bin = - let open Bin in - map (bytes 32) of_octets to_octets end module Hash_64_cstr = struct - type t = Digestif.SHA512.t + include Hash_64 let hash s = let s = s ^ "\x00" in Digestif.SHA512.(digest_string s) - - let of_octets s = - match String.length s = 64 with - | 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 bin = - let open Bin in - map (bytes 64) of_octets to_octets end module type Hash_S = sig type t val bin : t Bin.t + val caqti : t Caqti_type.t val hash : string -> t val of_octets : string -> t val to_octets : t -> string diff --git a/src/denomination.ml b/src/denomination.ml index d74ca172..65afdcc2 100644 --- a/src/denomination.ml +++ b/src/denomination.ml @@ -12,6 +12,7 @@ type t = { fee_deposit: Amount.t; fee_refresh: Amount.t; fee_refund: Amount.t; + age_mask: int; h_pub: Bin_type.DenominationHash.t; sign: string -> RsaSignature.t; master_sig: EddsaSignature.t option; @@ -62,6 +63,7 @@ let make fee_deposit; fee_refresh; fee_refund; + age_mask= 0; h_pub; sign; master_sig; diff --git a/src/management.ml b/src/management.ml index f743dd70..cb90dd15 100644 --- a/src/management.ml +++ b/src/management.ml @@ -14,13 +14,14 @@ let mk_future_denom denom_key_signf fee_deposit; fee_refresh; fee_refund; + age_mask; h_pub; sign= _; master_sig= _; } : Denomination.t) = let denom_pub = - DenominationKey.Rsa RsaDenominationKey.{ age_mask= 0; rsa_pub= pub } + DenominationKey.Rsa RsaDenominationKey.{ age_mask; rsa_pub= pub } in let denom_secmod_sig = let open Bin_type in diff --git a/src/pg.ml b/src/pg.ml index 8bedd702..a174b100 100644 --- a/src/pg.ml +++ b/src/pg.ml @@ -20,6 +20,15 @@ module Caqti_type = struct Amount.make ~sign:None ~currency:Config.currency ~value ~fraction) (t2 int64 int32) + let age_mask : int t = Caqti_type.int + + let rsa_public : RsaPublicKey.t t = + let open RsaPublicKey in + custom + ~encode:(fun v -> Ok (to_octets v)) + ~decode:(fun v -> Ok (of_octets v)) + octets + let eddsa_public : EddsaPublicKey.t t = let open EddsaPublicKey in custom @@ -34,9 +43,30 @@ module Caqti_type = struct ~decode:(fun s -> Ok (of_octets s)) octets + include struct + (* alias for hash *) + open Bin_type + + let fullpayto_hash = FullPaytoHash.caqti + let nomalizaedpayto_hash = NormalizedPaytoHash.caqti + let denomination_hash = DenominationHash.caqti + let privatecontract_hash = PrivateContractHash.caqti + let extensionspolicy_hash = ExtensionsPolicyHash.caqti + let merchantwire_hash = MerchantWireHash.caqti + let agecommitment_hash = AgeCommitmentHash.caqti + let blindedcoin_hash = BlindedCoinHash.caqti + let coinpub_hash = CoinPubHash.caqti + let outputcommitment_hash = OutputCommitmentHash.caqti + let planchets_hash = HashPlanchetsP.caqti + end + include Caqti_request.Infix end +module type CONN = Caqti_miou.CONNECTION + +open Bin_type + let preflight = let l = List.map @@ -50,41 +80,85 @@ let preflight = fun (module Conn : Caqti_miou.CONNECTION) -> Syntax.list_iter (fun p -> Conn.exec p ()) l +let lookup_signing_key = + let lookup_signing_key = + Caqti_type.(eddsa_public ->? t3 ptime ptime ptime) + "SELECT valid_from, expire_sign, expire_legal FROM exchange_sign_keys \ + WHERE exchange_pub=$1" + in + fun (module Conn : CONN) (exchange_pub : EddsaPublicKey.t) -> + Conn.find_opt lookup_signing_key exchange_pub + let activate_signing_key = let insert_signkey = Caqti_type.(t5 eddsa_public ptime ptime ptime eddsa_signature ->. unit) "INSERT INTO exchange_sign_keys (exchange_pub, valid_from, expire_sign, \ - expire_legal, master_sig) VALUES ($1, $2, $3, $4, $5);" + expire_legal, master_sig) VALUES ($1, $2, $3, $4, $5)" in - fun (module Conn : Caqti_miou.CONNECTION) exchange_signkey -> - let Signkey. - { pub; stamp_start; stamp_expire; stamp_end; master_sig= _; sign= _ } - = - exchange_signkey - in - (*let master_sig = master_sig |> Option.get in*) - let master_sig = EddsaSignature.of_octets (String.make 64 'x') in + fun (module Conn : CONN) + Signkey.{ pub; stamp_start; stamp_expire; stamp_end; master_sig; sign= _ } + -> + (* TODO master_sig *) + let master_sig = master_sig |> Option.get in Conn.exec insert_signkey (pub, stamp_start, stamp_expire, stamp_end, master_sig) -(* WIP: minimum db functions for basic /management *) +let lookup_denomination_key = + let lookup_denomination_key = + Caqti_type.( + denomination_hash + ->? t10 ptime ptime ptime ptime amount amount amount amount amount + age_mask) + "SELECT valid_from, expire_withdraw, expire_deposit, expire_legal, coin, \ + fee_withdraw, fee_deposit, fee_refresh, fee_refund, age_mask FROM \ + denominations WHERE denom_pub_hash=$1" + in + fun (module Conn : CONN) (h_denom_pub : DenominationHash.t) -> + Conn.find_opt lookup_denomination_key h_denom_pub -(* ----- *) - -let pg_todo () = assert false -let lookup_signing_key = pg_todo -let iterate_active_signkeys = pg_todo -let insert_signkey_revocation = pg_todo -let lookup_signkey_revocation = pg_todo - -(* denominations *) -let insert_denomination_info = pg_todo -let get_denomination_info = pg_todo -let get_denomination_by_serial = pg_todo -let iterate_denomination_info = pg_todo -let iterate_denominations = pg_todo -let get_coin_denomination = pg_todo -let insert_denomination_revocation = pg_todo -let get_denomination_revocation = pg_todo -let lookup_denomination_key = pg_todo -let add_denomination_key = pg_todo +let add_denomination_key = + let denomination_insert = + Caqti_type.( + t12 denomination_hash rsa_public eddsa_signature ptime ptime ptime ptime + amount amount amount amount (t2 amount age_mask) + ->. unit) + "INSERT INTO denominations (denom_pub_hash, denom_pub, master_sig, \ + valid_from, expire_withdraw, expire_deposit, expire_legal, coin, \ + fee_withdraw, fee_deposit, fee_refresh, fee_refund, age_mask) VALUES \ + ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)" + in + fun (module Conn : CONN) + Denomination. + { + pub; + section_name= _; + value; + stamp_start; + stamp_expire_withdraw; + stamp_expire_deposit; + stamp_expire_legal; + fee_withdraw; + fee_deposit; + fee_refresh; + fee_refund; + age_mask; + h_pub; + sign= _; + master_sig; + } + -> + (* TODO master_sig *) + let master_sig = master_sig |> Option.get in + Conn.exec denomination_insert + ( h_pub, + pub, + master_sig, + stamp_start, + stamp_expire_withdraw, + stamp_expire_deposit, + stamp_expire_legal, + value, + fee_withdraw, + fee_deposit, + fee_refresh, + (fee_refund, age_mask) ) diff --git a/src/signkey.ml b/src/signkey.ml index 01095f00..c4cfe477 100644 --- a/src/signkey.ml +++ b/src/signkey.ml @@ -1,5 +1,7 @@ open Crypto +(* TODO master_sig + not sur how to handle master_sig initialization *) type t = { pub: EddsaPublicKey.t; stamp_start: Ptime.t;