1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
# frozen_string_literal: true
require "cose/algorithm/base"
require "cose/error"
module COSE
module Algorithm
class SignatureAlgorithm < Base
def verify(key, signature, verification_data)
compatible_key?(key) || raise(COSE::Error, "Incompatible key for signature verification")
valid_signature?(key, signature, verification_data) || raise(COSE::Error, "Signature verification failed")
end
def compatible_key?(key)
valid_key?(key) && to_pkey(key)
rescue COSE::Error
false
end
private
def valid_signature?(key, signature, verification_data)
signature_algorithm = signature_algorithm_class.new(**signature_algorithm_parameters)
signature_algorithm.verify_key = to_pkey(key)
begin
signature_algorithm.verify(signature, verification_data)
rescue OpenSSL::SignatureAlgorithm::Error
false
end
end
def signature_algorithm_parameters
{ hash_function: hash_function }
end
def to_cose_key(key)
case key
when COSE::Key::Base
key
when OpenSSL::PKey::PKey
COSE::Key.from_pkey(key)
else
raise(COSE::Error, "Don't know how to transform #{key.class} to COSE::Key")
end
end
def signature_algorithm_class
raise NotImplementedError
end
def valid_key?(_key)
raise NotImplementedError
end
def to_pkey(_key)
raise NotImplementedError
end
end
end
end
|