Sha256: 3b2dcadd0053c13261c6597d5e196b271f43874d5a0b659d1539a53e3a6704c8

Contents?: true

Size: 1.5 KB

Versions: 3

Compression:

Stored size: 1.5 KB

Contents

module Xmlenc
  class EncryptedKey
    ALGORITHMS = {
        'http://www.w3.org/2001/04/xmlenc#rsa-1_5'        => Algorithms::RSA15,
        'http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p' => Algorithms::RsaOaepMgf1p
    }

    def initialize(node)
      @node = node
    end

    def document
      @node.document
    end

    def encryption_method
      at_xpath('./xenc:EncryptionMethod')
    end

    def encrypted_data
      EncryptedData.new(referenced_node)
    end

    def cipher_value
      at_xpath('./xenc:CipherData/xenc:CipherValue').content.gsub(/[\n\s]/, '')
    end

    def cipher_value=(value)
      at_xpath('./xenc:CipherData/xenc:CipherValue').content = value
    end

    def decrypt(key)
      decryptor = algorithm.new(key)
      decryptor.decrypt(Base64.decode64(cipher_value), node: encryption_method)
    end

    def encrypt(key, data)
      encryptor = algorithm.new(key)
      encrypted = encryptor.encrypt(data, node: encryption_method)
      self.cipher_value = Base64.encode64(encrypted)
    end

    private

    def referenced_node
      document.at_xpath("//xenc:EncryptedData[@Id='#{reference_uri}']", NAMESPACES)
    end

    def reference_uri
      at_xpath('./xenc:ReferenceList/xenc:DataReference')['URI'][1..-1]
    end

    def at_xpath(xpath)
      @node.at_xpath(xpath, NAMESPACES)
    end

    def algorithm
      algorithm = encryption_method['Algorithm']
      ALGORITHMS[algorithm] ||
          raise(UnsupportedError.new("Unsupported encryption method #{algorithm}"))
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
xmlenc-0.1.2 lib/xmlenc/encrypted_key.rb
xmlenc-0.1.1 lib/xmlenc/encrypted_key.rb
xmlenc-0.1.0 lib/xmlenc/encrypted_key.rb