Base58: encode secret keys as seed

This commit is contained in:
Vincent Bernardoff 2018-01-08 17:21:29 +01:00 committed by Grégoire
parent d9405292a4
commit e6f773f697
7 changed files with 72 additions and 47 deletions

View File

@ -161,25 +161,25 @@ log_endorser() {
BOOTSTRAP1_IDENTITY="tz1KqTpEZ7Yob7QbPE4Hy4Wo8fHG8LhKxZSx" BOOTSTRAP1_IDENTITY="tz1KqTpEZ7Yob7QbPE4Hy4Wo8fHG8LhKxZSx"
BOOTSTRAP1_PUBLIC="edpkuBknW28nW72KG6RoHtYW7p12T6GKc7nAbwYX5m8Wd9sDVC9yav" BOOTSTRAP1_PUBLIC="edpkuBknW28nW72KG6RoHtYW7p12T6GKc7nAbwYX5m8Wd9sDVC9yav"
BOOTSTRAP1_SECRET="edskRuR1azSfboG86YPTyxrQgosh5zChf5bVDmptqLTb5EuXAm9rsnDYfTKhq7rDQujdn5WWzwUMeV3agaZ6J2vPQT58jJAJPi" BOOTSTRAP1_SECRET="edsk3gUfUPyBSfrS9CCgmCiQsTCHGkviBDusMxDJstFtojtc1zcpsh"
BOOTSTRAP2_IDENTITY="tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN" BOOTSTRAP2_IDENTITY="tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN"
BOOTSTRAP2_PUBLIC="edpktzNbDAUjUk697W7gYg2CRuBQjyPxbEg8dLccYYwKSKvkPvjtV9" BOOTSTRAP2_PUBLIC="edpktzNbDAUjUk697W7gYg2CRuBQjyPxbEg8dLccYYwKSKvkPvjtV9"
BOOTSTRAP2_SECRET="edskRkJz4Rw2rM5NtabEWMbbg2bF4b1nfFajaqEuEk4SgU7eeDbym9gVQtBTbYo32WUg2zb5sNBkD1whRN7zX43V9bftBbtaKc" BOOTSTRAP2_SECRET="edsk39qAm1fiMjgmPkw1EgQYkMzkJezLNewd7PLNHTkr6w9XA2zdfo"
BOOTSTRAP3_IDENTITY="tz1faswCTDciRzE4oJ9jn2Vm2dvjeyA9fUzU" BOOTSTRAP3_IDENTITY="tz1faswCTDciRzE4oJ9jn2Vm2dvjeyA9fUzU"
BOOTSTRAP3_PUBLIC="edpkuTXkJDGcFd5nh6VvMz8phXxU3Bi7h6hqgywNFi1vZTfQNnS1RV" BOOTSTRAP3_PUBLIC="edpkuTXkJDGcFd5nh6VvMz8phXxU3Bi7h6hqgywNFi1vZTfQNnS1RV"
BOOTSTRAP3_SECRET="edskS3qsqsNgdjUqeMsVcEwBn8dkZ5iDRz6aF21KhcCtRiAkWBypUSbicccR4Vgqm9UdW2Vabuos6seezqgbXTrmcbLUG4rdAC" BOOTSTRAP3_SECRET="edsk4ArLQgBTLWG5FJmnGnT689VKoqhXwmDPBuGx3z4cvwU9MmrPZZ"
BOOTSTRAP4_IDENTITY="tz1b7tUupMgCNw2cCLpKTkSD1NZzB5TkP2sv" BOOTSTRAP4_IDENTITY="tz1b7tUupMgCNw2cCLpKTkSD1NZzB5TkP2sv"
BOOTSTRAP4_PUBLIC="edpkuFrRoDSEbJYgxRtLx2ps82UdaYc1WwfS9sE11yhauZt5DgCHbU" BOOTSTRAP4_PUBLIC="edpkuFrRoDSEbJYgxRtLx2ps82UdaYc1WwfS9sE11yhauZt5DgCHbU"
BOOTSTRAP4_SECRET="edskRg9qcPqaVQa6jXWNMU5p71tseSuR7NzozgqZ9URsVDi81wTyPJdFSBdeakobyHUi4Xgu61jgKRQvkhXrPmEdEUfiqfiJFL" BOOTSTRAP4_SECRET="edsk2uqQB9AY4FvioK2YMdfmyMrer5R8mGFyuaLLFfSRo8EoyNdht3"
BOOTSTRAP5_IDENTITY="tz1ddb9NMYHZi5UzPdzTZMYQQZoMub195zgv" BOOTSTRAP5_IDENTITY="tz1ddb9NMYHZi5UzPdzTZMYQQZoMub195zgv"
BOOTSTRAP5_PUBLIC="edpkv8EUUH68jmo3f7Um5PezmfGrRF24gnfLpH3sVNwJnV5bVCxL2n" BOOTSTRAP5_PUBLIC="edpkv8EUUH68jmo3f7Um5PezmfGrRF24gnfLpH3sVNwJnV5bVCxL2n"
BOOTSTRAP5_SECRET="edskS7rLN2Df3nbS1EYvwJbWo4umD7yPM1SUeX7gp1WhCVpMFXjcCyM58xs6xsnTsVqHQmJQ2RxoAjJGedWfvFmjQy6etA3dgZ" BOOTSTRAP5_SECRET="edsk4QLrcijEffxV31gGdN2HU7UpyJjA8drFoNcmnB28n89YjPNRFm"
DICTATOR_SECRET="edskRhxswacLW6jF6ULavDdzwqnKJVS4UcDTNiCyiH6H8ZNnn2pmNviL7pRNz9kRxxaWQFzEQEcZExGHKbwmuaAcoMegj5T99z" DICTATOR_SECRET="edsk31vznjHSSpGExDMHYASz45VZqXN4DPxvsa4hAyY8dHM28cZzp6"
add_sandboxed_bootstrap_identities() { add_sandboxed_bootstrap_identities() {

View File

@ -160,11 +160,11 @@ module MakeEncodings(E: sig
let encodings = ref E.encodings let encodings = ref E.encodings
let check_ambiguous_prefix prefix encodings = let check_ambiguous_prefix prefix length encodings =
List.iter List.iter
(fun (Encoding { encoded_prefix = s ; _ }) -> (fun (Encoding { encoded_prefix = s ; length = l ; _ }) ->
if TzString.remove_prefix ~prefix:s prefix <> None || if length = l && (TzString.remove_prefix ~prefix:s prefix <> None ||
TzString.remove_prefix ~prefix s <> None then TzString.remove_prefix ~prefix s <> None) then
Format.ksprintf invalid_arg Format.ksprintf invalid_arg
"Base58.register_encoding: duplicate prefix: %S, %S." s prefix) "Base58.register_encoding: duplicate prefix: %S, %S." s prefix)
encodings encodings
@ -191,7 +191,7 @@ module MakeEncodings(E: sig
let s = to_raw x in assert (String.length s = length) ; s in let s = to_raw x in assert (String.length s = length) ; s in
let of_raw s = assert (String.length s = length) ; of_raw s in let of_raw s = assert (String.length s = length) ; of_raw s in
let encoded_prefix, encoded_length = make_encoded_prefix prefix length in let encoded_prefix, encoded_length = make_encoded_prefix prefix length in
check_ambiguous_prefix encoded_prefix !encodings ; check_ambiguous_prefix encoded_prefix encoded_length !encodings ;
let encoding = let encoding =
{ prefix ; length ; encoded_prefix ; encoded_length ; { prefix ; length ; encoded_prefix ; encoded_length ;
to_raw ; of_raw ; wrap } in to_raw ; of_raw ; wrap } in
@ -311,6 +311,7 @@ module Prefix = struct
let cryptobox_public_key_hash = "\153\103" (* id(30) *) let cryptobox_public_key_hash = "\153\103" (* id(30) *)
(* 32 *) (* 32 *)
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) *)
(* 64 *) (* 64 *)

View File

@ -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 cryptobox_public_key_hash: string val cryptobox_public_key_hash: string
val ed25519_seed: string
val ed25519_public_key: string val ed25519_public_key: string
val ed25519_secret_key: string val ed25519_secret_key: string
val ed25519_signature: string val ed25519_signature: string

View File

@ -122,31 +122,55 @@ module Secret_key = struct
type Base58.data += type Base58.data +=
| Secret_key of t | Secret_key of t
let b58check_encoding = let seed_encoding =
Base58.register_encoding Base58.register_encoding
~prefix: Base58.Prefix.ed25519_secret_key ~prefix: Base58.Prefix.ed25519_seed
~length:Sodium.Sign.secret_key_size ~length:Sodium.Sign.seed_size
~to_raw:(fun x -> Bytes.to_string (Sodium.Sign.Bytes.of_secret_key x)) ~to_raw:(fun x -> Sodium.Sign.secret_key_to_seed x |>
Sodium.Sign.Bytes.of_seed |>
Bytes.unsafe_to_string)
~of_raw:(fun x -> ~of_raw:(fun x ->
try Some (Sodium.Sign.Bytes.to_secret_key (Bytes.of_string x)) try Some (Bytes.unsafe_of_string x |>
Sodium.Sign.Bytes.to_seed |>
Sodium.Sign.seed_keypair |>
fst)
with _ -> None) with _ -> None)
~wrap:(fun x -> Secret_key x) ~wrap:(fun x -> Secret_key x)
let of_b58check_opt s = Base58.simple_decode b58check_encoding s let secret_key_encoding =
Base58.register_encoding
~prefix: Base58.Prefix.ed25519_secret_key
~length:Sodium.Sign.secret_key_size
~to_raw:(fun x -> Sodium.Sign.Bytes.of_secret_key x |>
Bytes.unsafe_to_string)
~of_raw:(fun x ->
try Some (Bytes.unsafe_of_string x |>
Sodium.Sign.Bytes.to_secret_key)
with _ -> None)
~wrap:(fun x -> Secret_key x)
let of_b58check_opt s =
match Base58.simple_decode seed_encoding s with
| Some x -> Some x
| None -> Base58.simple_decode secret_key_encoding s
let of_b58check_exn s = let of_b58check_exn s =
match Base58.simple_decode b58check_encoding s with match of_b58check_opt s with
| Some x -> x | Some x -> x
| None -> Pervasives.failwith "Unexpected hash (ed25519 secret key)" | None -> Pervasives.failwith "Unexpected hash (ed25519 secret key)"
let of_b58check s = let of_b58check s =
match Base58.simple_decode b58check_encoding s with match of_b58check_opt s with
| Some x -> Ok x | Some x -> Ok x
| None -> generic_error "Unexpected hash (ed25519 secret key)" | None -> generic_error "Unexpected hash (ed25519 secret key)"
let to_b58check s = Base58.simple_encode b58check_encoding s let to_b58check s = Base58.simple_encode seed_encoding s
let of_bytes_opt s = let of_bytes_opt s =
match Sodium.Sign.Bigbytes.to_seed s with match Sodium.Sign.Bigbytes.to_seed s with
| exception _ -> None
| seed -> Some (seed |> Sodium.Sign.seed_keypair |> fst) | seed -> Some (seed |> Sodium.Sign.seed_keypair |> fst)
| exception _ ->
match Sodium.Sign.Bigbytes.to_secret_key s with
| exception _ -> None
| sk -> Some sk
let of_bytes s = let of_bytes s =
match of_bytes_opt s with match of_bytes_opt s with
@ -167,7 +191,8 @@ module Secret_key = struct
Cli_entries.(param ~name ~desc (parameter (fun _ str -> Lwt.return (of_b58check str))) t) Cli_entries.(param ~name ~desc (parameter (fun _ str -> Lwt.return (of_b58check str))) t)
let () = let () =
Base58.check_encoded_prefix b58check_encoding "edsk" 98 Base58.check_encoded_prefix seed_encoding "edsk" 54 ;
Base58.check_encoded_prefix secret_key_encoding "edsk" 98
let encoding = let encoding =
let open Data_encoding in let open Data_encoding in
@ -176,18 +201,23 @@ module Secret_key = struct
(describe (describe
~title: "An Ed25519 secret key (Base58Check encoded)" @@ ~title: "An Ed25519 secret key (Base58Check encoded)" @@
conv conv
(fun s -> Base58.simple_encode b58check_encoding s) (fun s -> Base58.simple_encode seed_encoding s)
(fun s -> (fun s ->
match Base58.simple_decode b58check_encoding s with match of_b58check_opt s with
| Some x -> x | Some x -> x
| None -> Data_encoding.Json.cannot_destruct | None -> Data_encoding.Json.cannot_destruct
"Ed25519 secret key: unexpected prefix.") "Ed25519 secret key: unexpected prefix.")
string) string)
~binary: ~binary:
(conv (conv
Sodium.Sign.Bigbytes.of_secret_key (fun sk -> Sodium.Sign.secret_key_to_seed sk |>
Sodium.Sign.Bigbytes.to_secret_key Sodium.Sign.Bigbytes.of_seed)
(Fixed.bytes Sodium.Sign.secret_key_size)) (fun bytes ->
if MBytes.length bytes = Sodium.Sign.seed_size
then Sodium.Sign.Bigbytes.to_seed bytes |>
Sodium.Sign.seed_keypair |> fst
else Sodium.Sign.Bigbytes.to_secret_key bytes)
(dynamic_size (Variable.bytes)))
end end

View File

@ -35,8 +35,7 @@ end
let dictator_sk = let dictator_sk =
Ed25519.Secret_key.of_b58check_exn Ed25519.Secret_key.of_b58check_exn
"edskRhxswacLW6jF6ULavDdzwqnKJVS4UcDTNiCyiH6H8ZNnn2pmNviL7\ "edsk31vznjHSSpGExDMHYASz45VZqXN4DPxvsa4hAyY8dHM28cZzp6"
pRNz9kRxxaWQFzEQEcZExGHKbwmuaAcoMegj5T99z"
let activate_alpha () = let activate_alpha () =
let fitness = Fitness_repr.from_int64 0L in let fitness = Fitness_repr.from_int64 0L in
@ -155,24 +154,19 @@ module Account = struct
"edpkv8EUUH68jmo3f7Um5PezmfGrRF24gnfLpH3sVNwJnV5bVCxL2n" in "edpkv8EUUH68jmo3f7Um5PezmfGrRF24gnfLpH3sVNwJnV5bVCxL2n" in
let bootstrap1_sk = let bootstrap1_sk =
Ed25519.Secret_key.of_b58check_exn Ed25519.Secret_key.of_b58check_exn
"edskRuR1azSfboG86YPTyxrQgosh5zChf5bVDmptqLTb5EuXAm9\ "edsk3gUfUPyBSfrS9CCgmCiQsTCHGkviBDusMxDJstFtojtc1zcpsh" in
rsnDYfTKhq7rDQujdn5WWzwUMeV3agaZ6J2vPQT58jJAJPi" in
let bootstrap2_sk = let bootstrap2_sk =
Ed25519.Secret_key.of_b58check_exn Ed25519.Secret_key.of_b58check_exn
"edskRkJz4Rw2rM5NtabEWMbbg2bF4b1nfFajaqEuEk4SgU7eeDby\ "edsk39qAm1fiMjgmPkw1EgQYkMzkJezLNewd7PLNHTkr6w9XA2zdfo" in
m9gVQtBTbYo32WUg2zb5sNBkD1whRN7zX43V9bftBbtaKc" in
let bootstrap3_sk = let bootstrap3_sk =
Ed25519.Secret_key.of_b58check_exn Ed25519.Secret_key.of_b58check_exn
"edskS3qsqsNgdjUqeMsVcEwBn8dkZ5iDRz6aF21KhcCtRiAkWByp\ "edsk4ArLQgBTLWG5FJmnGnT689VKoqhXwmDPBuGx3z4cvwU9MmrPZZ" in
USbicccR4Vgqm9UdW2Vabuos6seezqgbXTrmcbLUG4rdAC" in
let bootstrap4_sk = let bootstrap4_sk =
Ed25519.Secret_key.of_b58check_exn Ed25519.Secret_key.of_b58check_exn
"edskRg9qcPqaVQa6jXWNMU5p71tseSuR7NzozgqZ9URsVDi81wTyP\ "edsk2uqQB9AY4FvioK2YMdfmyMrer5R8mGFyuaLLFfSRo8EoyNdht3" in
JdFSBdeakobyHUi4Xgu61jgKRQvkhXrPmEdEUfiqfiJFL" in
let bootstrap5_sk = let bootstrap5_sk =
Ed25519.Secret_key.of_b58check_exn Ed25519.Secret_key.of_b58check_exn
"edskS7rLN2Df3nbS1EYvwJbWo4umD7yPM1SUeX7gp1WhCVpMFXjcC\ "edsk4QLrcijEffxV31gGdN2HU7UpyJjA8drFoNcmnB28n89YjPNRFm" in
yM58xs6xsnTsVqHQmJQ2RxoAjJGedWfvFmjQy6etA3dgZ" in
let cpt = ref 0 in let cpt = ref 0 in
match List.map begin fun (pk, sk) -> match List.map begin fun (pk, sk) ->
incr cpt ; incr cpt ;

View File

@ -46,8 +46,7 @@ let test_invalid_signature block =
"edpkv8EUUH68jmo3f7Um5PezmfGrRF24gnfLpH3sVNwJnV5bVCxL2n" in "edpkv8EUUH68jmo3f7Um5PezmfGrRF24gnfLpH3sVNwJnV5bVCxL2n" in
let secret_key = let secret_key =
Environment.Ed25519.Secret_key.of_b58check_exn Environment.Ed25519.Secret_key.of_b58check_exn
"edskRuR1azSfboG86YPTyxrQgosh5zChf5bVDmptqLTb5EuXAm9rsn\ "edsk3gUfUPyBSfrS9CCgmCiQsTCHGkviBDusMxDJstFtojtc1zcpsh" in
DYfTKhq7rDQujdn5WWzwUMeV3agaZ6J2vPQT58jJAJPi" in
let account = let account =
Helpers.Account.create ~keys:(secret_key, public_key) "WRONG SIGNATURE" in Helpers.Account.create ~keys:(secret_key, public_key) "WRONG SIGNATURE" in
Helpers.Baking.bake block account [] >>= fun res -> Helpers.Baking.bake block account [] >>= fun res ->

View File

@ -81,7 +81,7 @@ activate_alpha() {
protocol ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK \ protocol ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK \
with fitness 1 \ with fitness 1 \
and passes 1 \ and passes 1 \
and key edskRhxswacLW6jF6ULavDdzwqnKJVS4UcDTNiCyiH6H8ZNnn2pmNviL7pRNz9kRxxaWQFzEQEcZExGHKbwmuaAcoMegj5T99z \ and key edsk31vznjHSSpGExDMHYASz45VZqXN4DPxvsa4hAyY8dHM28cZzp6 \
> /dev/stderr > /dev/stderr
} }
@ -198,19 +198,19 @@ assert_fails() {
BOOTSTRAP1_IDENTITY=tz1KqTpEZ7Yob7QbPE4Hy4Wo8fHG8LhKxZSx BOOTSTRAP1_IDENTITY=tz1KqTpEZ7Yob7QbPE4Hy4Wo8fHG8LhKxZSx
BOOTSTRAP1_PUBLIC=edpkuBknW28nW72KG6RoHtYW7p12T6GKc7nAbwYX5m8Wd9sDVC9yav BOOTSTRAP1_PUBLIC=edpkuBknW28nW72KG6RoHtYW7p12T6GKc7nAbwYX5m8Wd9sDVC9yav
BOOTSTRAP1_SECRET=edskRuR1azSfboG86YPTyxrQgosh5zChf5bVDmptqLTb5EuXAm9rsnDYfTKhq7rDQujdn5WWzwUMeV3agaZ6J2vPQT58jJAJPi BOOTSTRAP1_SECRET=edsk3gUfUPyBSfrS9CCgmCiQsTCHGkviBDusMxDJstFtojtc1zcpsh
BOOTSTRAP2_IDENTITY=tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN BOOTSTRAP2_IDENTITY=tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN
BOOTSTRAP2_PUBLIC=edpktzNbDAUjUk697W7gYg2CRuBQjyPxbEg8dLccYYwKSKvkPvjtV9 BOOTSTRAP2_PUBLIC=edpktzNbDAUjUk697W7gYg2CRuBQjyPxbEg8dLccYYwKSKvkPvjtV9
BOOTSTRAP2_SECRET=edskRkJz4Rw2rM5NtabEWMbbg2bF4b1nfFajaqEuEk4SgU7eeDbym9gVQtBTbYo32WUg2zb5sNBkD1whRN7zX43V9bftBbtaKc BOOTSTRAP2_SECRET=edsk39qAm1fiMjgmPkw1EgQYkMzkJezLNewd7PLNHTkr6w9XA2zdfo
BOOTSTRAP3_IDENTITY=tz1faswCTDciRzE4oJ9jn2Vm2dvjeyA9fUzU BOOTSTRAP3_IDENTITY=tz1faswCTDciRzE4oJ9jn2Vm2dvjeyA9fUzU
BOOTSTRAP3_PUBLIC=edpkuTXkJDGcFd5nh6VvMz8phXxU3Bi7h6hqgywNFi1vZTfQNnS1RV BOOTSTRAP3_PUBLIC=edpkuTXkJDGcFd5nh6VvMz8phXxU3Bi7h6hqgywNFi1vZTfQNnS1RV
BOOTSTRAP3_SECRET=edskS3qsqsNgdjUqeMsVcEwBn8dkZ5iDRz6aF21KhcCtRiAkWBypUSbicccR4Vgqm9UdW2Vabuos6seezqgbXTrmcbLUG4rdAC BOOTSTRAP3_SECRET=edsk4ArLQgBTLWG5FJmnGnT689VKoqhXwmDPBuGx3z4cvwU9MmrPZZ
BOOTSTRAP4_IDENTITY=tz1b7tUupMgCNw2cCLpKTkSD1NZzB5TkP2sv BOOTSTRAP4_IDENTITY=tz1b7tUupMgCNw2cCLpKTkSD1NZzB5TkP2sv
BOOTSTRAP4_PUBLIC=edpkuFrRoDSEbJYgxRtLx2ps82UdaYc1WwfS9sE11yhauZt5DgCHbU BOOTSTRAP4_PUBLIC=edpkuFrRoDSEbJYgxRtLx2ps82UdaYc1WwfS9sE11yhauZt5DgCHbU
BOOTSTRAP4_SECRET=edskRg9qcPqaVQa6jXWNMU5p71tseSuR7NzozgqZ9URsVDi81wTyPJdFSBdeakobyHUi4Xgu61jgKRQvkhXrPmEdEUfiqfiJFL BOOTSTRAP4_SECRET=edsk2uqQB9AY4FvioK2YMdfmyMrer5R8mGFyuaLLFfSRo8EoyNdht3
BOOTSTRAP5_IDENTITY=tz1ddb9NMYHZi5UzPdzTZMYQQZoMub195zgv BOOTSTRAP5_IDENTITY=tz1ddb9NMYHZi5UzPdzTZMYQQZoMub195zgv
BOOTSTRAP5_PUBLIC=edpkv8EUUH68jmo3f7Um5PezmfGrRF24gnfLpH3sVNwJnV5bVCxL2n BOOTSTRAP5_PUBLIC=edpkv8EUUH68jmo3f7Um5PezmfGrRF24gnfLpH3sVNwJnV5bVCxL2n
BOOTSTRAP5_SECRET=edskS7rLN2Df3nbS1EYvwJbWo4umD7yPM1SUeX7gp1WhCVpMFXjcCyM58xs6xsnTsVqHQmJQ2RxoAjJGedWfvFmjQy6etA3dgZ BOOTSTRAP5_SECRET=edsk4QLrcijEffxV31gGdN2HU7UpyJjA8drFoNcmnB28n89YjPNRFm
KEY1=foo KEY1=foo
KEY2=bar KEY2=bar