Module: PQCrypto::Signature

Defined in:
lib/pq_crypto/signature.rb

Defined Under Namespace

Classes: Keypair, PublicKey, SecretKey

Constant Summary collapse

CANONICAL_ALGORITHM =
:ml_dsa_65
DETAILS =
AlgorithmRegistry.details_for_family(:ml_dsa).freeze
NATIVE_DISPATCH =
{
  ml_dsa_44: {
    keypair: :native_ml_dsa_44_keypair,
    sign: :native_ml_dsa_44_sign,
    verify: :native_ml_dsa_44_verify,
    keypair_from_seed: :native_ml_dsa_44_keypair_from_seed,
    check_secret_key: :native_ml_dsa_44_check_secret_key,
  }.freeze,
  ml_dsa_65: {
    keypair: :native_sign_keypair,
    sign: :native_sign,
    verify: :native_verify,
    keypair_from_seed: :native_ml_dsa_keypair_from_seed,
    check_secret_key: :native_ml_dsa_check_secret_key,
  }.freeze,
  ml_dsa_87: {
    keypair: :native_ml_dsa_87_keypair,
    sign: :native_ml_dsa_87_sign,
    verify: :native_ml_dsa_87_verify,
    keypair_from_seed: :native_ml_dsa_87_keypair_from_seed,
    check_secret_key: :native_ml_dsa_87_check_secret_key,
  }.freeze,
}.freeze

Class Method Summary collapse

Class Method Details

.details(algorithm) ⇒ Object



107
108
109
# File 'lib/pq_crypto/signature.rb', line 107

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

.generate(algorithm = CANONICAL_ALGORITHM) ⇒ Object



36
37
38
39
40
41
# File 'lib/pq_crypto/signature.rb', line 36

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, freshly_generated: true))
end

.public_key_from_bytes(algorithm, bytes) ⇒ Object



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

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

.public_key_from_pqc_container_der(der, algorithm = nil) ⇒ Object



57
58
59
60
61
# File 'lib/pq_crypto/signature.rb', line 57

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

.public_key_from_pqc_container_pem(pem, algorithm = nil) ⇒ Object



63
64
65
66
67
# File 'lib/pq_crypto/signature.rb', line 63

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

.public_key_from_spki_der(der, algorithm: nil) ⇒ Object



81
82
83
84
85
# File 'lib/pq_crypto/signature.rb', line 81

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



87
88
89
90
91
# File 'lib/pq_crypto/signature.rb', line 87

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



48
49
50
51
# File 'lib/pq_crypto/signature.rb', line 48

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

.secret_key_from_pkcs8_der(der, passphrase: nil, require_encrypted: false) ⇒ Object



93
94
95
96
97
98
# File 'lib/pq_crypto/signature.rb', line 93

def secret_key_from_pkcs8_der(der, passphrase: nil, require_encrypted: false)
  require_encrypted = Internal.strict_boolean!(require_encrypted, name: "require_encrypted")
  secret_key_from_decoded_pkcs8(
    *PKCS8.decode_der(der, passphrase: passphrase, require_encrypted: require_encrypted)
  )
end

.secret_key_from_pkcs8_pem(pem, passphrase: nil, require_encrypted: false) ⇒ Object



100
101
102
103
104
105
# File 'lib/pq_crypto/signature.rb', line 100

def secret_key_from_pkcs8_pem(pem, passphrase: nil, require_encrypted: false)
  require_encrypted = Internal.strict_boolean!(require_encrypted, name: "require_encrypted")
  secret_key_from_decoded_pkcs8(
    *PKCS8.decode_pem(pem, passphrase: passphrase, require_encrypted: require_encrypted)
  )
end

.secret_key_from_pqc_container_der(der, algorithm = nil) ⇒ Object



69
70
71
72
73
# File 'lib/pq_crypto/signature.rb', line 69

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

.secret_key_from_pqc_container_pem(pem, algorithm = nil) ⇒ Object



75
76
77
78
79
# File 'lib/pq_crypto/signature.rb', line 75

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

.secret_key_from_seed(algorithm, seed) ⇒ Object



53
54
55
# File 'lib/pq_crypto/signature.rb', line 53

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

.supportedObject



111
112
113
# File 'lib/pq_crypto/signature.rb', line 111

def supported
  DETAILS.keys.dup
end