Module: PQCrypto::AlgorithmRegistry

Defined in:
lib/pq_crypto/algorithm_registry.rb

Class Method Summary collapse

Class Method Details

.by_legacy_oid(oid) ⇒ Object



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

def by_legacy_oid(oid)
  legacy_oid_index.fetch(oid, nil)
end

.by_standard_oid(oid) ⇒ Object



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

def by_standard_oid(oid)
  standard_oid_index.fetch(oid, nil)
end

.details_for_family(family) ⇒ Object



139
140
141
142
143
144
145
146
147
148
# File 'lib/pq_crypto/algorithm_registry.rb', line 139

def details_for_family(family)
  @details_for_family ||= {}
  @details_for_family[family] ||= begin
    entries.each_with_object({}) do |(algorithm, entry), details|
      next unless entry.fetch(:family) == family

      details[algorithm] = details_entry(algorithm, entry)
    end.freeze
  end
end

.entriesObject



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/pq_crypto/algorithm_registry.rb', line 6

def entries
  @entries ||= begin
    {
      ml_kem_512: {
        family: :ml_kem,
        legacy_oid: nil,
        standard_oid: "2.16.840.1.101.3.4.4.1",
        public_key_bytes: PQCrypto::ML_KEM_512_PUBLIC_KEY_BYTES,
        secret_key_bytes: PQCrypto::ML_KEM_512_SECRET_KEY_BYTES,
        ciphertext_bytes: PQCrypto::ML_KEM_512_CIPHERTEXT_BYTES,
        shared_secret_bytes: PQCrypto::ML_KEM_512_SHARED_SECRET_BYTES,
        signature_bytes: nil,
        description: "Pure ML-KEM-512 primitive (FIPS 203).",
      }.freeze,
      ml_kem_768: {
        family: :ml_kem,
        legacy_oid: "2.25.186599352125448088867056807454444238446",
        standard_oid: "2.16.840.1.101.3.4.4.2",
        public_key_bytes: PQCrypto::ML_KEM_PUBLIC_KEY_BYTES,
        secret_key_bytes: PQCrypto::ML_KEM_SECRET_KEY_BYTES,
        ciphertext_bytes: PQCrypto::ML_KEM_CIPHERTEXT_BYTES,
        shared_secret_bytes: PQCrypto::ML_KEM_SHARED_SECRET_BYTES,
        signature_bytes: nil,
        description: "Pure ML-KEM-768 primitive (FIPS 203).",
      }.freeze,
      ml_kem_1024: {
        family: :ml_kem,
        legacy_oid: nil,
        standard_oid: "2.16.840.1.101.3.4.4.3",
        public_key_bytes: PQCrypto::ML_KEM_1024_PUBLIC_KEY_BYTES,
        secret_key_bytes: PQCrypto::ML_KEM_1024_SECRET_KEY_BYTES,
        ciphertext_bytes: PQCrypto::ML_KEM_1024_CIPHERTEXT_BYTES,
        shared_secret_bytes: PQCrypto::ML_KEM_1024_SHARED_SECRET_BYTES,
        signature_bytes: nil,
        description: "Pure ML-KEM-1024 primitive (FIPS 203).",
      }.freeze,
      ml_kem_768_x25519_xwing: {
        family: :ml_kem_hybrid,
        legacy_oid: "1.3.6.1.4.1.62253.25722",
        standard_oid: nil,
        public_key_bytes: PQCrypto::HYBRID_KEM_PUBLIC_KEY_BYTES,
        secret_key_bytes: PQCrypto::HYBRID_KEM_SECRET_KEY_BYTES,
        ciphertext_bytes: PQCrypto::HYBRID_KEM_CIPHERTEXT_BYTES,
        shared_secret_bytes: PQCrypto::HYBRID_KEM_SHARED_SECRET_BYTES,
        signature_bytes: nil,
        description: "Hybrid KEM: ML-KEM-768 + X25519 combined via X-Wing SHA3-256 combiner (draft-connolly-cfrg-xwing-kem).",
      }.freeze,
      ml_dsa_44: {
        family: :ml_dsa,
        legacy_oid: nil,
        standard_oid: "2.16.840.1.101.3.4.3.17",
        public_key_bytes: PQCrypto::SIGN_44_PUBLIC_KEY_BYTES,
        secret_key_bytes: PQCrypto::SIGN_44_SECRET_KEY_BYTES,
        ciphertext_bytes: nil,
        shared_secret_bytes: nil,
        signature_bytes: PQCrypto::SIGN_44_BYTES,
        description: "ML-DSA-44 signature primitive (FIPS 204).",
      }.freeze,
      ml_dsa_65: {
        family: :ml_dsa,
        legacy_oid: "2.25.305232938483772195555080795650659207792",
        standard_oid: "2.16.840.1.101.3.4.3.18",
        public_key_bytes: PQCrypto::SIGN_PUBLIC_KEY_BYTES,
        secret_key_bytes: PQCrypto::SIGN_SECRET_KEY_BYTES,
        ciphertext_bytes: nil,
        shared_secret_bytes: nil,
        signature_bytes: PQCrypto::SIGN_BYTES,
        description: "ML-DSA-65 signature primitive (FIPS 204).",
      }.freeze,
      ml_dsa_87: {
        family: :ml_dsa,
        legacy_oid: nil,
        standard_oid: "2.16.840.1.101.3.4.3.19",
        public_key_bytes: PQCrypto::SIGN_87_PUBLIC_KEY_BYTES,
        secret_key_bytes: PQCrypto::SIGN_87_SECRET_KEY_BYTES,
        ciphertext_bytes: nil,
        shared_secret_bytes: nil,
        signature_bytes: PQCrypto::SIGN_87_BYTES,
        description: "ML-DSA-87 signature primitive (FIPS 204).",
      }.freeze,
    }.freeze
  end
end

.fetch(symbol) ⇒ Object



90
91
92
93
94
# File 'lib/pq_crypto/algorithm_registry.rb', line 90

def fetch(symbol)
  entries.fetch(symbol) do
    raise UnsupportedAlgorithmError, "Unsupported algorithm: #{symbol.inspect}"
  end
end

.legacy_metadata_viewObject



127
128
129
130
131
132
133
134
135
136
137
# File 'lib/pq_crypto/algorithm_registry.rb', line 127

def 
  @legacy_metadata_view ||= entries.each_with_object({}) do |(algorithm, entry), view|
    oid = entry.fetch(:legacy_oid)
    next if oid.nil?

    view[algorithm] = {
      family: entry.fetch(:family),
      oid: oid,
    }.freeze
  end.freeze
end

.legacy_oid(symbol) ⇒ Object



96
97
98
# File 'lib/pq_crypto/algorithm_registry.rb', line 96

def legacy_oid(symbol)
  fetch(symbol).fetch(:legacy_oid)
end

.standard_oid(symbol) ⇒ Object

Raises:



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

def standard_oid(symbol)
  oid = fetch(symbol).fetch(:standard_oid)
  raise SerializationError, "No standard OID registered for #{symbol.inspect}" if oid.nil?

  oid
end

.supported_hybrid_kemsObject



119
120
121
# File 'lib/pq_crypto/algorithm_registry.rb', line 119

def supported_hybrid_kems
  supported_by_family(:ml_kem_hybrid)
end

.supported_kemsObject



115
116
117
# File 'lib/pq_crypto/algorithm_registry.rb', line 115

def supported_kems
  supported_by_family(:ml_kem)
end

.supported_signaturesObject



123
124
125
# File 'lib/pq_crypto/algorithm_registry.rb', line 123

def supported_signatures
  supported_by_family(:ml_dsa)
end