1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
;; @module crypto.lsp
;; @description SSL crypto functions for MD5 and SHA-1 hashing
;; @version 1.01 - initial release
;; @version 1.02 - renamed to crypto, new lib detection
;; @version 1.04 - added hmac encryption from amazon.com query API
;; @version 1.05 - added added gnuwin32/bin/libeay32.dll for crypto on Win32
;; @version 1.06 - added ripemd160
;; @version 1.07 - added libcrypto for OpenBSD and tested for 64-bit
;; @version 1.08 - help text corrections
;; @version 1.09 - added lib path for Windows 7
;; @version 1.10 - added SHA256
;; @version 1.11 - added path for UBUNTU Linux 13.04
;; @version 1.12 - added path for UBUNTU Linux 12.04 and CentOS, removed old
;; @version 1.13 - fix for crypto:hmac. Thanks Cormullion, March 2014
;; @version 1.14 - starting v10.6.3 import using "cdecl" on Windows
;; @version 1.15 - added path for Debian Jessie
;; @author Lutz Mueller 2007, Martin Quiroga 2007, Norman Deppenbroek 2009,
;; @author Marc Hildman, 2011
;;
;; <h2>Module for SSL lib crypto bindings</h2>
;; This modules imports functions for the MD5 and SHA-1 hashing algorithms described
;; here: @link http://www.ietf.org/rfc/rfc3174.txt http://www.ietf.org/rfc/rfc3174.txt .
;; The crypto library is part of the @link http://www.openssl.org/ OpenSSL libraries.
;;
;; To use this module include the following 'load' statement at the
;; beginning of the program file:
;; <pre>
;; (load "/usr/share/newlisp/modules/crypto.lsp")
;; ; or as a shorter alternative
;; (module "crypto.lsp")
;; </pre>
;; <h2>Requirements:</h2>
;; On Mac OS X, UBUNTU and many other Linux, BSDs and other UNIX installations
;; <tt>libcrypto.so</tt> is installed by default as part of the OpenSSL
;; libraries in <tt>usr/lib/libcrypto.so</tt>. If loading this module
;; finishes with an error message the path of the library should be corrected.
;; For MS Windows a library is available at
;; @link http://gnuwin32.sourceforge.net/ http://gnuwin32.sourceforge.net/ .
;;
;; This module has been tested on Mac OS X, UBUNTU Linux and FreeBSD.
(context 'crypto)
(set 'library "libcrypto.so")
(import library "MD5" option)
(import library "RIPEMD160" option)
(import library "SHA1" option)
(import library "SHA256" option)
;; @syntax (crypto:md5 <string> <bool-raw>)
;; @param <string> The string buffer for which to calculate a MD5 hash
;; @param <bool-raw> Return the raw binay buffer when 'true'.
;; @return The 16 Byte MD5 hash as a 32 Byte long hex string or as a 16 byte binary buffer.
;; @example
;; (crypto:md5 "ABC") => "902fbdd2b1df0c4f70b4a5d23525e932"
;;
;; (crypto:md5 (read-file "newlisp-9.1.0.tgz")) => "46c79c93e904df35c6a8474ace406c92"
(define (md5 str raw-flag)
(if raw-flag
(let (buff (dup "\000" 16))
(cpymem (MD5 str (length str) 0) buff 16)
buff)
(join
(map (lambda (x) (format "%02x" (& x 0xff)))
(unpack (dup "c" 16) (MD5 str (length str) 0))))
)
)
;; @syntax (crypto:sha1 <string> <bool-raw>)
;; @param <string> The string buffer for which to calculate a SHA-1 hash
;; @param <bool-raw> Return the raw binay buffer when 'true'.
;; @return The 20 Byte SHA-1 hash as a 40 Byte long hex string or as a 20 byte binary buffer.
;; @example
;; (crypto:sha1 "ABC") => "3c01bdbb26f358bab27f267924aa2c9a03fcfdb8"
;;
;; (crypto:sha1 (read-file "newlisp-9.1.0.tgz")) => "2127a9c487f338b00f36cfd60b5f33d27b8d0010"
(define (sha1 str raw-flag)
(if raw-flag
(let (buff (dup "\000" 20))
(cpymem (SHA1 str (length str) 0) buff 20)
buff)
(join
(map (lambda (x) (format "%02x" (& x 0xff)))
(unpack (dup "c" 20) (SHA1 str (length str) 0)))
)
)
)
;; @syntax (crypto:sha256 <string> <bool-raw>)
;; @param <string> The string buffer for which to calculate a SHA-256 hash
;; @param <bool-raw> Return the raw binay buffer when 'true'.
;; @return The 32 Byte SHA-1 hash as a 64 Byte long hex string or as a 32 byte binary buffer.
;; @example
;; (crypto:sha256 "ABC") => "b5d4045c3f466fa91fe2cc6abe79232a1a57cdf104f7a26e716e0a1e2789df78"
;;
(define (sha256 str raw-flag)
(if raw-flag
(let (buff (dup "\000" 32))
(cpymem (SHA256 str (length str) 0) buff 32)
buff)
(join
(map (lambda (x) (format "%02x" (& x 0xff)))
(unpack (dup "c" 32) (SHA256 str (length str) 0)))
)
)
)
;; @syntax (crypto:hmac <func-hash> <str-message> <str-key>)
;; @param <func-hash> The hash function to use.
;; @param <str-message> The message to encrypt.
;; @param <str-key> The encryption key.
;;
;; This function is part of the amazon.com
;; @link http://docs.amazonwebservices.com/AWSEC2/2007-08-29/DeveloperGuide/using-query-api.html Query-API
;; and based on @link http://www.faqs.org/rfcs/rfc2104.html RFC2104 - HMAC: Keyed-Hashing for Message Authentication.
;;
;; @example
;; (set 'output (crypto:hmac crypto:md5 "Hello World" "secret"))
;; (unpack (dup "c" (length output)) output)
;; => (107 59 -76 66 117 -119 -35 -31 -7 -121 90 55 -109 -68 32 98)
(define (hmac hash_fn msg_str key_str , blocksize opad ipad)
(set 'blocksize 64)
(set 'opad (dup "\x5c" blocksize))
(set 'ipad (dup "\x36" blocksize))
(if (> (length key_str) blocksize)
;; (set 'key_str (get-true-str (hash_fn key_str)))
(set 'key_str (hash_fn key_str true))
)
(set 'key_str (append key_str (dup "\000" (- blocksize (length key_str))))) ;; padding key with binary zeros
(set 'opad (encrypt opad key_str))
(set 'ipad (encrypt ipad key_str))
(hash_fn (append opad (hash_fn (append ipad msg_str) true)) true)
)
;; @syntax (crypto:ripemd160 <string> <bool-raw>)
;; @param <string> The string buffer for which to calculate a RIPEMD160 hash
;; @param <bool-raw> Return the raw binay buffer when 'true'.
;; @return The 20 Byte RIPEMD160 hash as a 40 Byte long hex string or as a 20 byte binary buffer.
;; @example
;; (crypto:ripemd160 "ABC") => "df62d400e51d3582d53c2d89cfeb6e10d32a3ca6"
;;
;; (crypto:ripemd160 (read-file "newlisp.exe")) => "9c1185a5c5e9fc54612808977ee8f548b2258d31"
(define (ripemd160 str raw-flag)
(if raw-flag
(let (buff (dup "\000" 20))
(cpymem (RIPEMD160 str (length str) 0) buff 20)
buff)
(join
(map (lambda (x) (format "%02x" (& x 0xff)))
(unpack (dup "c" 20) (RIPEMD160 str (length str) 0)))
)
)
)
; eof ;
|