Module: PqcRails::Algorithms

Defined in:
lib/pqc_rails/algorithms.rb

Overview

NIST標準化アルゴリズムのシンボル名(:ml_kem_512等)とliboqs側のアルゴリズム名文字列 ("ML-KEM-512"等)を対応づけるレジストリ。

Kem/Sigはliboqsの生の文字列を直接渡すこともできるが(liboqsが対応する任意のアルゴリズムを 使える柔軟性は維持する)、このレジストリを経由してシンボルで指定すれば、 liboqs側の命名に依存しない安定したAPIになる。 将来 ActiveRecord::Encryption と統合する際、設定ファイルやモデルにliboqsの生文字列を 書かせるのではなく、このシンボルを書かせることを想定している。

使い方:

PqcRails::Kem.new(:ml_kem_512)
PqcRails::Sig.new(:ml_dsa_44)

Defined Under Namespace

Classes: Algorithm, UnknownAlgorithmError

Constant Summary collapse

KEMS =
{
  ml_kem_512: Algorithm.new(
    name: :ml_kem_512, liboqs_name: "ML-KEM-512", family: :kem, security_level: 1, status: :recommended
  ),
  ml_kem_768: Algorithm.new(
    name: :ml_kem_768, liboqs_name: "ML-KEM-768", family: :kem, security_level: 3, status: :recommended
  ),
  ml_kem_1024: Algorithm.new(
    name: :ml_kem_1024, liboqs_name: "ML-KEM-1024", family: :kem, security_level: 5, status: :recommended
  )
}.freeze
SIGS =
{
  ml_dsa_44: Algorithm.new(
    name: :ml_dsa_44, liboqs_name: "ML-DSA-44", family: :sig, security_level: 2, status: :recommended
  ),
  ml_dsa_65: Algorithm.new(
    name: :ml_dsa_65, liboqs_name: "ML-DSA-65", family: :sig, security_level: 3, status: :recommended
  ),
  ml_dsa_87: Algorithm.new(
    name: :ml_dsa_87, liboqs_name: "ML-DSA-87", family: :sig, security_level: 5, status: :recommended
  )
}.freeze

Class Method Summary collapse

Class Method Details

.find_kem(name) ⇒ Object



47
48
49
50
51
# File 'lib/pqc_rails/algorithms.rb', line 47

def find_kem(name)
  KEMS.fetch(name.to_sym)
rescue KeyError
  raise UnknownAlgorithmError, "unknown KEM algorithm: #{name.inspect}. Known: #{KEMS.keys.join(', ')}"
end

.find_sig(name) ⇒ Object



53
54
55
56
57
# File 'lib/pqc_rails/algorithms.rb', line 53

def find_sig(name)
  SIGS.fetch(name.to_sym)
rescue KeyError
  raise UnknownAlgorithmError, "unknown SIG algorithm: #{name.inspect}. Known: #{SIGS.keys.join(', ')}"
end

.resolve_kem_name(name) ⇒ Object

liboqsに渡すべきアルゴリズム名文字列を解決する。 Stringが渡された場合はliboqsの生の名前としてそのまま通す(後方互換・将来の未登録アルゴリズム用)。 Symbolが渡された場合はレジストリ経由でliboqs名に変換する。



62
63
64
65
66
# File 'lib/pqc_rails/algorithms.rb', line 62

def resolve_kem_name(name)
  return name if name.is_a?(String)

  find_kem(name).liboqs_name
end

.resolve_sig_name(name) ⇒ Object



68
69
70
71
72
# File 'lib/pqc_rails/algorithms.rb', line 68

def resolve_sig_name(name)
  return name if name.is_a?(String)

  find_sig(name).liboqs_name
end