anchor.diff:    (let ((accumulator (poly1305-accumulator mac))
           (r (poly1305-r mac))
           (s (poly1305-s mac)))
  -    (declare (type (simple-array (unsigned-byte 32) (5)) accumulator r)
  -             (type (simple-array (unsigned-byte 32) (4)) s))
  +    (declare (type (simple-array (unsigned-byte 32) (5)) accumulator)
  +             (type (simple-array (unsigned-byte 32) (4)) r s))
       (fill accumulator 0)
  -    (setf (aref r 0) (logand (ub32ref/le key 0) #x3ffffff)
  -          (aref r 1) (logand (mod32ash (ub32ref/le key 3) -2) #x3ffff03)
  -          (aref r 2) (logand (mod32ash (ub32ref/le key 6) -4) #x3ffc0ff)
  -          (aref r 3) (logand (mod32ash (ub32ref/le key 9) -6) #x3f03fff)
  -          (aref r 4) (logand (mod32ash (ub32ref/le key 12) -8) #x00fffff))
  +    (setf (aref r 0) (logand (ub32ref/le key 0) #x0fffffff)
  +          (aref r 1) (logand (ub32ref/le key 4) #x0ffffffc)
  +          (aref r 2) (logand (ub32ref/le key 8) #x0ffffffc)
  +          (aref r 3) (logand (ub32ref/le key 12) #x0ffffffc))
       (setf (aref s 0) (ub32ref/le key 16)
             (aref s 1) (ub32ref/le key 20)
             (aref s 2) (ub32ref/le key 24)
  
positive.code:   (let ((buffer (copy-seq (poly1305-buffer mac)))
          (buffer-length (poly1305-buffer-length mac))
          (accumulator (copy-seq (poly1305-accumulator mac)))
          (r (copy-seq (poly1305-r mac)))
          (s (copy-seq (poly1305-s mac))))
      (declare (type (simple-array (unsigned-byte 8) (16)) buffer)
               (type (integer 0 16) buffer-length)
               (type (simple-array (unsigned-byte 32) (5)) accumulator r)
               (type (simple-array (unsigned-byte 32) (4)) s))
  
      ;; Process the buffer
      (when (plusp buffer-length)
  
negative.code:       (poly1305-process-full-blocks accumulator r buffer 0 16 t))
  
      ;; Produce the tag
      (let* ((h0 (aref accumulator 0))
             (h1 (aref accumulator 1))
             (h2 (aref accumulator 2))
             (h3 (aref accumulator 3))
             (h4 (aref accumulator 4))
             (u0 (mod64+ 5 h0))
             (u1 (mod64+ (mod64ash u0 -32) h1))
             (u2 (mod64+ (mod64ash u1 -32) h2))
             (u3 (mod64+ (mod64ash u2 -32) h3))
             (u4 (mod64+ (mod64ash u3 -32) h4))
             (uu0 (mod64+ (mod64* (mod64ash u4 -2) 5)
                          (mod64+ h0 (aref s 0))))
             (uu1 (mod64+ (mod64ash uu0 -32)
                          (mod64+ h1 (aref s 1))))
             (uu2 (mod64+ (mod64ash uu1 -32)
                          (mod64+ h2 (aref s 2))))
             (uu3 (mod64+ (mod64ash uu2 -32)
                          (mod64+ h3 (aref s 3))))
             (tag (make-array 16 :element-type '(unsigned-byte 8))))
        (declare (type (unsigned-byte 32) h0 h1 h2 h3 h4)
                 (type (unsigned-byte 64) u0 u1 u2 u3 u4 uu0 uu1 uu2 uu3)
                 (type (simple-array (unsigned-byte 8) (16)) tag))
        (setf (ub32ref/le tag 0) (logand uu0 #xffffffff)
              (ub32ref/le tag 4) (logand uu1 #xffffffff)
              (ub32ref/le tag 8) (logand uu2 #xffffffff)
              (ub32ref/le tag 12) (logand uu3 #xffffffff))
        tag)))
  
  (defmac poly1305
          make-poly1305
  