Fix bitstring asn1 encoding and decoding

Julien LepillerSat Oct 03 22:34:19+0200 2020

8e7b997

Fix bitstring asn1 encoding and decoding

http-signature/asn1.scm

114114
  (make-asn1-type
115115
    "bitstring" 3 #t #t
116116
    (lambda (bv pos len)
117-
      (let ((ans (make-bytevector (- len 1))))
118-
        (bytevector-copy! bv (+ pos 1) ans 0 (- len 1))
119-
        ans))
117+
      (if (= len 0)
118+
          (make-bytevector 0)
119+
          (let ((ans (make-bytevector (- len 1))))
120+
            (bytevector-copy! bv (+ pos 1) ans 0 (- len 1))
121+
            ans)))
120122
    (lambda (value)
121-
      (let ((ans (make-bytevector (+ (bytevector-length value) 1))))
122-
        (bytevector-u8-set! ans 0 0)
123-
        (bytevector-copy! value 0 ans 1 (bytevector-length value))
124-
        ans))
123+
      (if (= (bytevector-length value) 0)
124+
          (make-bytevector 0)
125+
          (let ((ans (make-bytevector (+ (bytevector-length value) 1))))
126+
            (bytevector-u8-set! ans 0 0)
127+
            (bytevector-copy! value 0 ans 1 (bytevector-length value))
128+
            ans)))
125129
    (lambda (value)
126130
      (apply bv-append value))))
127131

tests/asn1.scm

5050
5151
(test-assert "asn1 bit string decoding"
5252
  (and
53-
    (bv-equal? (decode-asn1 #vu8(#x03 #x00) asn1:bitstring) #vu8())
54-
    (bv-equal? (decode-asn1 #vu8(#x03 #x02 #x01 #x50) asn1:bitstring) #vu8(#x01 #x50))))
53+
    (bv-equal? (decode-asn1 #vu8(#x03 #x01 #x00) asn1:bitstring) #vu8())
54+
    (bv-equal? (decode-asn1 #vu8(#x03 #x03 #x00 #x01 #x50) asn1:bitstring) #vu8(#x01 #x50))))
5555
5656
(test-assert "asn1 bit string constructed decoding"
5757
  (and

5959
                                           #x03 #x05 #x04 #x5f #x29 #x1c #xd0
6060
                                           #x00 #x00)
6161
                            asn1:bitstring)
62-
               #vu8(#x00 #x0a #x3b #x04 #x5f #x29 #x1c #xd0))
62+
               #vu8(#x0a #x3b #x5f #x29 #x1c #xd0))
6363
    (bv-equal? (decode-asn1 #vu8(#x23 #x80 #x03 #x00
64-
                                           #x23 #x80 #x03 #x01 #x5f
65-
                                                     #x03 #x01 #x1e
64+
                                           #x23 #x80 #x03 #x02 #x00 #x5f
65+
                                                     #x03 #x02 #x00 #x1e
6666
                                                     #x00 #x00
67-
                                           #x03 #x02 #x5e #x22
67+
                                           #x03 #x03 #x00 #x5e #x22
6868
                                           #x00 #x00)
6969
                            asn1:bitstring)
7070
               #vu8(#x5f #x1e #x5e #x22))))

124124
(test-assert "asn1 bit string encoding"
125125
  (and
126126
    (bv-equal? (encode-asn1 asn1:bitstring #vu8()) #vu8(#x03 #x00))
127-
    (bv-equal? (encode-asn1 asn1:bitstring #vu8(#x5e #x11)) #vu8(#x03 #x02 #x5e #x11))))
127+
    (bv-equal? (encode-asn1 asn1:bitstring #vu8(#x5e #x11)) #vu8(#x03 #x03 #x00 #x5e #x11))))
128128
129129
(test-assert "asn1 octet string encoding"
130130
  (and