Module: PqcRails::KeySource

Defined in:
lib/pqc_rails/key_source.rb

Overview

環境変数→Rails credentialsの順で鍵を読み込み、HybridKem::Keypairへデコードするまでの 共通処理。Session::KeyManagerとActiveRecord::KeyProviderで同じ手順(fetch→無ければ例外→decode) が必要になるため共通化している。環境変数を優先するのは本番運用でcredentialsファイルを 使わずに鍵を渡せるようにするため(コンテナのsecret注入等と相性が良い)。

Defined Under Namespace

Classes: EnvCredentials

Class Method Summary collapse

Class Method Details

.credentials_value(credentials_key) ⇒ Object



35
36
37
38
39
# File 'lib/pqc_rails/key_source.rb', line 35

def credentials_value(credentials_key)
  return nil unless Rails.respond_to?(:application) && Rails.application

  Rails.application.credentials[credentials_key]
end

.decode(encoded) ⇒ Object



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

def decode(encoded)
  public_key, secret_key = BlobPacking.unpack(Base64.strict_decode64(encoded))
  HybridKem::Keypair.new(public_key, secret_key)
end

.encode(keypair) ⇒ Object

HybridKem::Keypairのシリアライズ形式。セッション固有の処理ではなく鍵の保存形式そのものなので、 Session::KeyManagerではなくここに置く(セッション/AR両方から使われる)。



43
44
45
# File 'lib/pqc_rails/key_source.rb', line 43

def encode(keypair)
  Base64.strict_encode64(BlobPacking.pack(keypair.public_key, keypair.secret_key))
end

.fetch(env_var:, credentials_key:) ⇒ Object



18
19
20
# File 'lib/pqc_rails/key_source.rb', line 18

def fetch(env_var:, credentials_key:)
  ENV.fetch(env_var, nil) || credentials_value(credentials_key)
end

.fetch!(env_var:, credentials_key:, label:) ⇒ Object

fetchした値がnilならMissingKeyErrorを送出する版。



23
24
25
26
27
# File 'lib/pqc_rails/key_source.rb', line 23

def fetch!(env_var:, credentials_key:, label:)
  fetch(env_var: env_var, credentials_key: credentials_key) ||
    raise(MissingKeyError,
          "PQC #{label} key not found. Set ENV['#{env_var}'] or run `rails generate pqc_rails:install`.")
end

.fetch_keypair!(env_var:, credentials_key:, label:) ⇒ Object

fetch! + decodeまでを1回で行う。Session::KeyManager#keypairとActiveRecord::KeyProvider#keypairの 両方が同じ「fetch→無ければ例外→decode」という処理列を重複実装していたため、ここに統合した。



31
32
33
# File 'lib/pqc_rails/key_source.rb', line 31

def fetch_keypair!(env_var:, credentials_key:, label:)
  decode(fetch!(env_var: env_var, credentials_key: credentials_key, label: label))
end