lib/cose/security_message.rb in cose-0.8.0 vs lib/cose/security_message.rb in cose-0.9.0
- old
+ new
@@ -1,26 +1,71 @@
+# frozen_string_literal: true
+
require "cbor"
+require "cose/algorithm"
+require "cose/error"
+require "cose/security_message/headers"
module COSE
class SecurityMessage
+ ZERO_LENGTH_BIN_STRING = "".b
+
attr_reader :protected_headers, :unprotected_headers
def self.deserialize(cbor)
decoded = CBOR.decode(cbor)
- if decoded.respond_to?(:value)
+ if decoded.is_a?(CBOR::Tagged)
+ if respond_to?(:tag) && tag != decoded.tag
+ raise(COSE::Error, "Invalid CBOR tag")
+ end
+
decoded = decoded.value
end
+ from_array(decoded)
+ end
+
+ def self.from_array(array)
new(
- protected_headers: CBOR.decode(decoded[0]),
- unprotected_headers: decoded[1],
- **keyword_arguments_for_initialize(decoded[2..-1])
+ protected_headers: deserialize_headers(array[0]),
+ unprotected_headers: array[1],
+ **keyword_arguments_for_initialize(array[2..-1])
)
end
+ def self.deserialize_headers(data)
+ if data == ZERO_LENGTH_BIN_STRING
+ {}
+ else
+ CBOR.decode(data)
+ end
+ end
+
def initialize(protected_headers:, unprotected_headers:)
@protected_headers = protected_headers
@unprotected_headers = unprotected_headers
+ end
+
+ def algorithm
+ @algorithm ||= COSE::Algorithm.find(headers.alg) || raise(COSE::Error, "Unsupported algorithm '#{headers.alg}'")
+ end
+
+ def headers
+ @headers ||= Headers.new(protected_headers, unprotected_headers)
+ end
+
+ private
+
+ def serialized_map(map)
+ if map && !map.empty?
+ map.to_cbor
+ else
+ zero_length_bin_string
+ end
+ end
+
+ def zero_length_bin_string
+ ZERO_LENGTH_BIN_STRING
end
end
end