Skip to content

Commit

Permalink
rename random_seed, remove the hash
Browse files Browse the repository at this point in the history
  • Loading branch information
bchamagne committed Jun 7, 2024
1 parent 4a3d5f6 commit 3353634
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 17 deletions.
20 changes: 12 additions & 8 deletions lib/archethic/crypto.ex
Original file line number Diff line number Diff line change
Expand Up @@ -585,20 +585,24 @@ defmodule Archethic.Crypto do
40, 0, 68, 224, 177, 110, 180, 24>>
```
"""
@spec ec_encrypt(message :: binary(), public_key :: key(), random_seed :: binary() | :undefined) ::
@spec ec_encrypt(
message :: binary(),
public_key :: key(),
ephemeral_entropy_priv_key :: binary() | nil
) ::
binary()
def ec_encrypt(
message,
<<curve_id::8, _::8, public_key::binary>> = _public_key,
random_seed \\ :undefined
ephemeral_entropy_priv_key \\ nil
)
when is_binary(message) do
start_time = System.monotonic_time()

curve = ID.to_curve(curve_id)

{ephemeral_public_key, ephemeral_private_key} =
generate_ephemeral_encryption_keys(curve, random_seed)
generate_ephemeral_encryption_keys(curve, ephemeral_entropy_priv_key)

# Derivate secret using ECDH with the given public key and the ephemeral private key
shared_key =
Expand All @@ -624,14 +628,14 @@ defmodule Archethic.Crypto do
<<ephemeral_public_key::binary, tag::binary, cipher::binary>>
end

defp generate_ephemeral_encryption_keys(:ed25519, random_seed),
do: generate_ephemeral_encryption_keys(:x25519, random_seed)
defp generate_ephemeral_encryption_keys(:ed25519, ephemeral_entropy_priv_key),
do: generate_ephemeral_encryption_keys(:x25519, ephemeral_entropy_priv_key)

defp generate_ephemeral_encryption_keys(curve, :undefined),
defp generate_ephemeral_encryption_keys(curve, nil),
do: :crypto.generate_key(:ecdh, curve)

defp generate_ephemeral_encryption_keys(curve, random_seed),
do: :crypto.generate_key(:ecdh, curve, :crypto.hash(:sha256, random_seed))
defp generate_ephemeral_encryption_keys(curve, ephemeral_entropy_priv_key),
do: :crypto.generate_key(:ecdh, curve, ephemeral_entropy_priv_key)

defp derivate_secrets(dh_key) do
pseudorandom_key = :crypto.hash(:sha256, dh_key)
Expand Down
18 changes: 9 additions & 9 deletions test/archethic/crypto_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@ defmodule CryptoTest do
doctest Crypto

test "giving a seed always result in the same result" do
random_seed = :crypto.strong_rand_bytes(32)
ephemeral_entropy_priv_key = :crypto.strong_rand_bytes(32)
{pub, _} = Crypto.generate_deterministic_keypair("seed", :secp256r1)

assert Crypto.ec_encrypt("msg", pub) != Crypto.ec_encrypt("msg", pub)

assert Crypto.ec_encrypt("msg", pub, random_seed) ==
Crypto.ec_encrypt("msg", pub, random_seed)
assert Crypto.ec_encrypt("msg", pub, ephemeral_entropy_priv_key) ==
Crypto.ec_encrypt("msg", pub, ephemeral_entropy_priv_key)
end

property "symmetric aes encryption and decryption" do
Expand All @@ -45,14 +45,14 @@ defmodule CryptoTest do
end
end

property "symmetric EC encryption and decryption with ECDSA (with fixed random_seed)" do
property "symmetric EC encryption and decryption with ECDSA (with fixed ephemeral_entropy_priv_key)" do
check all(
seed <- StreamData.binary(length: 32),
data <- StreamData.binary(min_length: 1),
random_seed <- StreamData.binary(length: 32)
ephemeral_entropy_priv_key <- StreamData.binary(length: 32)
) do
{pub, pv} = Crypto.generate_deterministic_keypair(seed, :secp256r1)
cipher = Crypto.ec_encrypt(data, pub, random_seed)
cipher = Crypto.ec_encrypt(data, pub, :crypto.hash(:sha256, ephemeral_entropy_priv_key))
is_binary(cipher) and data == Crypto.ec_decrypt!(cipher, pv)
end
end
Expand All @@ -68,14 +68,14 @@ defmodule CryptoTest do
end
end

property "symmetric EC encryption and decryption with Ed25519 (with fixed random_seed)" do
property "symmetric EC encryption and decryption with Ed25519 (with fixed ephemeral_entropy_priv_key)" do
check all(
seed <- StreamData.binary(length: 32),
data <- StreamData.binary(min_length: 1),
random_seed <- StreamData.binary(length: 32)
ephemeral_entropy_priv_key <- StreamData.binary(length: 32)
) do
{pub, pv} = Crypto.generate_deterministic_keypair(seed, :ed25519)
cipher = Crypto.ec_encrypt(data, pub, random_seed)
cipher = Crypto.ec_encrypt(data, pub, :crypto.hash(:sha256, ephemeral_entropy_priv_key))
is_binary(cipher) and data == Crypto.ec_decrypt!(cipher, pv)
end
end
Expand Down

0 comments on commit 3353634

Please sign in to comment.