Taylor Venable avatar Taylor Venable committed f4511cc

Code to generate 3DES keys

Comments (0)

Files changed (1)

+;;; Copyright (c) 2011, Taylor Venable
+;;; All rights reserved.
+;;;
+;;; Redistribution and use in source and binary forms, with or without
+;;; modification, are permitted provided that the following conditions are met:
+;;;
+;;;      * Redistributions of source code must retain the above copyright
+;;;        notice, this list of conditions and the following disclaimer.
+;;;
+;;;      * Redistributions in binary form must reproduce the above copyright
+;;;        notice, this list of conditions and the following disclaimer in the
+;;;        documentation and/or other materials provided with the distribution.
+;;;
+;;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+;;; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+;;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+;;; ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+;;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+;;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+;;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+;;; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+;;; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+;;; POSSIBILITY OF SUCH DAMAGE.
+
+(define-module crypto.des
+  (export generate-key))
+
+(use gauche.uvector)
+(use math.mt-random)
+(use srfi-43)
+(use srfi-60)
+
+(define mt (make <mersenne-twister> :seed (sys-time)))
+
+(define (u32vector->u8vector in)
+  (let ((out (make-u8vector (* (u32vector-length in) 4))))
+    (do ((i 0 (+ i 1)))
+        ((= i (u32vector-length in)) out)
+      (do ((j 0 (+ j 1)))
+          ((= j 4) out)
+        (u8vector-set! out (+ (* i 4) j)
+          (bitwise-and (ash (u32vector-ref in i) (- (* 8 j) 24)) #xFF))))))
+
+(define (set-parity key)
+  (if (not (u8vector? key))
+    (error "key must be a <u8vector>"))
+  (if (not (= (u8vector-length key) 24))
+    (error "key must be 24 bytes (192 bits) long"))
+  (let ((key (u8vector->vector key)))
+    (vector->u8vector
+      (vector-map
+        (lambda (_ n)
+          (let ((n (bitwise-and n #xFE)))
+            (if (odd? (bit-count n)) n
+              (bitwise-ior n #x01))))
+        key))))
+
+(define (generate-key keying-option)
+  (case keying-option
+    ((ede-3)
+     (let ((key (make-u32vector 6)))
+       (mt-random-fill-u32vector! mt key)
+       (set-parity (u32vector->u8vector key))))
+    ((ede ede-2)
+     (let ((key (make-u32vector 6)))
+       (mt-random-fill-u32vector! mt key)
+       (u32vector-copy! key 4 key 0 2)
+       (set-parity (u32vector->u8vector key))))))
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.