module Crypto::Sign

Constants

BYTES
PRIMITIVE
PUBLICKEYBYTES
SECRETKEYBYTES
SEEDBYTES

Public Instance Methods

detached(message, secret_key) click to toggle source
# File lib/crypto/sign.rb, line 110
def detached(message, secret_key)
  check_length(secret_key, SECRETKEYBYTES, :SecretKey)

  signature = zeros(BYTES)
  secret_key.readonly if secret_key.is_a?(Sodium::SecretBuffer)
  crypto_sign_detached(signature, nil, message, get_size(message), secret_key)

  signature
ensure
  secret_key.noaccess if secret_key.is_a?(Sodium::SecretBuffer)
end
keypair() click to toggle source
# File lib/crypto/sign.rb, line 36
def keypair
  public_key = zeros(PUBLICKEYBYTES)
  secret_key = zeros(SECRETKEYBYTES)
  crypto_sign_keypair(public_key, secret_key)

  [public_key, secret_key]
end
memory_locked_keypair() click to toggle source
# File lib/crypto/sign.rb, line 57
def memory_locked_keypair
  public_key = zeros(PUBLICKEYBYTES)
  secret_key = Sodium::SecretBuffer.new(SECRETKEYBYTES)
  crypto_sign_keypair(public_key, secret_key)
  secret_key.noaccess

  [public_key, secret_key]
end
memory_locked_seed_keypair(seed) click to toggle source
# File lib/crypto/sign.rb, line 66
def memory_locked_seed_keypair(seed)
  check_length(seed, SEEDBYTES, :Seed)

  public_key = zeros(PUBLICKEYBYTES)
  secret_key = Sodium::SecretBuffer.new(SECRETKEYBYTES)
  seed.readonly if seed.is_a?(Sodium::SecretBuffer)
  crypto_sign_seed_keypair(public_key, secret_key, seed)
  secret_key.noaccess

  [public_key, secret_key]
ensure
  seed.noaccess if seed.is_a?(Sodium::SecretBuffer)
end
open(sealed_message, public_key, encoding = nil) click to toggle source
# File lib/crypto/sign.rb, line 93
def open(sealed_message, public_key, encoding = nil)
  sealed_message_len = get_size(sealed_message)
  check_length(public_key, PUBLICKEYBYTES, :PublicKey)

  unsealed_message = zeros(sealed_message_len - BYTES)
  unsealed_message_len = FFI::MemoryPointer.new(:ulong_long)
  if crypto_sign_open(unsealed_message, unsealed_message_len, sealed_message, sealed_message_len, public_key) == -1
    raise Sodium::CryptoError, "Incorrect signature", caller
  end

  if encoding
    unsealed_message.force_encoding(encoding)
  end

  unsealed_message
end
seed_keypair(seed) click to toggle source
# File lib/crypto/sign.rb, line 44
def seed_keypair(seed)
  check_length(seed, SEEDBYTES, :Seed)

  public_key = zeros(PUBLICKEYBYTES)
  secret_key = zeros(SECRETKEYBYTES)
  seed.readonly if seed.is_a?(Sodium::SecretBuffer)
  crypto_sign_seed_keypair(public_key, secret_key, seed)

  [public_key, secret_key]
ensure
  seed.noaccess if seed.is_a?(Sodium::SecretBuffer)
end
sign(message, secret_key) click to toggle source
# File lib/crypto/sign.rb, line 80
def sign(message, secret_key)
  message_len = get_size(message)
  check_length(secret_key, SECRETKEYBYTES, :SecretKey)

  sealed_message = zeros(message_len + BYTES)
  secret_key.readonly if secret_key.is_a?(Sodium::SecretBuffer)
  crypto_sign(sealed_message, nil, message, message_len, secret_key)

  sealed_message
ensure
  secret_key.noaccess if secret_key.is_a?(Sodium::SecretBuffer)
end
verify_detached(signature, message, public_key) click to toggle source
# File lib/crypto/sign.rb, line 122
def verify_detached(signature, message, public_key)
  check_length(signature, BYTES, :Signature)

  crypto_sign_verify_detached(signature, message, get_size(message), public_key) == 0
end