Class: Minisign::KeyPair

Inherits:
Object
  • Object
show all
Includes:
Utils
Defined in:
lib/minisign/key_pair.rb

Overview

Generate a Minisign secret and public key

Instance Method Summary collapse

Methods included from Utils

#blake2b256, #blake2b512, #derive_key, #xor

Constructor Details

#initialize(password = nil) ⇒ KeyPair

Create a new key pair

Examples:

Minisign::KeyPair.new("53cr3t P4s5w0rd")

Parameters:

  • password (String) (defaults to: nil)

    The password used to encrypt the private key



12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/minisign/key_pair.rb', line 12

def initialize(password = nil)
  @password = password
  @key_id = SecureRandom.bytes(8)
  @signing_key = Ed25519::SigningKey.generate

  @checksum = blake2b256("Ed#{key_data}")
  @keynum_sk = "#{key_data}#{@checksum}"

  @kdf_salt = SecureRandom.bytes(32)
  @keynum_sk = xor(kdf_output, @keynum_sk.bytes).pack('C*') if @password
  @kdf_algorithm = password.nil? ? [0, 0].pack('U*') : 'Sc'
end

Instance Method Details

#private_keyMinisign::PrivateKey



26
27
28
29
30
31
32
33
34
# File 'lib/minisign/key_pair.rb', line 26

def private_key
  @kdf_opslimit = kdf_opslimit_bytes.pack('C*')
  @kdf_memlimit = kdf_memlimit_bytes.pack('C*')
  data = "Ed#{@kdf_algorithm}B2#{@kdf_salt}#{@kdf_opslimit}#{@kdf_memlimit}#{@keynum_sk}"
  Minisign::PrivateKey.new(
    "untrusted comment: minisign secret key\n#{Base64.strict_encode64(data)}",
    @password
  )
end

#public_keyMinisign::PublicKey

Returns:



37
38
39
40
# File 'lib/minisign/key_pair.rb', line 37

def public_key
  data = Base64.strict_encode64("Ed#{@key_id}#{@signing_key.verify_key.to_bytes}")
  Minisign::PublicKey.new(data)
end