diff --git a/spec/sodium/sign/secret_key_spec.cr b/spec/sodium/sign/secret_key_spec.cr index 4af7cf6..563b3a3 100644 --- a/spec/sodium/sign/secret_key_spec.cr +++ b/spec/sodium/sign/secret_key_spec.cr @@ -49,7 +49,7 @@ describe Sodium::Sign::SecretKey do it "seed keys" do seed = Bytes.new Sodium::Sign::SecretKey::SEED_SIZE key1 = Sodium::Sign::SecretKey.new seed: seed - key2 = Sodium::Sign::SecretKey.new seed: seed + key2 = Sodium::Sign::SecretKey.new seed: Sodium::Sign::SecretKey.new(key1.to_slice).seed key1.to_slice.should eq key2.to_slice key1.public_key.to_slice.should eq key2.public_key.to_slice key1.seed.should eq seed diff --git a/src/sodium/sign/secret_key.cr b/src/sodium/sign/secret_key.cr index 0891218..be33f8d 100644 --- a/src/sodium/sign/secret_key.cr +++ b/src/sodium/sign/secret_key.cr @@ -23,8 +23,6 @@ module Sodium # Returns key delegate_to_slice to: @sbuf - @seed : SecureBuffer? - # Generates a new random secret/public key pair. def initialize @sbuf = SecureBuffer.new KEY_SIZE @@ -70,9 +68,12 @@ module Sodium end end - def seed - # BUG: Generate seed if not set. - @seed.not_nil!.to_slice + getter seed : SecureBuffer? do + SecureBuffer.new(SEED_SIZE).tap do |s| + if LibSodium.crypto_sign_ed25519_sk_to_seed(s.to_slice, self.to_slice) != 0 + raise Sodium::Error.new("crypto_sign_ed25519_sk_to_seed") + end + end.readonly end # Signs message and returns a detached signature.