cabo / cbor-ruby

CBOR (RFC 7049) extension for Ruby
45 stars 12 forks source link

Decode does not work for CBOR produced by Kotlin serializer #20

Open denisenkom opened 10 months ago

denisenkom commented 10 months ago

I used Kotlin's KotlinxSerializationCbor to generate following CBOR, encoding it in base64 urlsafe format:

v2dzdWNjZXNz9G5taXNzaW5nRmFjdG9yc5-fn2h3ZWJhdXRobr____-fn2d5dWJpb3Rwv_______

I can decode it using cbor2pretty.rb tool with the following command:

echo v2dzdWNjZXNz9G5taXNzaW5nRmFjdG9yc5-fn2h3ZWJhdXRobr____-fn2d5dWJpb3Rwv_______ \
  | basenc -d --base64url | cbor2pretty.rb

Here is the result:

bf                                 # map(*)
   67                              # text(7)
      73756363657373               # "success"
   f4                              # primitive(20)
   6e                              # text(14)
      6d697373696e67466163746f7273 # "missingFactors"
   9f                              # array(*)
      9f                           # array(*)
         9f                        # array(*)
            68                     # text(8)
               776562617574686e    # "webauthn"
            bf                     # map(*)
               ff                  # primitive(*)
            ff                     # primitive(*)
         ff                        # primitive(*)
      9f                           # array(*)
         9f                        # array(*)
            67                     # text(7)
               797562696f7470      # "yubiotp"
            bf                     # map(*)
               ff                  # primitive(*)
            ff                     # primitive(*)
         ff                        # primitive(*)
      ff                           # primitive(*)
   ff                              # primitive(*)

This indicates to me that this is a valid CBOR and that probably Kotlin serializer is not at fault.

When I try to decode this CBOR using this library using code snippet:

require 'cbor'
require 'base64'
CBOR.decode(Base64.urlsafe_decode64('v2dzdWNjZXNz9G5taXNzaW5nRmFjdG9yc5-fn2h3ZWJhdXRobr____-fn2d5dWJpb3Rwv_______'))

I get error:

in `decode': invalid byte (CBOR::MalformedFormatError)

Is this library not supporting map(*) and/or array(*) elements? If this is the case, is it possible to add support for such elements?

cabo commented 10 months ago

On 2023-11-09, at 03:58, denisenkom @.***> wrote:

require 'cbor' require 'base64' CBOR.decode(Base64.urlsafe_decode64('v2dzdWNjZXNz9G5taXNzaW5nRmFjdG9yc5-fn2h3ZWJhdXRobr_-fn2d5dWJpb3Rwv____'))

require 'cbor-pure' require 'base64' CBOR.decode(Base64.urlsafe_decode64('v2dzdWNjZXNz9G5taXNzaW5nRmFjdG9yc5-fn2h3ZWJhdXRobr_-fn2d5dWJpb3Rwv____'))

=> {"success"=>false, "missingFactors"=>[[["webauthn", {}]], [["yubiotp", {}]]]}

Clearly, we have a bug here. Thank you for reporting.

Grüße, Carsten