Class: XStream::X25519HKDF::Encryptor

Inherits:
Miscreant::STREAM::Encryptor
  • Object
show all
Defined in:
lib/xstream/x25519hkdf.rb

Overview

XSTREAM encryptor with X25519+HKDF key derivation

Class Method Summary collapse

Class Method Details

.generate(public_key, encryption_alg: "AES-PMAC-SIV", digest_alg: "SHA-256", salt: nil, csrng: SecureRandom) ⇒ Array(XStream::X25519HKDF, String)

Generate an XSTREAM encryptor object with a random ephemeral key

Parameters:

  • public_key (String)

    32-byte X25519 public key (i.e. compressed Montgomery-u coordinate)

  • encryption_alg (String) (defaults to: "AES-PMAC-SIV")

    symmetric encryption algorithm to use with STREAM (default '"AES-PMAC-SIV"`)

  • digest_alg (String) (defaults to: "SHA-256")

    digest algorithm to use with HKDF (default '"SHA256"`)

  • salt (String) (defaults to: nil)

    (optional) salt value to pass to HKDF

  • csrng (#random_bytes) (defaults to: SecureRandom)

    secure RNG to use to derive ephemeral X25519 key (default 'SecureRandom`)

Returns:



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/xstream/x25519hkdf.rb', line 24

def self.generate(
  public_key,
  encryption_alg: "AES-PMAC-SIV",
  digest_alg: "SHA-256",
  salt: nil,
  csrng: SecureRandom
)
  ephemeral_scalar = csrng.random_bytes(::X25519::KEY_SIZE)
  ephemeral_public = ::X25519.calculate_public_key(ephemeral_scalar)

  symmetric_key = X25519HKDF.kdf(
    ephemeral_scalar,
    public_key,
    salt: salt,
    digest_alg: digest_alg,
    output_size: SYMMETRIC_KEY_SIZE
  )

  stream = new(encryption_alg, symmetric_key, XStream::NONCE)
  [stream, ephemeral_public]
end