Module: PQCrypto::KEM

Defined in:
lib/pq_crypto/kem.rb

Defined Under Namespace

Classes: EncapsulationResult, Keypair, PublicKey, SecretKey

Constant Summary collapse

CANONICAL_ALGORITHM =
:ml_kem_768
DETAILS =
AlgorithmRegistry.details_for_family(:ml_kem).freeze
NATIVE_DISPATCH =
{
  ml_kem_512: {
    keypair: :native_ml_kem_512_keypair,
    keypair_from_seed: :native_ml_kem_512_keypair_from_seed,
    encapsulate: :native_ml_kem_512_encapsulate,
    decapsulate: :native_ml_kem_512_decapsulate,
  }.freeze,
  ml_kem_768: {
    keypair: :native_ml_kem_keypair,
    keypair_from_seed: :native_ml_kem_keypair_from_seed,
    encapsulate: :native_ml_kem_encapsulate,
    decapsulate: :native_ml_kem_decapsulate,
  }.freeze,
  ml_kem_1024: {
    keypair: :native_ml_kem_1024_keypair,
    keypair_from_seed: :native_ml_kem_1024_keypair_from_seed,
    encapsulate: :native_ml_kem_1024_encapsulate,
    decapsulate: :native_ml_kem_1024_decapsulate,
  }.freeze,
}.freeze

Class Method Summary collapse

Class Method Details

.details(algorithm) ⇒ Object



91
92
93
# File 'lib/pq_crypto/kem.rb', line 91

def details(algorithm)
  DETAILS.fetch(resolve_algorithm!(algorithm)).dup
end

.generate(algorithm = CANONICAL_ALGORITHM) ⇒ Object



33
34
35
36
37
# File 'lib/pq_crypto/kem.rb', line 33

def generate(algorithm = CANONICAL_ALGORITHM)
  algorithm = resolve_algorithm!(algorithm)
  public_key, secret_key = PQCrypto.__send__(native_method_for(algorithm, :keypair))
  Keypair.new(PublicKey.new(algorithm, public_key), SecretKey.new(algorithm, secret_key))
end

.public_key_from_bytes(algorithm, bytes) ⇒ Object



39
40
41
# File 'lib/pq_crypto/kem.rb', line 39

def public_key_from_bytes(algorithm, bytes)
  PublicKey.new(resolve_algorithm!(algorithm), bytes)
end

.public_key_from_pqc_container_der(der, algorithm = nil) ⇒ Object



51
52
53
54
# File 'lib/pq_crypto/kem.rb', line 51

def public_key_from_pqc_container_der(der, algorithm = nil)
  resolved_algorithm, bytes = Serialization.public_key_from_pqc_container_der(algorithm, der)
  PublicKey.new(resolve_algorithm!(resolved_algorithm), bytes)
end

.public_key_from_pqc_container_pem(pem, algorithm = nil) ⇒ Object



56
57
58
59
# File 'lib/pq_crypto/kem.rb', line 56

def public_key_from_pqc_container_pem(pem, algorithm = nil)
  resolved_algorithm, bytes = Serialization.public_key_from_pqc_container_pem(algorithm, pem)
  PublicKey.new(resolve_algorithm!(resolved_algorithm), bytes)
end

.public_key_from_spki_der(der, algorithm: nil) ⇒ Object



79
80
81
82
83
# File 'lib/pq_crypto/kem.rb', line 79

def public_key_from_spki_der(der, algorithm: nil)
  resolved_algorithm, bytes = SPKI.decode_der(der)
  validate_algorithm_match!(algorithm, resolved_algorithm) if algorithm
  PublicKey.new(resolve_algorithm!(resolved_algorithm), bytes)
end

.public_key_from_spki_pem(pem, algorithm: nil) ⇒ Object



85
86
87
88
89
# File 'lib/pq_crypto/kem.rb', line 85

def public_key_from_spki_pem(pem, algorithm: nil)
  resolved_algorithm, bytes = SPKI.decode_pem(pem)
  validate_algorithm_match!(algorithm, resolved_algorithm) if algorithm
  PublicKey.new(resolve_algorithm!(resolved_algorithm), bytes)
end

.secret_key_from_bytes(algorithm, bytes) ⇒ Object



43
44
45
# File 'lib/pq_crypto/kem.rb', line 43

def secret_key_from_bytes(algorithm, bytes)
  SecretKey.new(resolve_algorithm!(algorithm), bytes)
end

.secret_key_from_pkcs8_der(der, passphrase: nil) ⇒ Object



71
72
73
# File 'lib/pq_crypto/kem.rb', line 71

def secret_key_from_pkcs8_der(der, passphrase: nil)
  secret_key_from_decoded_pkcs8(*PKCS8.decode_der(der, passphrase: passphrase))
end

.secret_key_from_pkcs8_pem(pem, passphrase: nil) ⇒ Object



75
76
77
# File 'lib/pq_crypto/kem.rb', line 75

def secret_key_from_pkcs8_pem(pem, passphrase: nil)
  secret_key_from_decoded_pkcs8(*PKCS8.decode_pem(pem, passphrase: passphrase))
end

.secret_key_from_pqc_container_der(der, algorithm = nil) ⇒ Object



61
62
63
64
# File 'lib/pq_crypto/kem.rb', line 61

def secret_key_from_pqc_container_der(der, algorithm = nil)
  resolved_algorithm, bytes = Serialization.secret_key_from_pqc_container_der(algorithm, der)
  SecretKey.new(resolve_algorithm!(resolved_algorithm), bytes)
end

.secret_key_from_pqc_container_pem(pem, algorithm = nil) ⇒ Object



66
67
68
69
# File 'lib/pq_crypto/kem.rb', line 66

def secret_key_from_pqc_container_pem(pem, algorithm = nil)
  resolved_algorithm, bytes = Serialization.secret_key_from_pqc_container_pem(algorithm, pem)
  SecretKey.new(resolve_algorithm!(resolved_algorithm), bytes)
end

.secret_key_from_seed(algorithm, seed) ⇒ Object



47
48
49
# File 'lib/pq_crypto/kem.rb', line 47

def secret_key_from_seed(algorithm, seed)
  SecretKey.from_seed(resolve_algorithm!(algorithm), seed)
end

.supportedObject



95
96
97
# File 'lib/pq_crypto/kem.rb', line 95

def supported
  DETAILS.keys.dup
end