Skip to content

Commit 9285a71

Browse files
artemd24Art
and
Art
authored
refactor: make pubkey optional for decoded_json in keystore in decode_str! function (#1104)
Co-authored-by: Art <[email protected]>
1 parent ce09e95 commit 9285a71

File tree

2 files changed

+38
-2
lines changed

2 files changed

+38
-2
lines changed

lib/keystore.ex

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,14 @@ defmodule Keystore do
2424

2525
privkey = decrypt!(decoded_json["crypto"], password)
2626

27-
pubkey = Map.fetch!(decoded_json, "pubkey") |> parse_binary!()
28-
2927
{:ok, derived_pubkey} = Bls.derive_pubkey(privkey)
3028

29+
pubkey =
30+
case Map.has_key?(decoded_json, "pubkey") do
31+
true -> Map.get(decoded_json, "pubkey") |> parse_binary!()
32+
false -> derived_pubkey
33+
end
34+
3135
if derived_pubkey != pubkey do
3236
raise("Keystore secret and public keys don't form a valid pair")
3337
end

test/unit/keystore_test.exs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,36 @@ defmodule Unit.KeystoreTest do
9292
{:ok, signature} = Bls.sign(privkey, digest)
9393
assert Bls.valid?(pubkey, digest, signature)
9494
end
95+
96+
test "eip scrypt without pubkey test vector" do
97+
scrypt_json =
98+
Jason.decode!(@pbkdf2_json)
99+
|> Map.delete("pubkey")
100+
|> Jason.encode!()
101+
102+
{pubkey, privkey} = Keystore.decode_str!(scrypt_json, @eip_password)
103+
104+
assert privkey == @eip_secret
105+
assert pubkey == @pubkey
106+
107+
digest = :crypto.hash(:sha256, "test message")
108+
{:ok, signature} = Bls.sign(privkey, digest)
109+
assert Bls.valid?(pubkey, digest, signature)
110+
end
111+
112+
test "eip pbkdf2 without pubkey test vector" do
113+
pbkdf2_json =
114+
Jason.decode!(@pbkdf2_json)
115+
|> Map.delete("pubkey")
116+
|> Jason.encode!()
117+
118+
{pubkey, privkey} = Keystore.decode_str!(pbkdf2_json, @eip_password)
119+
120+
assert privkey == @eip_secret
121+
assert pubkey == @pubkey
122+
123+
digest = :crypto.hash(:sha256, "test message")
124+
{:ok, signature} = Bls.sign(privkey, digest)
125+
assert Bls.valid?(pubkey, digest, signature)
126+
end
95127
end

0 commit comments

Comments
 (0)