[crypticl-cvs] CVS crypticl/src

tskogan tskogan at common-lisp.net
Tue Jan 23 23:55:39 UTC 2007


Update of /project/crypticl/cvsroot/crypticl/src
In directory clnet:/tmp/cvs-serv1593

Modified Files:
	utilities.lisp random.lisp aes.lisp 
Log Message:
Backup of initial version of secure random generator with aes in counter
mode.


--- /project/crypticl/cvsroot/crypticl/src/utilities.lisp	2007/01/22 22:45:32	1.9
+++ /project/crypticl/cvsroot/crypticl/src/utilities.lisp	2007/01/23 23:55:39	1.10
@@ -73,14 +73,9 @@
 
 
 (defun int-as-octet-vector-add (ov n)
-  "Add n to octet vector ov."
+  "Add n to octet vector ov and keep size of octet vector."
   (integer-to-octet-vector (+ (octet-vector-to-integer ov) n) :vector ov))
 
-(defun foo (data ctr)
-  (aes-crypt-octet-vector data #16(0) 'ctr nil ctr) 
-  (int-as-octet-vector-add ctr 1)
-  (hex data))
-
 (defun hex (ov)
   (octet-vector-to-hex-string ov))
 
@@ -171,8 +166,7 @@
     (unless out
       (setf out (make-array size :element-type '(unsigned-byte 8))))
     (dotimes (i size out)
-      (setf (aref out (+ out-start i)) (aref in (+ start i))))))
-     
+      (setf (aref out (+ out-start i)) (aref in (+ start i))))))          
 
 (defun concat (&rest args)
   "Concatenates strings and vectors. 
--- /project/crypticl/cvsroot/crypticl/src/random.lisp	2007/01/23 21:20:36	1.6
+++ /project/crypticl/cvsroot/crypticl/src/random.lisp	2007/01/23 23:55:39	1.7
@@ -161,3 +161,96 @@
     (if (= 0 (mod bitsize 8))
 	n
       (dpb 0  (byte (- 8 (mod bitsize 8)) bitsize) n))))
+
+
+
+;;;;
+;;;; AES version
+;;;;
+;;;; Based on Fortuna from Practical Cryptography.
+;;;;
+(defparameter *random-secure-obj-aes* nil
+  "State for the random number generator")
+
+(defun random-secure-octets-aes (size)
+  "Returns size pseudorandom octets from a cryptographically secure PRNG."
+  (unless *random-secure-obj-aes*
+    (setf *random-secure-obj-aes* (make-SecurePRNG-AES)))
+  
+  (SecurePRNG-octets-aes *random-secure-obj-aes* size))
+
+(defclass SecurePRNG-AES ()
+  ((key 
+    :accessor key
+    :initform #16(0))   
+   (ctr 
+    :accessor ctr
+    :initform #16(0)))
+  (:documentation "Cryptographically secure pseudo random number generator."))
+
+(defun make-SecurePRNG-AES ()
+  "Constructor for the Secure-PRNG class. Assumes that X bits secret/seed is enough."
+  (let ((obj (make-instance 'SecurePRNG-AES)))
+    (format t "ctr after init = ~A~%" (hex (ctr obj)))
+    (reseed obj (high-entropy-octets 16))))
+
+(defmethod reseed ((obj SecurePRNG-AES) new-seed)
+  "Reseed with byte array of high entropy bits."
+  (let ((hasher (make-SHA-256))
+        (keysize (length (key obj))))
+    ;; Concatenate old key with new seed and hash
+    (update hasher (key obj))
+    (setf (key obj) (subseq (hash hasher new-seed) 0 keysize))
+    ;; We run in counter mode so update counter
+    (inc-counter obj)
+    (format t "ctr in reseed = ~A~%" (hex (ctr obj)))
+    obj))
+
+(defmethod inc-counter ((obj SecurePRNG-AES))
+  (int-as-octet-vector-add (ctr obj) 1))
+    
+(defun set-seed-aes (new-seed)
+  "Reseed the global secure PRNG. 
+
+The input should be high entropy bits, ideally 256 bits of entropy or more,
+given as a bignum or a byte array."
+  (unless *random-secure-obj-aes*
+    (setf *random-secure-obj-aes* (make-SecurePRNG)))
+  (typecase new-seed
+    (integer (reseed *random-secure-obj-aes* 
+                     (integer-to-octet-vector new-seed)))
+    (vector (reseed *random-secure-obj-aes* new-seed))))
+
+(defmethod SecurePRNG-octets-aes ((obj SecurePRNG-AES) size)
+  "Returns size pseudorandom octets from a cryptographically secure PRNG."
+  (let ((res (make-array size 
+                         :element-type '(unsigned-byte 8)
+                         :initial-element 0))
+        (tmp (make-array (length (ctr obj)) 
+                         :element-type '(unsigned-byte 8)
+                         :initial-element 0))
+        (ctr-size (length (ctr obj))))
+
+    (do* ((offset 0 (+ offset next))
+          (leftover size (- leftover next))
+          (next (min ctr-size leftover) (min ctr-size leftover)))
+        ((<= leftover 0))
+      ;; the cipher overwrites the input buffer so we cannot use
+      ;; (ctr obj) directly.
+      (octet-vector-copy (ctr obj) 0 ctr-size tmp 0)
+      (aes-crypt-octet-vector tmp (key obj) 'ctr-onetime nil)
+      (octet-vector-copy tmp 0 next res offset)
+      (inc-counter obj))
+    
+    res))
+
+
+(defun foo ()
+  (setf *random-secure-obj-aes* (make-SecurePRNG-AES))
+  (format t "ctr before = ~A~%" (hex (ctr *random-secure-obj-aes*)))
+  (format t "bytes = ~A~%"(hex (random-secure-octets-aes 16)))
+  (format t "ctr = ~A~%" (hex (ctr *random-secure-obj-aes*))))
+
+(defun bar (&optional (size 16))
+  (format t "bytes = ~A~%"(hex (random-secure-octets-aes size)))
+  (format t "ctr = ~A~%" (hex (ctr *random-secure-obj-aes*))))
--- /project/crypticl/cvsroot/crypticl/src/aes.lisp	2007/01/21 01:15:22	1.8
+++ /project/crypticl/cvsroot/crypticl/src/aes.lisp	2007/01/23 23:55:39	1.9
@@ -375,8 +375,17 @@
 	   (aes-ecb-mode data round-key num-rounds doEncrypt))
 	  ((eq mode 'cbc)
 	   (aes-cbc-mode data round-key num-rounds doEncrypt iv))
+          ((eq mode 'ctr-onetime)
+	   (aes-generate-one-time-pad-ctr data round-key num-rounds))
 	  (t (error "No such mode ~A" mode)))))
 
+(defun aes-generate-one-time-pad-ctr (data round-key num-rounds)
+  "data is the counter"
+  (let ((encrypted-block (make-array '(4 4)))
+        (offset 0))
+    (get-block encrypted-block data offset)
+    (aes-encrypt-block encrypted-block round-key num-rounds)
+    (copy-back-block encrypted-block data offset)))
 
 
 (defun aes-cbc-mode (data round-key num-rounds doEncrypt iv)




More information about the Crypticl-cvs mailing list