class JSON::JWE
def decrypt!(private_key_or_secret, algorithms = nil, encryption_methods = nil)
def decrypt!(private_key_or_secret, algorithms = nil, encryption_methods = nil) raise UnexpectedAlgorithm.new('Unexpected alg header') unless algorithms.blank? || Array(algorithms).include?(alg) raise UnexpectedAlgorithm.new('Unexpected enc header') unless encryption_methods.blank? || Array(encryption_methods).include?(enc) self.private_key_or_secret = with_jwk_support private_key_or_secret self.content_encryption_key = decrypt_content_encryption_key self.mac_key, self.encryption_key = derive_encryption_and_mac_keys verify_cbc_authentication_tag! if cbc? cipher.decrypt cipher.key = encryption_key cipher.iv = iv # NOTE: 'iv' has to be set after 'key' for GCM if gcm? # https://github.com/ruby/openssl/issues/63 raise DecryptionFailed.new('Invalid authentication tag') if authentication_tag.length < 16 cipher.auth_tag = authentication_tag cipher.auth_data = auth_data end begin self.plain_text = cipher.update(cipher_text) + cipher.final rescue OpenSSL::OpenSSLError # Ensure that the same error is raised for invalid PKCS7 padding # as for invalid signatures. This prevents padding-oracle attacks. raise DecryptionFailed end self end