Class: PqcRails::ActiveRecord::KeyProvider

Inherits:
Object
  • Object
show all
Defined in:
lib/pqc_rails/active_record/key_provider.rb

Overview

ActiveRecord::Encryption::KeyProvider互換。HybridKemの鍵ペアを返す実装。

既存のActiveRecord::Encryption::KeyProvider(Key#secretが単一の不透明な文字列)は 公開鍵/秘密鍵という「鍵ペア」の概念を持たないため、ML-KEMを使う余地が無い。 そのためKeyProvider自体を独自実装し、key.secretがPqcRails::HybridKem::Keypair (公開鍵・秘密鍵のペア)を返すようにしている。

鍵のソース(環境変数→Rails credentials→decode)はKeySourceに一本化されており、 セッション用の鍵とは異なるENV変数名/credentialsキーを渡すことで用途ごとに鍵を分離する。

鍵ローテーションは#decryption_keysが現行鍵に続けて旧鍵世代を返すことで対応する (ActiveRecord::Encryption::Cipher互換の#decryptは配列の各鍵を順に試すため、 PqcRails::Cipher#decryptは変更不要)。旧鍵はPQC_RECORD_PREVIOUS_KEYS(ENV)または pqc_record_previous_keys(credentials)から読み込む。

Defined Under Namespace

Classes: Key

Constant Summary collapse

ENV_VAR =
"PQC_RECORD_KEY"
PREVIOUS_ENV_VAR =
"PQC_RECORD_PREVIOUS_KEYS"
CREDENTIALS_KEY =
:pqc_record_key
PREVIOUS_CREDENTIALS_KEY =
:pqc_record_previous_keys

Instance Method Summary collapse

Constructor Details

#initialize(key_source: default_key_source) ⇒ KeyProvider



38
39
40
# File 'lib/pqc_rails/active_record/key_provider.rb', line 38

def initialize(key_source: default_key_source)
  @key_source = key_source
end

Instance Method Details

#decryption_keys(_encrypted_message) ⇒ Object



46
47
48
# File 'lib/pqc_rails/active_record/key_provider.rb', line 46

def decryption_keys(_encrypted_message)
  [encryption_key] + @key_source.previous_keypairs.map { |keypair| build_key(keypair) }
end

#encryption_keyObject



42
43
44
# File 'lib/pqc_rails/active_record/key_provider.rb', line 42

def encryption_key
  @encryption_key ||= build_key(@key_source.current_keypair)
end