Module: Crypto::Sign

Extended by:
FFI::Library, Sodium::Utils
Defined in:
lib/crypto/sign.rb,
lib/crypto/sign/ed25519.rb

Defined Under Namespace

Modules: Ed25519

Constant Summary collapse

PRIMITIVE =
primitive.freeze
BYTES =
bytes.freeze
SEEDBYTES =
seedbytes.freeze
PUBLICKEYBYTES =
publickeybytes.freeze
SECRETKEYBYTES =
secretkeybytes.freeze

Constants included from Sodium::Utils

Sodium::Utils::HEXY, Sodium::Utils::ZERO

Class Method Summary collapse

Methods included from Sodium::Utils

bin2hex, check_length, get_size, hex2bin, zeros

Class Method Details

.detached(message, secret_key) ⇒ Object



110
111
112
113
114
115
116
117
118
119
120
# 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

.keypairObject



36
37
38
39
40
41
42
# 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_keypairObject



57
58
59
60
61
62
63
64
# 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) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
78
# 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) ⇒ Object



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# 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) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
# 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) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
# 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) ⇒ Object



122
123
124
125
126
# 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