Coverage report: /home/ellis/comp/ext/ironclad/src/macs/blake2-mac.lisp

KindCoveredAll%
expression081 0.0
branch02 0.0
Key
Not instrumented
Conditionalized out
Executed
Not executed
 
Both branches taken
One branch taken
Neither branch taken
1
 ;;;; blake2-mac.lisp -- implementation of the Blake2b MAC
2
 (in-package :crypto)
3
 
4
 (defclass blake2-mac (mac)
5
   ((digest :accessor blake2-digest :initarg :digest)
6
    (digest-length :accessor digest-length :initarg :digest-length)))
7
 
8
 (defun make-blake2-mac (key &key (digest-length 64))
9
   (make-instance 'blake2-mac
10
                  :key key
11
                  :digest-length digest-length))
12
 
13
 (defmethod copy-blake2-mac ((mac blake2-mac) &optional copy)
14
   (declare (type (or null blake2-mac) copy))
15
   (let ((copy (if copy
16
                   copy
17
                   (make-instance 'blake2-mac
18
                                  :key (make-array 1 :element-type '(unsigned-byte 8))
19
                                  :digest-length 64))))
20
     (declare (type blake2-mac copy))
21
     (setf (blake2-digest copy) (copy-digest (blake2-digest mac)))
22
     (setf (digest-length copy) (digest-length mac))
23
     copy))
24
 
25
 (defmethod shared-initialize :after ((mac blake2-mac) slot-names
26
                                      &rest initargs
27
                                      &key key &allow-other-keys)
28
   (declare (ignore slot-names initargs)
29
            (type (simple-array (unsigned-byte 8) (*)) key))
30
   (let ((digest-length (digest-length mac))
31
         (digest (make-digest :blake2)))
32
     (setf (blake2-state digest) (blake2-make-initial-state digest-length (length key)))
33
     (when (plusp (length key))
34
       (let ((first-block (make-array +blake2-block-size+
35
                                      :element-type '(unsigned-byte 8)
36
                                      :initial-element 0)))
37
         ;; Process the key block
38
         (replace first-block key)
39
         (blake2-update digest first-block 0 +blake2-block-size+ nil)))
40
     (setf (blake2-digest mac) digest)))
41
 
42
 (defun update-blake2-mac (mac sequence &key (start 0) end)
43
   (blake2-update (blake2-digest mac) sequence start (or end (length sequence)) nil)
44
   mac)
45
 
46
 (defun blake2-mac-digest (mac)
47
   (let ((digest (make-array (digest-length mac)
48
                             :element-type '(unsigned-byte 8)))
49
         (mac-copy (copy-blake2-mac mac)))
50
     (blake2-finalize (blake2-digest mac-copy) digest 0)
51
     digest))
52
 
53
 (defmac blake2-mac
54
         make-blake2-mac
55
         update-blake2-mac
56
         blake2-mac-digest)