Class: PqcRails::ActiveRecord::KeyProvider
- Inherits:
-
Object
- Object
- PqcRails::ActiveRecord::KeyProvider
- 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
- #decryption_keys(_encrypted_message) ⇒ Object
- #encryption_key ⇒ Object
-
#initialize(key_source: default_key_source) ⇒ KeyProvider
constructor
A new instance of KeyProvider.
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() [encryption_key] + @key_source.previous_keypairs.map { |keypair| build_key(keypair) } end |
#encryption_key ⇒ Object
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 |