Commit 1b472ae

Tobias Bielohlawek <tobias.bielohlawek@solarisbank.de>
2019-03-20 10:06:15
Add default symmetric_cipher to `EncryptedData` and `EncryptedKey`
Simplify constructors by adding default values
1 parent 39da2ff
lib/xml/kit/encrypted_data.rb
@@ -13,7 +13,7 @@ module Xml
 
       def initialize(
         raw_xml,
-        symmetric_cipher:,
+        symmetric_cipher: Xml::Kit::Crypto::SymmetricCipher.new,
         asymmetric_cipher:,
         key_info: nil
       )
lib/xml/kit/encrypted_key.rb
@@ -17,7 +17,7 @@ module Xml
       def initialize(
         id: Id.generate,
         asymmetric_cipher:,
-        symmetric_cipher:,
+        symmetric_cipher: Xml::Kit::Crypto::SymmetricCipher.new,
         key_info: nil
       )
         @id = id
spec/xml/kit/encrypted_data_spec.rb
@@ -6,29 +6,36 @@ RSpec.describe Xml::Kit::EncryptedData do
       ::Xml::Kit::Crypto::RsaCipher::ALGORITHM,
       ::Xml::Kit::Crypto::OaepCipher::ALGORITHM,
     ].each do |asymmetric_algorithm|
+      subject do
+        described_class.new(xml, asymmetric_cipher: asymmetric_cipher)
+      end
+
+      let(:symmetric_cipher) { ::Xml::Kit::Crypto::SymmetricCipher.new(symmetric_algorithm) }
+      let(:symmetric_algorithm) { Xml::Kit::Crypto::SymmetricCipher::DEFAULT_ALGORITHM }
+      let(:asymmetric_cipher) { ::Xml::Kit::Crypto.cipher_for(asymmetric_algorithm, key_pair.public_key) }
+      let(:key_pair) { Xml::Kit::KeyPair.generate(use: :encryption, algorithm: symmetric_algorithm) }
+      let(:decryptor) { Xml::Kit::Decryption.new(private_keys: [key_pair.private_key]) }
+      let(:xml) do
+        xml = ::Builder::XmlMarkup.new
+        xml.HellWorld do
+          xml.Now Time.now.iso8601
+        end
+        xml.target!
+      end
+
+      specify { expect(decryptor.decrypt_xml(subject.to_xml)).to eql(xml) }
+
       [
         "#{::Xml::Kit::Namespaces::XMLENC}tripledes-cbc",
         "#{::Xml::Kit::Namespaces::XMLENC}aes128-cbc",
         "#{::Xml::Kit::Namespaces::XMLENC}aes192-cbc",
         "#{::Xml::Kit::Namespaces::XMLENC}aes256-cbc",
       ].each do |symmetric_algorithm|
-        describe symmetric_algorithm do
+        context symmetric_algorithm do
           subject do
             described_class.new(xml, symmetric_cipher: symmetric_cipher, asymmetric_cipher: asymmetric_cipher)
           end
 
-          let(:symmetric_cipher) { ::Xml::Kit::Crypto::SymmetricCipher.new(symmetric_algorithm) }
-          let(:asymmetric_cipher) { ::Xml::Kit::Crypto.cipher_for(asymmetric_algorithm, key_pair.public_key) }
-          let(:key_pair) { Xml::Kit::KeyPair.generate(use: :encryption, algorithm: symmetric_algorithm) }
-          let(:decryptor) { Xml::Kit::Decryption.new(private_keys: [key_pair.private_key]) }
-          let(:xml) do
-            xml = ::Builder::XmlMarkup.new
-            xml.HellWorld do
-              xml.Now Time.now.iso8601
-            end
-            xml.target!
-          end
-
           specify { expect(decryptor.decrypt_xml(subject.to_xml)).to eql(xml) }
         end
       end
spec/xml/kit/encrypted_key_spec.rb
@@ -2,9 +2,8 @@
 
 RSpec.describe ::Xml::Kit::EncryptedKey do
   describe '#to_xml' do
-    subject { described_class.new(id: id, asymmetric_cipher: asymmetric_cipher, symmetric_cipher: symmetric_cipher, key_info: key_info) }
+    subject { described_class.new(id: id, asymmetric_cipher: asymmetric_cipher, key_info: key_info) }
 
-    let(:symmetric_cipher) { ::Xml::Kit::Crypto::SymmetricCipher.new }
     let(:asymmetric_cipher) { ::Xml::Kit::Crypto.cipher_for(algorithm, private_key.public_key) }
     let(:algorithm) { ::Xml::Kit::Crypto::RsaCipher::ALGORITHM }
     let(:key_info) { ::Xml::Kit::KeyInfo.new }
@@ -21,8 +20,16 @@ RSpec.describe ::Xml::Kit::EncryptedKey do
     specify { expect(result['EncryptedKey']['xmlns']).to eql(::Xml::Kit::Namespaces::XMLENC) }
     specify { expect(result['EncryptedKey']['EncryptionMethod']['Algorithm']).to eql(algorithm) }
     specify { expect(result['EncryptedKey']['CipherData']['CipherValue']).to be_present }
-    specify { expect(private_key.private_decrypt(Base64.decode64(result['EncryptedKey']['CipherData']['CipherValue']))).to eql(symmetric_cipher.key) }
+    specify { expect(private_key.private_decrypt(Base64.decode64(result['EncryptedKey']['CipherData']['CipherValue']))).to eql(subject.symmetric_cipher.key) }
     specify { expect(subject.to_xml).to match_xsd('xenc-schema') }
     specify { expect(result['EncryptedKey'].key?('KeyInfo')).to be(true) }
+
+    context 'with custom symmetric cipher' do
+      subject { described_class.new(id: id, asymmetric_cipher: asymmetric_cipher, key_info: key_info, symmetric_cipher: symmetric_cipher) }
+
+      let(:symmetric_cipher) { instance_double(Xml::Kit::Crypto::SymmetricCipher, key: 'symmetric_key', encrypt: 'CIPHERTEXT', algorithm: 'symmetric_cipher') }
+
+      specify { expect(private_key.private_decrypt(Base64.decode64(result['EncryptedKey']['CipherData']['CipherValue']))).to eql(symmetric_cipher.key) }
+    end
   end
 end