commit 7c464be0ef41b23b6f221fce8b8d5c405771eaad
parent 2816c8c7bae0ed0bacd00b77a9c5dd5d3ed19a42
Author: Tomas Hlavaty <tom@logand.com>
Date:   Sun, 31 Aug 2014 21:55:57 +0200
der fixes and improvements
Diffstat:
| M | der.lisp |  |  | 49 | +++++++++++++++++++++++++++++++++++-------------- | 
1 file changed, 35 insertions(+), 14 deletions(-)
diff --git a/der.lisp b/der.lisp
@@ -176,14 +176,14 @@
 (defun encode (writer x)
   (labels ((len (n)
              (assert (<= 0 n))
-             (if (logbitp 7 n)
+             (if (< n #x80)
+                 (rw:write-u8 writer n)
                  (let ((nn (ceiling (log n 256))))
-                   (assert (<= nn #x7f))
+                   (assert (<= 1 nn #x7f))
                    (rw:write-u8 writer (logior #x80 nn))
                    (loop
                       for i from (1- nn) downto 0
-                      do (rw:write-u8 writer (ldb (byte 8 (* 8 i)) n))))
-                 (rw:write-u8 writer n)))
+                      do (rw:write-u8 writer (ldb (byte 8 (* 8 i)) n))))))
            (ascii (x)
              (len (length x))
              (loop
@@ -237,7 +237,18 @@
           (rw:write-u8 writer 1)
           (rw:write-u8 writer 1)
           (rw:write-u8 writer (if (cdr x) 255 0)))
-         ;;(bit-string         3)
+         (bit-string
+          (rw:write-u8 writer 3)
+          (let* ((x (cdr x))
+                 (nbits (ceiling (log x 2))) ;; TODO use integer-length
+                 (nbytes (ceiling nbits 8))
+                 (m (- (* nbytes 8) nbits)))
+            (len (+ 1 nbytes))
+            (rw:write-u8 writer m)
+            (do ((i (- nbits 8) (- i 8)))
+                ((minusp i))
+              (rw:write-u8 writer (ldb (byte 8 i) x)))
+            (rw:write-u8 writer (ash (ldb (byte (- 8 m) 0) x) m))))
          (oid
           (rw:write-u8 writer 6)
           (let* ((b (make-array 42 :fill-pointer 0 :adjustable t))
@@ -279,13 +290,17 @@
           (ascii (cdr x)))
          (set
           (rw:write-u8 writer 49)
-          (let* ((b (make-array 42 :fill-pointer 0 :adjustable t))
-                 (w (rw:writer b)))
-            (encode w (cdr x))
-            (len (length b))
-            (loop
-               for x across b
-               do (rw:write-u8 writer x))))
+          (seq (list (cdr x))))
+         (???-key-identifier
+          (rw:write-u8 writer 80)
+          (seq (list (cdr x))))
+         (???-signed-certificate-version
+          (rw:write-u8 writer 160)
+          ;; (int inside) 2 = signed certificate v3
+          (seq (list (cdr x))))
+         (???-signed-certificate-extensions
+          (rw:write-u8 writer 163)
+          (seq (list (cdr x))))
          (t ;; sequence
           (rw:write-u8 writer 48)
           (seq x)))))))
@@ -325,7 +340,8 @@
           (48 14 2 1 #x80 6 9 #x2b 6 1 4 1 #x82 #x37 #x15 #x14))
          ((set -128 (oid 1 3 6 1 4 1 311 21 20))
           (49 16 48 14 2 1 #x80 6 9 #x2b 6 1 4 1 #x82 #x37 #x15 #x14))
-         )))
+         ((bit-string . #x12345)
+          (3 4 7 145 162 128)))))
   (dolist (test tests t)
     ;; (print (list :@@@ test))
     ;; (finish-output)
@@ -337,7 +353,8 @@
 
 ;;(decode (rw:reader '(6 6 #x2a #x86 #x48 #x86 #xf7 #x0d)))
 ;;(decode (rw:reader '(3 4 6 #x6e #x5d #xc0))) ; '(:bit-string "011011100101110111")
-;;(encode w '(:bit-string "011011100101110111")) ;; '(3 4 6 #x6e #x5d #xc0)
+;;(encode w '(bit-string "011011100101110111")) ;; '(3 4 6 #x6e #x5d #xc0)
+
 (defun read-pem-key (reader)
   (let ((x (rw:till reader '(#\return #\newline))))
     (rw:skip reader)
@@ -381,3 +398,7 @@
       (loop
          while (progn (rw:skip r) (rw:peek r))
          collect (read-pem-key r)))))
+
+;;(read-pem-file "~/sw/gvfs/test/files/testcert.pem")
+;;openssl x509 -in ~/sw/gvfs/test/files/testcert.pem -noout -text
+