This commit is contained in:
parent
cf793c5a9f
commit
61788ae3cc
1 changed files with 114 additions and 6 deletions
|
|
@ -3,10 +3,11 @@
|
||||||
- numeric values are in network byte order (big endian) *)
|
- numeric values are in network byte order (big endian) *)
|
||||||
|
|
||||||
(* TODO
|
(* TODO
|
||||||
use Bin.seq instead of Bin.bytes?
|
less boilerplate?
|
||||||
less boilerplate (just make type t abstract)?
|
- type t abstract
|
||||||
|
- type t = { v = string }
|
||||||
padding issues?
|
padding issues?
|
||||||
how to encode union?
|
how to encode union? not really needed?
|
||||||
test *)
|
test *)
|
||||||
|
|
||||||
(* -- Time -- *)
|
(* -- Time -- *)
|
||||||
|
|
@ -16,10 +17,11 @@ module Time = struct
|
||||||
type t = { timestamp_us: int64 }
|
type t = { timestamp_us: int64 }
|
||||||
type t_nbo = { abs_value_us__: int64 }
|
type t_nbo = { abs_value_us__: int64 }
|
||||||
|
|
||||||
|
(* not BE here? never used? *)
|
||||||
let bin =
|
let bin =
|
||||||
let open Bin in
|
let open Bin in
|
||||||
record (fun timestamp_us -> { timestamp_us })
|
record (fun timestamp_us -> { timestamp_us })
|
||||||
|+ field neint64 (fun t -> t.timestamp_us) (* not BE here? *)
|
|+ field neint64 (fun t -> t.timestamp_us)
|
||||||
|> sealr
|
|> sealr
|
||||||
|
|
||||||
let nbo_bin =
|
let nbo_bin =
|
||||||
|
|
@ -219,7 +221,7 @@ module Wad_id = struct
|
||||||
|> sealr
|
|> sealr
|
||||||
end
|
end
|
||||||
|
|
||||||
(* TODO not sure what to do of unions *)
|
(* TODO not sure what to do of union, probably not needed *)
|
||||||
(*
|
(*
|
||||||
union TALER_CoinSpendPublicKeyP {
|
union TALER_CoinSpendPublicKeyP {
|
||||||
uint8_t eddsa_pub[32];
|
uint8_t eddsa_pub[32];
|
||||||
|
|
@ -230,7 +232,8 @@ union TALER_CoinSpendPrivateKeyP {
|
||||||
uint8_t ecdhe_priv[32];
|
uint8_t ecdhe_priv[32];
|
||||||
};
|
};
|
||||||
*)
|
*)
|
||||||
|
module Coin_spend_public_key_p = MAKE_EDDSA_PUB ()
|
||||||
|
module Coin_spend_private_key_p = MAKE_EDDSA_PRIV ()
|
||||||
module Coin_spend_signature_p = MAKE_EDDSA_SIG ()
|
module Coin_spend_signature_p = MAKE_EDDSA_SIG ()
|
||||||
|
|
||||||
(* TODO padding: sizeof used here (assume no padding for now) *)
|
(* TODO padding: sizeof used here (assume no padding for now) *)
|
||||||
|
|
@ -254,6 +257,7 @@ union TALER_TokenPublicKeyP {
|
||||||
uint8_t ecdhe_pub[32];
|
uint8_t ecdhe_pub[32];
|
||||||
};
|
};
|
||||||
*)
|
*)
|
||||||
|
module Token_public_key_p = MAKE_EDDSA_PUB ()
|
||||||
|
|
||||||
(* -- Signatures -- *)
|
(* -- Signatures -- *)
|
||||||
|
|
||||||
|
|
@ -276,3 +280,107 @@ module Ecc_signature_purpose = struct
|
||||||
|+ field beint32 (fun t -> t.purpose)
|
|+ field beint32 (fun t -> t.purpose)
|
||||||
|> sealr
|
|> sealr
|
||||||
end
|
end
|
||||||
|
|
||||||
|
(* This is the running SHA512-hash over all
|
||||||
|
`TALER_BlindedCoinHashP` values of an array of coins.
|
||||||
|
Note that each `TALER_BlindedCoinHashP` itself
|
||||||
|
captures the hash of the corresponding denomination's
|
||||||
|
public key. *)
|
||||||
|
module Hash_planchets_p = MAKE_H (Hash_code)
|
||||||
|
|
||||||
|
(* Binary representation of the age groups.
|
||||||
|
The bits set in the mask mark the edges at the beginning of a next age
|
||||||
|
group. F.e. for the age groups
|
||||||
|
0-7, 8-9, 10-11, 12-13, 14-15, 16-17, 18-20, 21-*
|
||||||
|
the following bits are set:
|
||||||
|
|
||||||
|
31 24 16 8 0
|
||||||
|
| | | | |
|
||||||
|
oooooooo oo1oo1o1 o1o1o1o1 ooooooo1
|
||||||
|
|
||||||
|
A value of 0 means that the exchange does not support the extension for
|
||||||
|
age-restriction. *)
|
||||||
|
module Age_mask = struct
|
||||||
|
type t = { mask: int32 }
|
||||||
|
|
||||||
|
let bin =
|
||||||
|
let open Bin in
|
||||||
|
record (fun mask -> { mask }) |+ field beint32 (fun t -> t.mask) |> sealr
|
||||||
|
end
|
||||||
|
|
||||||
|
(* TODO not in doc
|
||||||
|
dummy impl
|
||||||
|
struct TALER_BlindingMasterSecretP blinding_seed; *)
|
||||||
|
module Blinding_master_secret_p = MAKE_H (Hash_code)
|
||||||
|
|
||||||
|
(* TODO not in doc
|
||||||
|
struct TALER_Amount amount; *)
|
||||||
|
module Amount = MAKE_H (Hash_code)
|
||||||
|
|
||||||
|
(* Format used for to generate the signature on a request to withdraw
|
||||||
|
coins from a reserve. *)
|
||||||
|
module Withdraw_request_ps = struct
|
||||||
|
type t = {
|
||||||
|
(* TODO set it in encode/decode *)
|
||||||
|
(* Purpose is #TALER_SIGNATURE_WALLET_RESERVE_WITHDRAW *)
|
||||||
|
purpose: Ecc_signature_purpose.t;
|
||||||
|
(* Amount to withdraw, excluding fees, i.e.
|
||||||
|
the total sum of the denominations of the coins.
|
||||||
|
Note that the reserve must have a value of at least amount+fee. *)
|
||||||
|
amount: Amount.t;
|
||||||
|
(* Total fee for the withdrawal.
|
||||||
|
Note that the reserve must have a value of at least amount+fee. *)
|
||||||
|
fee: Amount.t;
|
||||||
|
(* This is the running SHA512-hash over all
|
||||||
|
`TALER_BlindedCoinHashP` values of the coins.
|
||||||
|
Note that each `TALER_BlindedCoinHashP` itself
|
||||||
|
captures the hash of the corresponding denomination's
|
||||||
|
public key.
|
||||||
|
If max_age was set in the withdraw request, there will be
|
||||||
|
n*κ many such values. The iteration MUST be first over
|
||||||
|
all coins belonging to κ index=0, then all coins
|
||||||
|
to κ index=1 etc:
|
||||||
|
h[0][0]…h[0][n-1]h[1][0]…h[1][n-1] … h[κ-1][0]…h[κ-1][n-1]
|
||||||
|
|
||||||
|
Note also that this value is required for /recoup and
|
||||||
|
-- in case of a withdraw request with required age proof --
|
||||||
|
in the subsequent call to /reveal-withdraw *)
|
||||||
|
h_planchets: Hash_planchets_p.t;
|
||||||
|
(* The master seed that was used in the call to /blinding-prepare blinding,
|
||||||
|
or all zeros, if no denomination of cipher type Clause-Schnorr is used. *)
|
||||||
|
blinding_seed: Blinding_master_secret_p.t;
|
||||||
|
(* If age restriction proof is required, the maximum age _group_
|
||||||
|
to commit to, 0 otherwise. Note that in this case, all
|
||||||
|
denominations for all coins MUST support age restriction.
|
||||||
|
Also note that this is not an age (in years), but the age group
|
||||||
|
(an index) according to list of age groups in the configuration
|
||||||
|
of the exchange. See TALER_get_max_group() how to calculate
|
||||||
|
the age group to a given age (in years). *)
|
||||||
|
max_age_group: int32;
|
||||||
|
(* The age groups as configured for the exchange, represented as a mask.
|
||||||
|
If max_age_group is > 0, the mask MUST be non-zero, too. *)
|
||||||
|
mask: Age_mask.t;
|
||||||
|
}
|
||||||
|
|
||||||
|
let bin =
|
||||||
|
let open Bin in
|
||||||
|
record
|
||||||
|
(fun purpose amount fee h_planchets blinding_seed max_age_group mask ->
|
||||||
|
{
|
||||||
|
purpose;
|
||||||
|
amount;
|
||||||
|
fee;
|
||||||
|
h_planchets;
|
||||||
|
blinding_seed;
|
||||||
|
max_age_group;
|
||||||
|
mask;
|
||||||
|
})
|
||||||
|
|+ field Ecc_signature_purpose.bin (fun t -> t.purpose)
|
||||||
|
|+ field Amount.bin (fun t -> t.amount)
|
||||||
|
|+ field Amount.bin (fun t -> t.fee)
|
||||||
|
|+ field Hash_planchets_p.bin (fun t -> t.h_planchets)
|
||||||
|
|+ field Blinding_master_secret_p.bin (fun t -> t.blinding_seed)
|
||||||
|
|+ field beint32 (fun t -> t.max_age_group)
|
||||||
|
|+ field Age_mask.bin (fun t -> t.mask)
|
||||||
|
|> sealr
|
||||||
|
end
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue