Crypto: add P256 cryptography
This commit is contained in:
parent
7df49b62e1
commit
21823483a5
@ -300,217 +300,222 @@ opam:11:tezos-rpc:
|
|||||||
variables:
|
variables:
|
||||||
package: tezos-rpc
|
package: tezos-rpc
|
||||||
|
|
||||||
opam:12:tezos-crypto:
|
opam:12:uecc:
|
||||||
|
<<: *opam_definition
|
||||||
|
variables:
|
||||||
|
package: uecc
|
||||||
|
|
||||||
|
opam:13:tezos-crypto:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-crypto
|
package: tezos-crypto
|
||||||
|
|
||||||
opam:13:tezos-micheline:
|
opam:14:tezos-micheline:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-micheline
|
package: tezos-micheline
|
||||||
|
|
||||||
opam:14:lmdb:
|
opam:15:lmdb:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: lmdb
|
package: lmdb
|
||||||
|
|
||||||
opam:15:pbkdf:
|
opam:16:pbkdf:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: pbkdf
|
package: pbkdf
|
||||||
|
|
||||||
opam:16:ocplib-resto-cohttp:
|
opam:17:ocplib-resto-cohttp:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: ocplib-resto-cohttp
|
package: ocplib-resto-cohttp
|
||||||
|
|
||||||
opam:17:tezos-base:
|
opam:18:tezos-base:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-base
|
package: tezos-base
|
||||||
|
|
||||||
opam:18:irmin-lmdb:
|
opam:19:irmin-lmdb:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: irmin-lmdb
|
package: irmin-lmdb
|
||||||
|
|
||||||
opam:19:bip39:
|
opam:20:bip39:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: bip39
|
package: bip39
|
||||||
|
|
||||||
opam:20:tezos-rpc-http:
|
opam:21:tezos-rpc-http:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-rpc-http
|
package: tezos-rpc-http
|
||||||
|
|
||||||
opam:21:tezos-shell-services:
|
opam:22:tezos-shell-services:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-shell-services
|
package: tezos-shell-services
|
||||||
|
|
||||||
opam:22:tezos-stdlib-unix:
|
opam:23:tezos-stdlib-unix:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-stdlib-unix
|
package: tezos-stdlib-unix
|
||||||
|
|
||||||
opam:23:tezos-storage:
|
opam:24:tezos-storage:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-storage
|
package: tezos-storage
|
||||||
|
|
||||||
opam:24:tezos-protocol-environment-sigs:
|
opam:25:tezos-protocol-environment-sigs:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-protocol-environment-sigs
|
package: tezos-protocol-environment-sigs
|
||||||
|
|
||||||
opam:25:tezos-client-base:
|
opam:26:tezos-client-base:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-client-base
|
package: tezos-client-base
|
||||||
|
|
||||||
opam:26:tezos-protocol-compiler:
|
opam:27:tezos-protocol-compiler:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-protocol-compiler
|
package: tezos-protocol-compiler
|
||||||
|
|
||||||
opam:27:tezos-signer-services:
|
opam:28:tezos-signer-services:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-signer-services
|
package: tezos-signer-services
|
||||||
|
|
||||||
opam:28:tezos-protocol-alpha:
|
opam:29:tezos-protocol-alpha:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-protocol-alpha
|
package: tezos-protocol-alpha
|
||||||
|
|
||||||
opam:29:tezos-protocol-environment:
|
opam:30:tezos-protocol-environment:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-protocol-environment
|
package: tezos-protocol-environment
|
||||||
|
|
||||||
opam:30:tezos-signer-backends:
|
opam:31:tezos-signer-backends:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-signer-backends
|
package: tezos-signer-backends
|
||||||
|
|
||||||
opam:31:tezos-client-alpha:
|
opam:32:tezos-client-alpha:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-client-alpha
|
package: tezos-client-alpha
|
||||||
|
|
||||||
opam:32:tezos-client-commands:
|
opam:33:tezos-client-commands:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-client-commands
|
package: tezos-client-commands
|
||||||
|
|
||||||
opam:33:tezos-protocol-environment-shell:
|
opam:34:tezos-protocol-environment-shell:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-protocol-environment-shell
|
package: tezos-protocol-environment-shell
|
||||||
|
|
||||||
opam:34:tezos-baking-alpha:
|
opam:35:tezos-baking-alpha:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-baking-alpha
|
package: tezos-baking-alpha
|
||||||
|
|
||||||
opam:35:tezos-protocol-genesis:
|
opam:36:tezos-protocol-genesis:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-protocol-genesis
|
package: tezos-protocol-genesis
|
||||||
|
|
||||||
opam:36:ocplib-resto-json:
|
opam:37:ocplib-resto-json:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: ocplib-resto-json
|
package: ocplib-resto-json
|
||||||
|
|
||||||
opam:37:tezos-protocol-updater:
|
opam:38:tezos-protocol-updater:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-protocol-updater
|
package: tezos-protocol-updater
|
||||||
|
|
||||||
opam:38:tezos-p2p:
|
opam:39:tezos-p2p:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-p2p
|
package: tezos-p2p
|
||||||
|
|
||||||
opam:39:tezos-baking-alpha-commands:
|
opam:40:tezos-baking-alpha-commands:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-baking-alpha-commands
|
package: tezos-baking-alpha-commands
|
||||||
|
|
||||||
opam:40:tezos-client-alpha-commands:
|
opam:41:tezos-client-alpha-commands:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-client-alpha-commands
|
package: tezos-client-alpha-commands
|
||||||
|
|
||||||
opam:41:tezos-client-base-unix:
|
opam:42:tezos-client-base-unix:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-client-base-unix
|
package: tezos-client-base-unix
|
||||||
|
|
||||||
opam:42:tezos-client-genesis:
|
opam:43:tezos-client-genesis:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-client-genesis
|
package: tezos-client-genesis
|
||||||
|
|
||||||
opam:43:ocplib-ezresto:
|
opam:44:ocplib-ezresto:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: ocplib-ezresto
|
package: ocplib-ezresto
|
||||||
|
|
||||||
opam:44:tezos-embedded-protocol-alpha:
|
opam:45:tezos-embedded-protocol-alpha:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-embedded-protocol-alpha
|
package: tezos-embedded-protocol-alpha
|
||||||
|
|
||||||
opam:45:tezos-embedded-protocol-demo:
|
opam:46:tezos-embedded-protocol-demo:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-embedded-protocol-demo
|
package: tezos-embedded-protocol-demo
|
||||||
|
|
||||||
opam:46:tezos-embedded-protocol-genesis:
|
opam:47:tezos-embedded-protocol-genesis:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-embedded-protocol-genesis
|
package: tezos-embedded-protocol-genesis
|
||||||
|
|
||||||
opam:47:tezos-shell:
|
opam:48:tezos-shell:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-shell
|
package: tezos-shell
|
||||||
|
|
||||||
opam:48:tezos-client:
|
opam:49:tezos-client:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-client
|
package: tezos-client
|
||||||
|
|
||||||
opam:49:ocplib-ezresto-directory:
|
opam:50:ocplib-ezresto-directory:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: ocplib-ezresto-directory
|
package: ocplib-ezresto-directory
|
||||||
|
|
||||||
opam:50:tezos-baker-alpha:
|
opam:51:tezos-baker-alpha:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-baker-alpha
|
package: tezos-baker-alpha
|
||||||
|
|
||||||
opam:51:tezos-protocol-demo:
|
opam:52:tezos-protocol-demo:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-protocol-demo
|
package: tezos-protocol-demo
|
||||||
|
|
||||||
opam:52:tezos-signer:
|
opam:53:tezos-signer:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-signer
|
package: tezos-signer
|
||||||
|
|
||||||
opam:53:tezos-node:
|
opam:54:tezos-node:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: tezos-node
|
package: tezos-node
|
||||||
|
|
||||||
opam:54:ocplib-json-typed-browser:
|
opam:55:ocplib-json-typed-browser:
|
||||||
<<: *opam_definition
|
<<: *opam_definition
|
||||||
variables:
|
variables:
|
||||||
package: ocplib-json-typed-browser
|
package: ocplib-json-typed-browser
|
||||||
|
@ -28,10 +28,12 @@ key2=bar
|
|||||||
key3=boo
|
key3=boo
|
||||||
key4=king
|
key4=king
|
||||||
key5=queen
|
key5=queen
|
||||||
|
key6=p256
|
||||||
|
|
||||||
$client gen keys $key1
|
$client gen keys $key1
|
||||||
$client gen keys $key2 --sig secp256k1
|
$client gen keys $key2 --sig secp256k1
|
||||||
$client gen keys $key3 --sig ed25519
|
$client gen keys $key3 --sig ed25519
|
||||||
|
$client gen keys $key6 --sig p256
|
||||||
|
|
||||||
$client list known identities
|
$client list known identities
|
||||||
$client get balance for bootstrap1
|
$client get balance for bootstrap1
|
||||||
@ -39,10 +41,12 @@ $client get balance for bootstrap1
|
|||||||
bake_after $client transfer 1,000 from bootstrap1 to $key1
|
bake_after $client transfer 1,000 from bootstrap1 to $key1
|
||||||
bake_after $client transfer 2,000 from bootstrap1 to $key2
|
bake_after $client transfer 2,000 from bootstrap1 to $key2
|
||||||
bake_after $client transfer 3,000 from bootstrap1 to $key3
|
bake_after $client transfer 3,000 from bootstrap1 to $key3
|
||||||
|
bake_after $client transfer 4,000 from bootstrap1 to $key6
|
||||||
|
|
||||||
$client get balance for $key1 | assert "1,000 ꜩ"
|
$client get balance for $key1 | assert "1,000 ꜩ"
|
||||||
$client get balance for $key2 | assert "2,000 ꜩ"
|
$client get balance for $key2 | assert "2,000 ꜩ"
|
||||||
$client get balance for $key3 | assert "3,000 ꜩ"
|
$client get balance for $key3 | assert "3,000 ꜩ"
|
||||||
|
$client get balance for $key6 | assert "4,000 ꜩ"
|
||||||
|
|
||||||
bake_after $client transfer 1,000 from $key2 to $key1 -fee 0
|
bake_after $client transfer 1,000 from $key2 to $key1 -fee 0
|
||||||
$client get balance for $key1 | assert "2,000 ꜩ"
|
$client get balance for $key1 | assert "2,000 ꜩ"
|
||||||
|
@ -29,7 +29,7 @@ let sig_algo_arg =
|
|||||||
~doc:"use custom signature algorithm"
|
~doc:"use custom signature algorithm"
|
||||||
~long:"sig"
|
~long:"sig"
|
||||||
~short:'s'
|
~short:'s'
|
||||||
~placeholder:"ed25519|secp256k1"
|
~placeholder:"ed25519|secp256k1|p256"
|
||||||
~default: "ed25519"
|
~default: "ed25519"
|
||||||
(Signature.algo_param ())
|
(Signature.algo_param ())
|
||||||
|
|
||||||
|
@ -308,9 +308,8 @@ module Prefix = struct
|
|||||||
|
|
||||||
(* 20 *)
|
(* 20 *)
|
||||||
let ed25519_public_key_hash = "\006\161\159" (* tz1(36) *)
|
let ed25519_public_key_hash = "\006\161\159" (* tz1(36) *)
|
||||||
|
|
||||||
(* 20 *)
|
|
||||||
let secp256k1_public_key_hash = "\006\161\161" (* tz2(36) *)
|
let secp256k1_public_key_hash = "\006\161\161" (* tz2(36) *)
|
||||||
|
let p256_public_key_hash = "\006\161\164" (* tz3(36) *)
|
||||||
|
|
||||||
(* 16 *)
|
(* 16 *)
|
||||||
let cryptobox_public_key_hash = "\153\103" (* id(30) *)
|
let cryptobox_public_key_hash = "\153\103" (* id(30) *)
|
||||||
@ -319,14 +318,17 @@ module Prefix = struct
|
|||||||
let ed25519_seed = "\013\015\058\007" (* edsk(54) *)
|
let ed25519_seed = "\013\015\058\007" (* edsk(54) *)
|
||||||
let ed25519_public_key = "\013\015\037\217" (* edpk(54) *)
|
let ed25519_public_key = "\013\015\037\217" (* edpk(54) *)
|
||||||
let secp256k1_secret_key = "\017\162\224\201" (* spsk(54) *)
|
let secp256k1_secret_key = "\017\162\224\201" (* spsk(54) *)
|
||||||
|
let p256_secret_key = "\016\081\238\189" (* p2sk(54) *)
|
||||||
|
|
||||||
(* 33 *)
|
(* 33 *)
|
||||||
let secp256k1_public_key = "\003\254\226\086" (* sppk(55) *)
|
let secp256k1_public_key = "\003\254\226\086" (* sppk(55) *)
|
||||||
|
let p256_public_key = "\003\178\139\127" (* p2pk(55) *)
|
||||||
|
|
||||||
(* 64 *)
|
(* 64 *)
|
||||||
let ed25519_secret_key = "\043\246\078\007" (* edsk(98) *)
|
let ed25519_secret_key = "\043\246\078\007" (* edsk(98) *)
|
||||||
let ed25519_signature = "\009\245\205\134\018" (* edsig(99) *)
|
let ed25519_signature = "\009\245\205\134\018" (* edsig(99) *)
|
||||||
let secp256k1_signature = "\013\115\101\019\063" (* spsig1(99) *)
|
let secp256k1_signature = "\013\115\101\019\063" (* spsig1(99) *)
|
||||||
|
let p256_signature = "\054\240\044\052" (* p2sig(98) *)
|
||||||
let generic_signature = "\004\130\043" (* sig(96) *)
|
let generic_signature = "\004\130\043" (* sig(96) *)
|
||||||
|
|
||||||
(* 4 *)
|
(* 4 *)
|
||||||
|
@ -19,6 +19,7 @@ module Prefix : sig
|
|||||||
val context_hash: string
|
val context_hash: string
|
||||||
val ed25519_public_key_hash: string
|
val ed25519_public_key_hash: string
|
||||||
val secp256k1_public_key_hash: string
|
val secp256k1_public_key_hash: string
|
||||||
|
val p256_public_key_hash: string
|
||||||
val cryptobox_public_key_hash: string
|
val cryptobox_public_key_hash: string
|
||||||
val ed25519_seed: string
|
val ed25519_seed: string
|
||||||
val ed25519_public_key: string
|
val ed25519_public_key: string
|
||||||
@ -27,6 +28,9 @@ module Prefix : sig
|
|||||||
val secp256k1_public_key: string
|
val secp256k1_public_key: string
|
||||||
val secp256k1_secret_key: string
|
val secp256k1_secret_key: string
|
||||||
val secp256k1_signature: string
|
val secp256k1_signature: string
|
||||||
|
val p256_public_key: string
|
||||||
|
val p256_secret_key: string
|
||||||
|
val p256_signature: string
|
||||||
val generic_signature: string
|
val generic_signature: string
|
||||||
val chain_id: string
|
val chain_id: string
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
blake2
|
blake2
|
||||||
hacl
|
hacl
|
||||||
secp256k1
|
secp256k1
|
||||||
|
uecc
|
||||||
zarith))))
|
zarith))))
|
||||||
|
|
||||||
(alias
|
(alias
|
||||||
|
266
src/lib_crypto/p256.ml
Normal file
266
src/lib_crypto/p256.ml
Normal file
@ -0,0 +1,266 @@
|
|||||||
|
(**************************************************************************)
|
||||||
|
(* *)
|
||||||
|
(* Copyright (c) 2014 - 2018. *)
|
||||||
|
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
|
||||||
|
(* *)
|
||||||
|
(* All rights reserved. No warranty, explicit or implicit, provided. *)
|
||||||
|
(* *)
|
||||||
|
(**************************************************************************)
|
||||||
|
|
||||||
|
module Public_key_hash = Blake2B.Make(Base58)(struct
|
||||||
|
let name = "P256.Public_key_hash"
|
||||||
|
let title = "A P256 public key hash"
|
||||||
|
let b58check_prefix = Base58.Prefix.p256_public_key_hash
|
||||||
|
let size = Some 20
|
||||||
|
end)
|
||||||
|
|
||||||
|
let () =
|
||||||
|
Base58.check_encoded_prefix Public_key_hash.b58check_encoding "tz3" 36
|
||||||
|
|
||||||
|
open Uecc
|
||||||
|
|
||||||
|
module Public_key = struct
|
||||||
|
|
||||||
|
type t = (secp256r1, public) key
|
||||||
|
|
||||||
|
let name = "P256.Public_key"
|
||||||
|
let title = "A P256 public key"
|
||||||
|
|
||||||
|
let to_bytes = to_bytes ~compress:true
|
||||||
|
let of_bytes_opt = pk_of_bytes secp256r1
|
||||||
|
|
||||||
|
let to_string s = MBytes.to_string (to_bytes s)
|
||||||
|
let of_string_opt s = of_bytes_opt (MBytes.of_string s)
|
||||||
|
|
||||||
|
let size = compressed_size secp256r1
|
||||||
|
|
||||||
|
type Base58.data +=
|
||||||
|
| Data of t
|
||||||
|
|
||||||
|
let b58check_encoding =
|
||||||
|
Base58.register_encoding
|
||||||
|
~prefix: Base58.Prefix.p256_public_key
|
||||||
|
~length: size
|
||||||
|
~to_raw: to_string
|
||||||
|
~of_raw: of_string_opt
|
||||||
|
~wrap: (fun x -> Data x)
|
||||||
|
|
||||||
|
let () =
|
||||||
|
Base58.check_encoded_prefix b58check_encoding "p2pk" 55
|
||||||
|
|
||||||
|
let hash v =
|
||||||
|
Public_key_hash.hash_bytes [to_bytes v]
|
||||||
|
|
||||||
|
include Compare.Make(struct
|
||||||
|
type nonrec t = t
|
||||||
|
let compare a b =
|
||||||
|
MBytes.compare (to_bytes a) (to_bytes b)
|
||||||
|
end)
|
||||||
|
|
||||||
|
include Helpers.MakeRaw(struct
|
||||||
|
type nonrec t = t
|
||||||
|
let name = name
|
||||||
|
let of_bytes_opt = of_bytes_opt
|
||||||
|
let of_string_opt = of_string_opt
|
||||||
|
let to_string = to_string
|
||||||
|
end)
|
||||||
|
|
||||||
|
include Helpers.MakeB58(struct
|
||||||
|
type nonrec t = t
|
||||||
|
let title = title
|
||||||
|
let name = name
|
||||||
|
let b58check_encoding = b58check_encoding
|
||||||
|
end)
|
||||||
|
|
||||||
|
include Helpers.MakeEncoder(struct
|
||||||
|
type nonrec t = t
|
||||||
|
let name = name
|
||||||
|
let title = title
|
||||||
|
let raw_encoding =
|
||||||
|
let open Data_encoding in
|
||||||
|
conv to_bytes of_bytes_exn (Fixed.bytes size)
|
||||||
|
let of_b58check = of_b58check
|
||||||
|
let of_b58check_opt = of_b58check_opt
|
||||||
|
let of_b58check_exn = of_b58check_exn
|
||||||
|
let to_b58check = to_b58check
|
||||||
|
let to_short_b58check = to_short_b58check
|
||||||
|
end)
|
||||||
|
|
||||||
|
let pp ppf t = Format.fprintf ppf "%s" (to_b58check t)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
module Secret_key = struct
|
||||||
|
|
||||||
|
type t = (secp256r1, secret) key
|
||||||
|
|
||||||
|
let name = "P256.Secret_key"
|
||||||
|
let title = "A P256 secret key"
|
||||||
|
|
||||||
|
let size = sk_size secp256r1
|
||||||
|
|
||||||
|
let of_bytes_opt buf =
|
||||||
|
Option.map ~f:fst (sk_of_bytes secp256r1 buf)
|
||||||
|
|
||||||
|
let to_bytes = to_bytes ~compress:true
|
||||||
|
|
||||||
|
let to_string s = MBytes.to_string (to_bytes s)
|
||||||
|
let of_string_opt s = of_bytes_opt (MBytes.of_string s)
|
||||||
|
|
||||||
|
let to_public_key = neuterize
|
||||||
|
|
||||||
|
type Base58.data +=
|
||||||
|
| Data of t
|
||||||
|
|
||||||
|
let b58check_encoding =
|
||||||
|
Base58.register_encoding
|
||||||
|
~prefix: Base58.Prefix.p256_secret_key
|
||||||
|
~length: size
|
||||||
|
~to_raw: to_string
|
||||||
|
~of_raw: of_string_opt
|
||||||
|
~wrap: (fun x -> Data x)
|
||||||
|
|
||||||
|
let () =
|
||||||
|
Base58.check_encoded_prefix b58check_encoding "p2sk" 54
|
||||||
|
|
||||||
|
include Compare.Make(struct
|
||||||
|
type nonrec t = t
|
||||||
|
let compare a b =
|
||||||
|
MBytes.compare (to_bytes a) (to_bytes b)
|
||||||
|
end)
|
||||||
|
|
||||||
|
include Helpers.MakeRaw(struct
|
||||||
|
type nonrec t = t
|
||||||
|
let name = name
|
||||||
|
let of_bytes_opt = of_bytes_opt
|
||||||
|
let of_string_opt = of_string_opt
|
||||||
|
let to_string = to_string
|
||||||
|
end)
|
||||||
|
|
||||||
|
include Helpers.MakeB58(struct
|
||||||
|
type nonrec t = t
|
||||||
|
let title = title
|
||||||
|
let name = name
|
||||||
|
let b58check_encoding = b58check_encoding
|
||||||
|
end)
|
||||||
|
|
||||||
|
include Helpers.MakeEncoder(struct
|
||||||
|
type nonrec t = t
|
||||||
|
let name = name
|
||||||
|
let title = title
|
||||||
|
let raw_encoding =
|
||||||
|
let open Data_encoding in
|
||||||
|
conv to_bytes of_bytes_exn (Fixed.bytes size)
|
||||||
|
let of_b58check = of_b58check
|
||||||
|
let of_b58check_opt = of_b58check_opt
|
||||||
|
let of_b58check_exn = of_b58check_exn
|
||||||
|
let to_b58check = to_b58check
|
||||||
|
let to_short_b58check = to_short_b58check
|
||||||
|
end)
|
||||||
|
|
||||||
|
let pp ppf t = Format.fprintf ppf "%s" (to_b58check t)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
type t = MBytes.t
|
||||||
|
|
||||||
|
type watermark = MBytes.t
|
||||||
|
|
||||||
|
let name = "P256"
|
||||||
|
let title = "A P256 signature"
|
||||||
|
|
||||||
|
let size = pk_size secp256r1
|
||||||
|
|
||||||
|
let of_bytes_opt s =
|
||||||
|
if MBytes.length s = size then Some s else None
|
||||||
|
|
||||||
|
let to_bytes s = s
|
||||||
|
|
||||||
|
let to_string s = MBytes.to_string (to_bytes s)
|
||||||
|
let of_string_opt s = of_bytes_opt (MBytes.of_string s)
|
||||||
|
|
||||||
|
type Base58.data +=
|
||||||
|
| Data of t
|
||||||
|
|
||||||
|
let b58check_encoding =
|
||||||
|
Base58.register_encoding
|
||||||
|
~prefix: Base58.Prefix.p256_signature
|
||||||
|
~length: size
|
||||||
|
~to_raw: to_string
|
||||||
|
~of_raw: of_string_opt
|
||||||
|
~wrap: (fun x -> Data x)
|
||||||
|
|
||||||
|
let () =
|
||||||
|
Base58.check_encoded_prefix b58check_encoding "p2sig" 98
|
||||||
|
|
||||||
|
include Helpers.MakeRaw(struct
|
||||||
|
type nonrec t = t
|
||||||
|
let name = name
|
||||||
|
let of_bytes_opt = of_bytes_opt
|
||||||
|
let of_string_opt = of_string_opt
|
||||||
|
let to_string = to_string
|
||||||
|
end)
|
||||||
|
|
||||||
|
include Helpers.MakeB58(struct
|
||||||
|
type nonrec t = t
|
||||||
|
let title = title
|
||||||
|
let name = name
|
||||||
|
let b58check_encoding = b58check_encoding
|
||||||
|
end)
|
||||||
|
|
||||||
|
include Helpers.MakeEncoder(struct
|
||||||
|
type nonrec t = t
|
||||||
|
let name = name
|
||||||
|
let title = title
|
||||||
|
let raw_encoding =
|
||||||
|
let open Data_encoding in
|
||||||
|
conv to_bytes of_bytes_exn (Fixed.bytes size)
|
||||||
|
let of_b58check = of_b58check
|
||||||
|
let of_b58check_opt = of_b58check_opt
|
||||||
|
let of_b58check_exn = of_b58check_exn
|
||||||
|
let to_b58check = to_b58check
|
||||||
|
let to_short_b58check = to_short_b58check
|
||||||
|
end)
|
||||||
|
|
||||||
|
let pp ppf t = Format.fprintf ppf "%s" (to_b58check t)
|
||||||
|
|
||||||
|
let zero = of_bytes_exn (MBytes.make size '\000')
|
||||||
|
|
||||||
|
let sign ?watermark sk msg =
|
||||||
|
let msg =
|
||||||
|
Blake2B.to_bytes @@
|
||||||
|
Blake2B.hash_bytes @@
|
||||||
|
match watermark with
|
||||||
|
| None -> [msg]
|
||||||
|
| Some prefix -> [ prefix ; msg ] in
|
||||||
|
match sign sk msg with
|
||||||
|
| None ->
|
||||||
|
(* Will never happen in practice. This can only happen in case
|
||||||
|
of RNG error. *)
|
||||||
|
invalid_arg "P256.sign: internal error"
|
||||||
|
| Some signature -> signature
|
||||||
|
|
||||||
|
let check ?watermark public_key signature msg =
|
||||||
|
let msg =
|
||||||
|
Blake2B.to_bytes @@
|
||||||
|
Blake2B.hash_bytes @@
|
||||||
|
match watermark with
|
||||||
|
| None -> [msg]
|
||||||
|
| Some prefix -> [ prefix ; msg ] in
|
||||||
|
verify public_key ~msg ~signature
|
||||||
|
|
||||||
|
let generate_key ?(seed=Rand.generate 32) () =
|
||||||
|
let seedlen = MBytes.length seed in
|
||||||
|
if seedlen < 32 then
|
||||||
|
invalid_arg (Printf.sprintf "P256.generate_key: seed must be at \
|
||||||
|
least 32 bytes long (was %d)" seedlen) ;
|
||||||
|
match sk_of_bytes secp256r1 seed with
|
||||||
|
| None -> invalid_arg "P256.generate_key: invalid seed (very rare!)"
|
||||||
|
| Some (sk, pk) ->
|
||||||
|
let pkh = Public_key.hash pk in
|
||||||
|
pkh, pk, sk
|
||||||
|
|
||||||
|
include Compare.Make(struct
|
||||||
|
type nonrec t = t
|
||||||
|
let compare = MBytes.compare
|
||||||
|
end)
|
13
src/lib_crypto/p256.mli
Normal file
13
src/lib_crypto/p256.mli
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
(**************************************************************************)
|
||||||
|
(* *)
|
||||||
|
(* Copyright (c) 2014 - 2018. *)
|
||||||
|
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
|
||||||
|
(* *)
|
||||||
|
(* All rights reserved. No warranty, explicit or implicit, provided. *)
|
||||||
|
(* *)
|
||||||
|
(**************************************************************************)
|
||||||
|
|
||||||
|
(** Tezos - P256 cryptography *)
|
||||||
|
|
||||||
|
include S.SIGNATURE with type watermark = MBytes.t
|
||||||
|
include S.RAW_DATA with type t := t
|
@ -62,7 +62,7 @@ module Public_key = struct
|
|||||||
include Compare.Make(struct
|
include Compare.Make(struct
|
||||||
type nonrec t = t
|
type nonrec t = t
|
||||||
let compare a b =
|
let compare a b =
|
||||||
MBytes.compare (Key.buffer a) (Key.buffer b)
|
MBytes.compare (to_bytes a) (to_bytes b)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
include Helpers.MakeRaw(struct
|
include Helpers.MakeRaw(struct
|
||||||
@ -264,4 +264,3 @@ let generate_key ?(seed=Rand.generate 32) () =
|
|||||||
let pk = Key.neuterize_exn context sk in
|
let pk = Key.neuterize_exn context sk in
|
||||||
let pkh = Public_key.hash pk in
|
let pkh = Public_key.hash pk in
|
||||||
pkh, pk, sk
|
pkh, pk, sk
|
||||||
|
|
||||||
|
@ -12,14 +12,17 @@ open Error_monad
|
|||||||
type public_key_hash =
|
type public_key_hash =
|
||||||
| Ed25519 of Ed25519.Public_key_hash.t
|
| Ed25519 of Ed25519.Public_key_hash.t
|
||||||
| Secp256k1 of Secp256k1.Public_key_hash.t
|
| Secp256k1 of Secp256k1.Public_key_hash.t
|
||||||
|
| P256 of P256.Public_key_hash.t
|
||||||
|
|
||||||
type public_key =
|
type public_key =
|
||||||
| Ed25519 of Ed25519.Public_key.t
|
| Ed25519 of Ed25519.Public_key.t
|
||||||
| Secp256k1 of Secp256k1.Public_key.t
|
| Secp256k1 of Secp256k1.Public_key.t
|
||||||
|
| P256 of P256.Public_key.t
|
||||||
|
|
||||||
type secret_key =
|
type secret_key =
|
||||||
| Ed25519 of Ed25519.Secret_key.t
|
| Ed25519 of Ed25519.Secret_key.t
|
||||||
| Secp256k1 of Secp256k1.Secret_key.t
|
| Secp256k1 of Secp256k1.Secret_key.t
|
||||||
|
| P256 of P256.Secret_key.t
|
||||||
|
|
||||||
type watermark =
|
type watermark =
|
||||||
| Block_header
|
| Block_header
|
||||||
@ -32,9 +35,10 @@ module Public_key_hash = struct
|
|||||||
type t = public_key_hash =
|
type t = public_key_hash =
|
||||||
| Ed25519 of Ed25519.Public_key_hash.t
|
| Ed25519 of Ed25519.Public_key_hash.t
|
||||||
| Secp256k1 of Secp256k1.Public_key_hash.t
|
| Secp256k1 of Secp256k1.Public_key_hash.t
|
||||||
|
| P256 of P256.Public_key_hash.t
|
||||||
|
|
||||||
let name = "Signature.Public_key_hash"
|
let name = "Signature.Public_key_hash"
|
||||||
let title = "A Secp256k1 or Ed25519 public key hash"
|
let title = "A Ed25519, Secp256k1, or P256 public key hash"
|
||||||
|
|
||||||
type Base58.data += Data of t (* unused *)
|
type Base58.data += Data of t (* unused *)
|
||||||
let b58check_encoding = (* unused *)
|
let b58check_encoding = (* unused *)
|
||||||
@ -56,7 +60,11 @@ module Public_key_hash = struct
|
|||||||
case (Tag 1) Secp256k1.Public_key_hash.encoding
|
case (Tag 1) Secp256k1.Public_key_hash.encoding
|
||||||
~title:"Secp256k1"
|
~title:"Secp256k1"
|
||||||
(function Secp256k1 x -> Some x | _ -> None)
|
(function Secp256k1 x -> Some x | _ -> None)
|
||||||
(function x -> Secp256k1 x)
|
(function x -> Secp256k1 x) ;
|
||||||
|
case (Tag 2)
|
||||||
|
~title:"P256" P256.Public_key_hash.encoding
|
||||||
|
(function P256 x -> Some x | _ -> None)
|
||||||
|
(function x -> P256 x)
|
||||||
]
|
]
|
||||||
|
|
||||||
let to_bytes s =
|
let to_bytes s =
|
||||||
@ -82,6 +90,7 @@ module Public_key_hash = struct
|
|||||||
match Base58.decode s with
|
match Base58.decode s with
|
||||||
| Some Ed25519.Public_key_hash.Data pkh -> Some (Ed25519 pkh)
|
| Some Ed25519.Public_key_hash.Data pkh -> Some (Ed25519 pkh)
|
||||||
| Some Secp256k1.Public_key_hash.Data pkh -> Some (Secp256k1 pkh)
|
| Some Secp256k1.Public_key_hash.Data pkh -> Some (Secp256k1 pkh)
|
||||||
|
| Some P256.Public_key_hash.Data pkh -> Some (P256 pkh)
|
||||||
| _ -> None
|
| _ -> None
|
||||||
|
|
||||||
let of_b58check_exn s =
|
let of_b58check_exn s =
|
||||||
@ -99,14 +108,17 @@ module Public_key_hash = struct
|
|||||||
let to_b58check = function
|
let to_b58check = function
|
||||||
| Ed25519 pkh -> Ed25519.Public_key_hash.to_b58check pkh
|
| Ed25519 pkh -> Ed25519.Public_key_hash.to_b58check pkh
|
||||||
| Secp256k1 pkh -> Secp256k1.Public_key_hash.to_b58check pkh
|
| Secp256k1 pkh -> Secp256k1.Public_key_hash.to_b58check pkh
|
||||||
|
| P256 pkh -> P256.Public_key_hash.to_b58check pkh
|
||||||
|
|
||||||
let to_short_b58check = function
|
let to_short_b58check = function
|
||||||
| Ed25519 pkh -> Ed25519.Public_key_hash.to_short_b58check pkh
|
| Ed25519 pkh -> Ed25519.Public_key_hash.to_short_b58check pkh
|
||||||
| Secp256k1 pkh -> Secp256k1.Public_key_hash.to_short_b58check pkh
|
| Secp256k1 pkh -> Secp256k1.Public_key_hash.to_short_b58check pkh
|
||||||
|
| P256 pkh -> P256.Public_key_hash.to_short_b58check pkh
|
||||||
|
|
||||||
let to_path key l = match key with
|
let to_path key l = match key with
|
||||||
| Ed25519 h -> "ed25519" :: Ed25519.Public_key_hash.to_path h l
|
| Ed25519 h -> "ed25519" :: Ed25519.Public_key_hash.to_path h l
|
||||||
| Secp256k1 h -> "secp256k1" :: Secp256k1.Public_key_hash.to_path h l
|
| Secp256k1 h -> "secp256k1" :: Secp256k1.Public_key_hash.to_path h l
|
||||||
|
| P256 h -> "p256" :: P256.Public_key_hash.to_path h l
|
||||||
|
|
||||||
let of_path = function
|
let of_path = function
|
||||||
| "ed25519" :: q -> begin
|
| "ed25519" :: q -> begin
|
||||||
@ -119,10 +131,17 @@ module Public_key_hash = struct
|
|||||||
| Some pkh -> Some (Secp256k1 pkh)
|
| Some pkh -> Some (Secp256k1 pkh)
|
||||||
| None -> None
|
| None -> None
|
||||||
end
|
end
|
||||||
|
| "p256" :: q -> begin
|
||||||
|
match P256.Public_key_hash.of_path q with
|
||||||
|
| Some pkh -> Some (P256 pkh)
|
||||||
|
| None -> None
|
||||||
|
end
|
||||||
| _ -> assert false (* FIXME classification des erreurs *)
|
| _ -> assert false (* FIXME classification des erreurs *)
|
||||||
|
|
||||||
let of_path_exn = function
|
let of_path_exn = function
|
||||||
| "ed25519" :: q -> Ed25519 (Ed25519.Public_key_hash.of_path_exn q)
|
| "ed25519" :: q -> Ed25519 (Ed25519.Public_key_hash.of_path_exn q)
|
||||||
| "secp256k1" :: q -> Secp256k1 (Secp256k1.Public_key_hash.of_path_exn q)
|
| "secp256k1" :: q -> Secp256k1 (Secp256k1.Public_key_hash.of_path_exn q)
|
||||||
|
| "p256" :: q -> P256 (P256.Public_key_hash.of_path_exn q)
|
||||||
| _ -> assert false (* FIXME classification des erreurs *)
|
| _ -> assert false (* FIXME classification des erreurs *)
|
||||||
|
|
||||||
let path_length =
|
let path_length =
|
||||||
@ -139,12 +158,13 @@ module Public_key_hash = struct
|
|||||||
type nonrec t = t
|
type nonrec t = t
|
||||||
let compare a b =
|
let compare a b =
|
||||||
match (a, b) with
|
match (a, b) with
|
||||||
| Ed25519 _ , Secp256k1 _ -> 1
|
|
||||||
| Secp256k1 _, Ed25519 _ -> -1
|
|
||||||
| Ed25519 x, Ed25519 y ->
|
| Ed25519 x, Ed25519 y ->
|
||||||
Ed25519.Public_key_hash.compare x y
|
Ed25519.Public_key_hash.compare x y
|
||||||
| Secp256k1 x, Secp256k1 y ->
|
| Secp256k1 x, Secp256k1 y ->
|
||||||
Secp256k1.Public_key_hash.compare x y
|
Secp256k1.Public_key_hash.compare x y
|
||||||
|
| P256 x, P256 y ->
|
||||||
|
P256.Public_key_hash.compare x y
|
||||||
|
| _ -> Pervasives.compare a b
|
||||||
end)
|
end)
|
||||||
|
|
||||||
include Helpers.MakeEncoder(struct
|
include Helpers.MakeEncoder(struct
|
||||||
@ -180,22 +200,24 @@ module Public_key = struct
|
|||||||
type t = public_key =
|
type t = public_key =
|
||||||
| Ed25519 of Ed25519.Public_key.t
|
| Ed25519 of Ed25519.Public_key.t
|
||||||
| Secp256k1 of Secp256k1.Public_key.t
|
| Secp256k1 of Secp256k1.Public_key.t
|
||||||
|
| P256 of P256.Public_key.t
|
||||||
|
|
||||||
let name = "Signature.Public_key"
|
let name = "Signature.Public_key"
|
||||||
let title = "A Secp256k1 or Ed25519 public key"
|
let title = "A Ed25519, Secp256k1, or P256 public key"
|
||||||
|
|
||||||
let hash pk =
|
let hash pk =
|
||||||
match pk with
|
match pk with
|
||||||
| Ed25519 pk -> Public_key_hash.Ed25519 (Ed25519.Public_key.hash pk)
|
| Ed25519 pk -> Public_key_hash.Ed25519 (Ed25519.Public_key.hash pk)
|
||||||
| Secp256k1 pk -> Public_key_hash.Secp256k1 (Secp256k1.Public_key.hash pk)
|
| Secp256k1 pk -> Public_key_hash.Secp256k1 (Secp256k1.Public_key.hash pk)
|
||||||
|
| P256 pk -> Public_key_hash.P256 (P256.Public_key.hash pk)
|
||||||
|
|
||||||
include Compare.Make(struct
|
include Compare.Make(struct
|
||||||
type nonrec t = t
|
type nonrec t = t
|
||||||
let compare a b = match (a, b) with
|
let compare a b = match (a, b) with
|
||||||
| (Ed25519 _ , Secp256k1 _) -> 1
|
| Ed25519 x, Ed25519 y -> Ed25519.Public_key.compare x y
|
||||||
| (Secp256k1 _, Ed25519 _ ) -> -1
|
| Secp256k1 x, Secp256k1 y -> Secp256k1.Public_key.compare x y
|
||||||
| (Ed25519 x, Ed25519 y) -> Ed25519.Public_key.compare x y
|
| P256 x, P256 y -> P256.Public_key.compare x y
|
||||||
| (Secp256k1 x, Secp256k1 y) -> Secp256k1.Public_key.compare x y
|
| _ -> Pervasives.compare a b
|
||||||
end)
|
end)
|
||||||
|
|
||||||
type Base58.data += Data of t (* unused *)
|
type Base58.data += Data of t (* unused *)
|
||||||
@ -211,6 +233,7 @@ module Public_key = struct
|
|||||||
match Base58.decode s with
|
match Base58.decode s with
|
||||||
| Some (Ed25519.Public_key.Data public_key) -> Some (Ed25519 public_key)
|
| Some (Ed25519.Public_key.Data public_key) -> Some (Ed25519 public_key)
|
||||||
| Some (Secp256k1.Public_key.Data public_key) -> Some (Secp256k1 public_key)
|
| Some (Secp256k1.Public_key.Data public_key) -> Some (Secp256k1 public_key)
|
||||||
|
| Some (P256.Public_key.Data public_key) -> Some (P256 public_key)
|
||||||
| _ -> None
|
| _ -> None
|
||||||
|
|
||||||
let of_b58check_exn s =
|
let of_b58check_exn s =
|
||||||
@ -228,10 +251,12 @@ module Public_key = struct
|
|||||||
let to_b58check = function
|
let to_b58check = function
|
||||||
| Ed25519 pk -> Ed25519.Public_key.to_b58check pk
|
| Ed25519 pk -> Ed25519.Public_key.to_b58check pk
|
||||||
| Secp256k1 pk -> Secp256k1.Public_key.to_b58check pk
|
| Secp256k1 pk -> Secp256k1.Public_key.to_b58check pk
|
||||||
|
| P256 pk -> P256.Public_key.to_b58check pk
|
||||||
|
|
||||||
let to_short_b58check = function
|
let to_short_b58check = function
|
||||||
| Ed25519 pk -> Ed25519.Public_key.to_short_b58check pk
|
| Ed25519 pk -> Ed25519.Public_key.to_short_b58check pk
|
||||||
| Secp256k1 pk -> Secp256k1.Public_key.to_short_b58check pk
|
| Secp256k1 pk -> Secp256k1.Public_key.to_short_b58check pk
|
||||||
|
| P256 pk -> P256.Public_key.to_short_b58check pk
|
||||||
|
|
||||||
include Helpers.MakeEncoder(struct
|
include Helpers.MakeEncoder(struct
|
||||||
type nonrec t = t
|
type nonrec t = t
|
||||||
@ -248,7 +273,11 @@ module Public_key = struct
|
|||||||
case (Tag 1) Secp256k1.Public_key.encoding
|
case (Tag 1) Secp256k1.Public_key.encoding
|
||||||
~title:"Secp256k1"
|
~title:"Secp256k1"
|
||||||
(function Secp256k1 x -> Some x | _ -> None)
|
(function Secp256k1 x -> Some x | _ -> None)
|
||||||
(function x -> Secp256k1 x)
|
(function x -> Secp256k1 x) ;
|
||||||
|
case
|
||||||
|
~title:"P256" (Tag 2) P256.Public_key.encoding
|
||||||
|
(function P256 x -> Some x | _ -> None)
|
||||||
|
(function x -> P256 x)
|
||||||
]
|
]
|
||||||
let of_b58check = of_b58check
|
let of_b58check = of_b58check
|
||||||
let of_b58check_opt = of_b58check_opt
|
let of_b58check_opt = of_b58check_opt
|
||||||
@ -266,21 +295,23 @@ module Secret_key = struct
|
|||||||
type t = secret_key =
|
type t = secret_key =
|
||||||
| Ed25519 of Ed25519.Secret_key.t
|
| Ed25519 of Ed25519.Secret_key.t
|
||||||
| Secp256k1 of Secp256k1.Secret_key.t
|
| Secp256k1 of Secp256k1.Secret_key.t
|
||||||
|
| P256 of P256.Secret_key.t
|
||||||
|
|
||||||
let name = "Signature.Secret_key"
|
let name = "Signature.Secret_key"
|
||||||
let title = "A Secp256k1 or Ed25519 secret key"
|
let title = "A Ed25519, Secp256k1 or P256 secret key"
|
||||||
|
|
||||||
let to_public_key = function
|
let to_public_key = function
|
||||||
| Ed25519 sk -> Public_key.Ed25519 (Ed25519.Secret_key.to_public_key sk)
|
| Ed25519 sk -> Public_key.Ed25519 (Ed25519.Secret_key.to_public_key sk)
|
||||||
| Secp256k1 sk -> Public_key.Secp256k1 (Secp256k1.Secret_key.to_public_key sk)
|
| Secp256k1 sk -> Public_key.Secp256k1 (Secp256k1.Secret_key.to_public_key sk)
|
||||||
|
| P256 sk -> Public_key.P256 (P256.Secret_key.to_public_key sk)
|
||||||
|
|
||||||
include Compare.Make(struct
|
include Compare.Make(struct
|
||||||
type nonrec t = t
|
type nonrec t = t
|
||||||
let compare a b = match (a, b) with
|
let compare a b = match (a, b) with
|
||||||
| (Ed25519 _ , Secp256k1 _) -> 1
|
| Ed25519 x, Ed25519 y -> Ed25519.Secret_key.compare x y
|
||||||
| (Secp256k1 _, Ed25519 _ ) -> -1
|
| Secp256k1 x, Secp256k1 y -> Secp256k1.Secret_key.compare x y
|
||||||
| (Ed25519 x, Ed25519 y) -> Ed25519.Secret_key.compare x y
|
| P256 x, P256 y -> P256.Secret_key.compare x y
|
||||||
| (Secp256k1 x, Secp256k1 y) -> Secp256k1.Secret_key.compare x y
|
| _ -> Pervasives.compare a b
|
||||||
end)
|
end)
|
||||||
|
|
||||||
type Base58.data += Data of t (* unused *)
|
type Base58.data += Data of t (* unused *)
|
||||||
@ -296,6 +327,7 @@ module Secret_key = struct
|
|||||||
match Base58.decode b with
|
match Base58.decode b with
|
||||||
| Some (Ed25519.Secret_key.Data sk) -> Some (Ed25519 sk)
|
| Some (Ed25519.Secret_key.Data sk) -> Some (Ed25519 sk)
|
||||||
| Some (Secp256k1.Secret_key.Data sk) -> Some (Secp256k1 sk)
|
| Some (Secp256k1.Secret_key.Data sk) -> Some (Secp256k1 sk)
|
||||||
|
| Some (P256.Secret_key.Data sk) -> Some (P256 sk)
|
||||||
| _ -> None
|
| _ -> None
|
||||||
|
|
||||||
let of_b58check_exn s =
|
let of_b58check_exn s =
|
||||||
@ -313,10 +345,12 @@ module Secret_key = struct
|
|||||||
let to_b58check = function
|
let to_b58check = function
|
||||||
| Ed25519 sk -> Ed25519.Secret_key.to_b58check sk
|
| Ed25519 sk -> Ed25519.Secret_key.to_b58check sk
|
||||||
| Secp256k1 sk -> Secp256k1.Secret_key.to_b58check sk
|
| Secp256k1 sk -> Secp256k1.Secret_key.to_b58check sk
|
||||||
|
| P256 sk -> P256.Secret_key.to_b58check sk
|
||||||
|
|
||||||
let to_short_b58check = function
|
let to_short_b58check = function
|
||||||
| Ed25519 sk -> Ed25519.Secret_key.to_short_b58check sk
|
| Ed25519 sk -> Ed25519.Secret_key.to_short_b58check sk
|
||||||
| Secp256k1 sk -> Secp256k1.Secret_key.to_short_b58check sk
|
| Secp256k1 sk -> Secp256k1.Secret_key.to_short_b58check sk
|
||||||
|
| P256 sk -> P256.Secret_key.to_short_b58check sk
|
||||||
|
|
||||||
include Helpers.MakeEncoder(struct
|
include Helpers.MakeEncoder(struct
|
||||||
type nonrec t = t
|
type nonrec t = t
|
||||||
@ -333,7 +367,11 @@ module Secret_key = struct
|
|||||||
case (Tag 1) Secp256k1.Secret_key.encoding
|
case (Tag 1) Secp256k1.Secret_key.encoding
|
||||||
~title:"Secp256k1"
|
~title:"Secp256k1"
|
||||||
(function Secp256k1 x -> Some x | _ -> None)
|
(function Secp256k1 x -> Some x | _ -> None)
|
||||||
(function x -> Secp256k1 x)
|
(function x -> Secp256k1 x) ;
|
||||||
|
case (Tag 2)
|
||||||
|
~title:"P256" P256.Secret_key.encoding
|
||||||
|
(function P256 x -> Some x | _ -> None)
|
||||||
|
(function x -> P256 x)
|
||||||
]
|
]
|
||||||
let of_b58check = of_b58check
|
let of_b58check = of_b58check
|
||||||
let of_b58check_opt = of_b58check_opt
|
let of_b58check_opt = of_b58check_opt
|
||||||
@ -349,18 +387,21 @@ end
|
|||||||
type t =
|
type t =
|
||||||
| Ed25519 of Ed25519.t
|
| Ed25519 of Ed25519.t
|
||||||
| Secp256k1 of Secp256k1.t
|
| Secp256k1 of Secp256k1.t
|
||||||
|
| P256 of P256.t
|
||||||
| Unknown of MBytes.t
|
| Unknown of MBytes.t
|
||||||
|
|
||||||
let name = "Signature"
|
let name = "Signature"
|
||||||
let title = "A Secp256k1 or Ed25519 signature"
|
let title = "A Ed25519, Secp256k1 or P256 signature"
|
||||||
|
|
||||||
let () = assert (Ed25519.size = Secp256k1.size)
|
let size =
|
||||||
let size = Ed25519.size
|
assert (Ed25519.size = Secp256k1.size && Secp256k1.size = P256.size) ;
|
||||||
|
Ed25519.size
|
||||||
|
|
||||||
let to_bytes = function
|
let to_bytes = function
|
||||||
| Unknown b -> b
|
|
||||||
| Ed25519 b -> Ed25519.to_bytes b
|
| Ed25519 b -> Ed25519.to_bytes b
|
||||||
| Secp256k1 b -> Secp256k1.to_bytes b
|
| Secp256k1 b -> Secp256k1.to_bytes b
|
||||||
|
| P256 b -> P256.to_bytes b
|
||||||
|
| Unknown b -> b
|
||||||
|
|
||||||
let of_bytes_opt s =
|
let of_bytes_opt s =
|
||||||
if MBytes.length s = size then Some (Unknown s) else None
|
if MBytes.length s = size then Some (Unknown s) else None
|
||||||
@ -405,6 +446,10 @@ let of_b58check_opt s =
|
|||||||
Option.map
|
Option.map
|
||||||
(Secp256k1.of_b58check_opt s)
|
(Secp256k1.of_b58check_opt s)
|
||||||
~f: (fun x -> Secp256k1 x)
|
~f: (fun x -> Secp256k1 x)
|
||||||
|
else if TzString.has_prefix ~prefix:P256.b58check_encoding.encoded_prefix s then
|
||||||
|
Option.map
|
||||||
|
(P256.of_b58check_opt s)
|
||||||
|
~f: (fun x -> P256 x)
|
||||||
else
|
else
|
||||||
Base58.simple_decode b58check_encoding s
|
Base58.simple_decode b58check_encoding s
|
||||||
|
|
||||||
@ -423,11 +468,13 @@ let of_b58check s =
|
|||||||
let to_b58check = function
|
let to_b58check = function
|
||||||
| Ed25519 b -> Ed25519.to_b58check b
|
| Ed25519 b -> Ed25519.to_b58check b
|
||||||
| Secp256k1 b -> Secp256k1.to_b58check b
|
| Secp256k1 b -> Secp256k1.to_b58check b
|
||||||
|
| P256 b -> P256.to_b58check b
|
||||||
| Unknown b -> Base58.simple_encode b58check_encoding (Unknown b)
|
| Unknown b -> Base58.simple_encode b58check_encoding (Unknown b)
|
||||||
|
|
||||||
let to_short_b58check = function
|
let to_short_b58check = function
|
||||||
| Ed25519 b -> Ed25519.to_short_b58check b
|
| Ed25519 b -> Ed25519.to_short_b58check b
|
||||||
| Secp256k1 b -> Secp256k1.to_short_b58check b
|
| Secp256k1 b -> Secp256k1.to_short_b58check b
|
||||||
|
| P256 b -> P256.to_short_b58check b
|
||||||
| Unknown b -> Base58.simple_encode b58check_encoding (Unknown b)
|
| Unknown b -> Base58.simple_encode b58check_encoding (Unknown b)
|
||||||
|
|
||||||
include Helpers.MakeEncoder(struct
|
include Helpers.MakeEncoder(struct
|
||||||
@ -448,8 +495,9 @@ include Helpers.MakeEncoder(struct
|
|||||||
|
|
||||||
let pp ppf t = Format.fprintf ppf "%s" (to_b58check t)
|
let pp ppf t = Format.fprintf ppf "%s" (to_b58check t)
|
||||||
|
|
||||||
let of_secp256k1 s = Secp256k1 s
|
|
||||||
let of_ed25519 s = Ed25519 s
|
let of_ed25519 s = Ed25519 s
|
||||||
|
let of_secp256k1 s = Secp256k1 s
|
||||||
|
let of_p256 s = P256 s
|
||||||
|
|
||||||
let zero = of_ed25519 Ed25519.zero
|
let zero = of_ed25519 Ed25519.zero
|
||||||
|
|
||||||
@ -463,7 +511,8 @@ let sign ?watermark secret_key message =
|
|||||||
let watermark = Option.map ~f:bytes_of_watermark watermark in
|
let watermark = Option.map ~f:bytes_of_watermark watermark in
|
||||||
match secret_key with
|
match secret_key with
|
||||||
| Secret_key.Ed25519 sk -> of_ed25519 (Ed25519.sign ?watermark sk message)
|
| Secret_key.Ed25519 sk -> of_ed25519 (Ed25519.sign ?watermark sk message)
|
||||||
| Secret_key.Secp256k1 sk -> of_secp256k1 (Secp256k1.sign ?watermark sk message)
|
| Secp256k1 sk -> of_secp256k1 (Secp256k1.sign ?watermark sk message)
|
||||||
|
| P256 sk -> of_p256 (P256.sign ?watermark sk message)
|
||||||
|
|
||||||
let check ?watermark public_key signature message =
|
let check ?watermark public_key signature message =
|
||||||
let watermark = Option.map ~f:bytes_of_watermark watermark in
|
let watermark = Option.map ~f:bytes_of_watermark watermark in
|
||||||
@ -478,12 +527,18 @@ let check ?watermark public_key signature message =
|
|||||||
| Some s -> Secp256k1.check ?watermark pk s message
|
| Some s -> Secp256k1.check ?watermark pk s message
|
||||||
| None -> false
|
| None -> false
|
||||||
end
|
end
|
||||||
|
| Public_key.P256 pk, Unknown signature -> begin
|
||||||
|
match P256.of_bytes_opt signature with
|
||||||
|
| Some s -> P256.check ?watermark pk s message
|
||||||
|
| None -> false
|
||||||
|
end
|
||||||
| Public_key.Ed25519 pk, Ed25519 signature ->
|
| Public_key.Ed25519 pk, Ed25519 signature ->
|
||||||
Ed25519.check ?watermark pk signature message
|
Ed25519.check ?watermark pk signature message
|
||||||
| Public_key.Secp256k1 pk, Secp256k1 signature ->
|
| Public_key.Secp256k1 pk, Secp256k1 signature ->
|
||||||
Secp256k1.check ?watermark pk signature message
|
Secp256k1.check ?watermark pk signature message
|
||||||
| Public_key.Ed25519 _, Secp256k1 _ -> false
|
| Public_key.P256 pk, P256 signature ->
|
||||||
| Public_key.Secp256k1 _, Ed25519 _ -> false
|
P256.check ?watermark pk signature message
|
||||||
|
| _ -> false
|
||||||
|
|
||||||
let append ?watermark sk msg =
|
let append ?watermark sk msg =
|
||||||
MBytes.concat "" [msg; (to_bytes (sign ?watermark sk msg))]
|
MBytes.concat "" [msg; (to_bytes (sign ?watermark sk msg))]
|
||||||
@ -494,28 +549,34 @@ let concat msg signature =
|
|||||||
type algo =
|
type algo =
|
||||||
| Ed25519
|
| Ed25519
|
||||||
| Secp256k1
|
| Secp256k1
|
||||||
|
| P256
|
||||||
|
|
||||||
let algo_param () =
|
let algo_param () =
|
||||||
Clic.parameter
|
Clic.parameter
|
||||||
~autocomplete:(fun _ -> return [ "ed25519" ; "secp256k1" ])
|
~autocomplete:(fun _ -> return [ "ed25519" ; "secp256k1" ; "p256"])
|
||||||
begin fun _ name ->
|
begin fun _ name ->
|
||||||
match name with
|
match name with
|
||||||
| "ed25519" -> return Ed25519
|
| "ed25519" -> return Ed25519
|
||||||
| "secp256k1" -> return Secp256k1
|
| "secp256k1" -> return Secp256k1
|
||||||
|
| "p256" -> return P256
|
||||||
| name ->
|
| name ->
|
||||||
failwith
|
failwith
|
||||||
"Unknown signature algorithm (%s). \
|
"Unknown signature algorithm (%s). \
|
||||||
Available: 'ed25519' or 'secp256k1'"
|
Available: 'ed25519', 'secp256k1' or 'p256'"
|
||||||
name
|
name
|
||||||
end
|
end
|
||||||
|
|
||||||
let generate_key ?(algo = Ed25519) ?seed () =
|
let generate_key ?(algo = Ed25519) ?seed () =
|
||||||
match algo with
|
match algo with
|
||||||
| Secp256k1 ->
|
|
||||||
let pkh, pk, sk = Secp256k1.generate_key ?seed () in
|
|
||||||
(Public_key_hash.Secp256k1 pkh,
|
|
||||||
Public_key.Secp256k1 pk, Secret_key.Secp256k1 sk)
|
|
||||||
| Ed25519 ->
|
| Ed25519 ->
|
||||||
let pkh, pk, sk = Ed25519.generate_key ?seed () in
|
let pkh, pk, sk = Ed25519.generate_key ?seed () in
|
||||||
(Public_key_hash.Ed25519 pkh,
|
(Public_key_hash.Ed25519 pkh,
|
||||||
Public_key.Ed25519 pk, Secret_key.Ed25519 sk)
|
Public_key.Ed25519 pk, Secret_key.Ed25519 sk)
|
||||||
|
| Secp256k1 ->
|
||||||
|
let pkh, pk, sk = Secp256k1.generate_key ?seed () in
|
||||||
|
(Public_key_hash.Secp256k1 pkh,
|
||||||
|
Public_key.Secp256k1 pk, Secret_key.Secp256k1 sk)
|
||||||
|
| P256 ->
|
||||||
|
let pkh, pk, sk = P256.generate_key ?seed () in
|
||||||
|
(Public_key_hash.P256 pkh,
|
||||||
|
Public_key.P256 pk, Secret_key.P256 sk)
|
||||||
|
@ -10,14 +10,17 @@
|
|||||||
type public_key_hash =
|
type public_key_hash =
|
||||||
| Ed25519 of Ed25519.Public_key_hash.t
|
| Ed25519 of Ed25519.Public_key_hash.t
|
||||||
| Secp256k1 of Secp256k1.Public_key_hash.t
|
| Secp256k1 of Secp256k1.Public_key_hash.t
|
||||||
|
| P256 of P256.Public_key_hash.t
|
||||||
|
|
||||||
type public_key =
|
type public_key =
|
||||||
| Ed25519 of Ed25519.Public_key.t
|
| Ed25519 of Ed25519.Public_key.t
|
||||||
| Secp256k1 of Secp256k1.Public_key.t
|
| Secp256k1 of Secp256k1.Public_key.t
|
||||||
|
| P256 of P256.Public_key.t
|
||||||
|
|
||||||
type secret_key =
|
type secret_key =
|
||||||
| Ed25519 of Ed25519.Secret_key.t
|
| Ed25519 of Ed25519.Secret_key.t
|
||||||
| Secp256k1 of Secp256k1.Secret_key.t
|
| Secp256k1 of Secp256k1.Secret_key.t
|
||||||
|
| P256 of P256.Secret_key.t
|
||||||
|
|
||||||
type watermark =
|
type watermark =
|
||||||
| Block_header
|
| Block_header
|
||||||
@ -45,6 +48,7 @@ include S.RAW_DATA with type t := t
|
|||||||
type algo =
|
type algo =
|
||||||
| Ed25519
|
| Ed25519
|
||||||
| Secp256k1
|
| Secp256k1
|
||||||
|
| P256
|
||||||
|
|
||||||
val algo_param: unit -> (algo, 'a) Clic.parameter
|
val algo_param: unit -> (algo, 'a) Clic.parameter
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ depends: [
|
|||||||
"hacl"
|
"hacl"
|
||||||
"zarith"
|
"zarith"
|
||||||
"secp256k1"
|
"secp256k1"
|
||||||
|
"uecc"
|
||||||
"alcotest" { test & >= "0.8.3" }
|
"alcotest" { test & >= "0.8.3" }
|
||||||
]
|
]
|
||||||
build: [
|
build: [
|
||||||
|
@ -41,6 +41,7 @@
|
|||||||
v1/blake2B.mli
|
v1/blake2B.mli
|
||||||
v1/ed25519.mli
|
v1/ed25519.mli
|
||||||
v1/secp256k1.mli
|
v1/secp256k1.mli
|
||||||
|
v1/p256.mli
|
||||||
v1/signature.mli
|
v1/signature.mli
|
||||||
v1/block_hash.mli
|
v1/block_hash.mli
|
||||||
v1/operation_hash.mli
|
v1/operation_hash.mli
|
||||||
|
12
src/lib_protocol_environment/sigs/v1/p256.mli
Normal file
12
src/lib_protocol_environment/sigs/v1/p256.mli
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
(**************************************************************************)
|
||||||
|
(* *)
|
||||||
|
(* Copyright (c) 2014 - 2018. *)
|
||||||
|
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
|
||||||
|
(* *)
|
||||||
|
(* All rights reserved. No warranty, explicit or implicit, provided. *)
|
||||||
|
(* *)
|
||||||
|
(**************************************************************************)
|
||||||
|
|
||||||
|
(** Tezos - P256 cryptography *)
|
||||||
|
|
||||||
|
include S.SIGNATURE with type watermark := MBytes.t
|
@ -10,10 +10,12 @@
|
|||||||
type public_key_hash =
|
type public_key_hash =
|
||||||
| Ed25519 of Ed25519.Public_key_hash.t
|
| Ed25519 of Ed25519.Public_key_hash.t
|
||||||
| Secp256k1 of Secp256k1.Public_key_hash.t
|
| Secp256k1 of Secp256k1.Public_key_hash.t
|
||||||
|
| P256 of P256.Public_key_hash.t
|
||||||
|
|
||||||
type public_key =
|
type public_key =
|
||||||
| Ed25519 of Ed25519.Public_key.t
|
| Ed25519 of Ed25519.Public_key.t
|
||||||
| Secp256k1 of Secp256k1.Public_key.t
|
| Secp256k1 of Secp256k1.Public_key.t
|
||||||
|
| P256 of P256.Public_key.t
|
||||||
|
|
||||||
type watermark =
|
type watermark =
|
||||||
| Block_header
|
| Block_header
|
||||||
|
@ -148,6 +148,9 @@ module Make (Context : CONTEXT) = struct
|
|||||||
and type Secp256k1.Public_key_hash.t = Secp256k1.Public_key_hash.t
|
and type Secp256k1.Public_key_hash.t = Secp256k1.Public_key_hash.t
|
||||||
and type Secp256k1.Public_key.t = Secp256k1.Public_key.t
|
and type Secp256k1.Public_key.t = Secp256k1.Public_key.t
|
||||||
and type Secp256k1.t = Secp256k1.t
|
and type Secp256k1.t = Secp256k1.t
|
||||||
|
and type P256.Public_key_hash.t = P256.Public_key_hash.t
|
||||||
|
and type P256.Public_key.t = P256.Public_key.t
|
||||||
|
and type P256.t = P256.t
|
||||||
and type Signature.public_key_hash = Signature.public_key_hash
|
and type Signature.public_key_hash = Signature.public_key_hash
|
||||||
and type Signature.public_key = Signature.public_key
|
and type Signature.public_key = Signature.public_key
|
||||||
and type Signature.t = Signature.t
|
and type Signature.t = Signature.t
|
||||||
@ -232,6 +235,7 @@ module Make (Context : CONTEXT) = struct
|
|||||||
module Time = Time
|
module Time = Time
|
||||||
module Ed25519 = Ed25519
|
module Ed25519 = Ed25519
|
||||||
module Secp256k1 = Secp256k1
|
module Secp256k1 = Secp256k1
|
||||||
|
module P256 = P256
|
||||||
module Signature = Signature
|
module Signature = Signature
|
||||||
module S = struct
|
module S = struct
|
||||||
module type T = Tezos_base.S.T
|
module type T = Tezos_base.S.T
|
||||||
|
@ -141,6 +141,9 @@ module Make (Context : CONTEXT) : sig
|
|||||||
and type Secp256k1.Public_key_hash.t = Secp256k1.Public_key_hash.t
|
and type Secp256k1.Public_key_hash.t = Secp256k1.Public_key_hash.t
|
||||||
and type Secp256k1.Public_key.t = Secp256k1.Public_key.t
|
and type Secp256k1.Public_key.t = Secp256k1.Public_key.t
|
||||||
and type Secp256k1.t = Secp256k1.t
|
and type Secp256k1.t = Secp256k1.t
|
||||||
|
and type P256.Public_key_hash.t = P256.Public_key_hash.t
|
||||||
|
and type P256.Public_key.t = P256.Public_key.t
|
||||||
|
and type P256.t = P256.t
|
||||||
and type Signature.public_key_hash = Signature.public_key_hash
|
and type Signature.public_key_hash = Signature.public_key_hash
|
||||||
and type Signature.public_key = Signature.public_key
|
and type Signature.public_key = Signature.public_key
|
||||||
and type Signature.t = Signature.t
|
and type Signature.t = Signature.t
|
||||||
|
@ -35,6 +35,7 @@ let of_b58check s =
|
|||||||
match Base58.decode s with
|
match Base58.decode s with
|
||||||
| Some (Ed25519.Public_key_hash.Data h) -> ok (Implicit (Signature.Ed25519 h))
|
| Some (Ed25519.Public_key_hash.Data h) -> ok (Implicit (Signature.Ed25519 h))
|
||||||
| Some (Secp256k1.Public_key_hash.Data h) -> ok (Implicit (Signature.Secp256k1 h))
|
| Some (Secp256k1.Public_key_hash.Data h) -> ok (Implicit (Signature.Secp256k1 h))
|
||||||
|
| Some (P256.Public_key_hash.Data h) -> ok (Implicit (Signature.P256 h))
|
||||||
| Some (Contract_hash.Data h) -> ok (Originated h)
|
| Some (Contract_hash.Data h) -> ok (Originated h)
|
||||||
| _ -> error (Invalid_contract_notation s)
|
| _ -> error (Invalid_contract_notation s)
|
||||||
|
|
||||||
@ -184,6 +185,9 @@ module Index = struct
|
|||||||
Ed25519.Public_key_hash.prefix_path s
|
Ed25519.Public_key_hash.prefix_path s
|
||||||
let pkh_prefix_secp256k1 s =
|
let pkh_prefix_secp256k1 s =
|
||||||
Secp256k1.Public_key_hash.prefix_path s
|
Secp256k1.Public_key_hash.prefix_path s
|
||||||
|
let pkh_prefix_p256 s =
|
||||||
|
P256.Public_key_hash.prefix_path s
|
||||||
|
|
||||||
let rpc_arg = rpc_arg
|
let rpc_arg = rpc_arg
|
||||||
let encoding = encoding
|
let encoding = encoding
|
||||||
let compare = compare
|
let compare = compare
|
||||||
|
@ -65,4 +65,5 @@ module Index : sig
|
|||||||
val contract_prefix: string -> string list
|
val contract_prefix: string -> string list
|
||||||
val pkh_prefix_ed25519: string -> string list
|
val pkh_prefix_ed25519: string -> string list
|
||||||
val pkh_prefix_secp256k1: string -> string list
|
val pkh_prefix_secp256k1: string -> string list
|
||||||
|
val pkh_prefix_p256: string -> string list
|
||||||
end
|
end
|
||||||
|
@ -536,4 +536,15 @@ let () =
|
|||||||
| Contract_repr.Implicit (Secp256k1 pkh) -> pkh
|
| Contract_repr.Implicit (Secp256k1 pkh) -> pkh
|
||||||
| Contract_repr.Implicit _ -> assert false
|
| Contract_repr.Implicit _ -> assert false
|
||||||
| Contract_repr.Originated _ -> assert false)
|
| Contract_repr.Originated _ -> assert false)
|
||||||
|
l) ;
|
||||||
|
Raw_context.register_resolvers
|
||||||
|
P256.Public_key_hash.b58check_encoding
|
||||||
|
(fun ctxt p ->
|
||||||
|
let p = Contract_repr.Index.pkh_prefix_p256 p in
|
||||||
|
Contract.Indexed_context.resolve ctxt p >|= fun l ->
|
||||||
|
List.map
|
||||||
|
(function
|
||||||
|
| Contract_repr.Implicit (P256 pkh) -> pkh
|
||||||
|
| Contract_repr.Implicit _ -> assert false
|
||||||
|
| Contract_repr.Originated _ -> assert false)
|
||||||
l)
|
l)
|
||||||
|
Loading…
Reference in New Issue
Block a user