11 Commits
6 ... 7.2.0

Author SHA1 Message Date
cde6e58eac Updating to work with CHICKEN 5.
Updated to work with CHICKEN 5. Thanks to Andy Bennett
<andyjpb@ashurst.eu.org> for doing most of the work!

Moved hmac.release-info* uri targz to point at code.thintz.com instead
of github.
2019-01-27 17:35:18 -08:00
ae19b8a2a5 Releasing version 7.1.0. 2017-09-07 17:24:56 -07:00
b980254c59 Merge pull request #3 from LemonBoy/mdapi
Use the message-digest API
2017-09-07 17:17:29 -07:00
LemonBoy
d7634f2773 Use the RFC2202 test vectors 2017-08-27 13:42:19 +02:00
LemonBoy
e7fd2b3cc6 Rewrite as a message-digest primitive
The block size is an inherent property of the hashing function being
used and should not be manipulated by the user.
2017-08-27 13:39:19 +02:00
Thomas Hintz
679dd41240 Release version 7.0.1. 2013-09-24 18:29:16 -07:00
Thomas Hintz
a0a1bab4c1 Don't destructively modifiy args. 2013-09-24 18:27:48 -07:00
Thomas Hintz
d759083e9d Fix invalid arg type bug introduced in b52b480. 2013-09-24 18:25:31 -07:00
b52b480a81 Cleanup formatting. 2013-09-24 15:38:33 -07:00
ffe7b3bfe3 remove release 5 because it doesnt exist 2012-02-01 21:19:59 -08:00
4029fed7bf correct version number 2012-01-15 03:14:02 -08:00
6 changed files with 92 additions and 39 deletions

11
hmac.egg Normal file
View File

@@ -0,0 +1,11 @@
; author: Thomas Hintz
; email: t@thintz.com
; license: bsd
((license "BSD")
(category crypt)
(dependencies message-digest)
(test-dependencies test sha1 string-utils)
(author "Thomas Hintz")
(synopsis "HMAC provides a HMAC using the message-digest interface.")
(components (extension hmac)))

View File

@@ -1,9 +1,10 @@
(repo git "git://github.com/ThomasHintz/chicken-scheme-{egg-name}.git") ; optional (uri targz "https://code.thintz.com/chicken-scheme-{egg-name}/snapshot/chicken-scheme-{egg-name}-{egg-release}.tar.gz")
(uri targz "https://github.com/ThomasHintz/chicken-scheme-{egg-name}/tarball/{egg-release}")
(release "1") (release "1")
(release "2") (release "2")
(release "3") (release "3")
(release "4") (release "4")
(release "5")
(release "6") (release "6")
(release "7")
(release "7.0.1")
(release "7.1.0")
(release "7.2.0")

View File

@@ -0,0 +1,2 @@
(uri targz "https://code.thintz.com/chicken-scheme-{egg-name}/snapshot/chicken-scheme-{egg-name}-{egg-release}.tar.gz")
(release "7.2.0")

View File

@@ -3,19 +3,46 @@
; license: bsd ; license: bsd
(module hmac (module hmac
(hmac) (hmac hmac-primitive)
(import scheme chicken srfi-4 srfi-13) (import scheme)
(use message-digest-port)
; taken from example at http://wiki.call-cc.org/drupal-xml-rpc (cond-expand
(define (hmac key digest-primitive #!optional (block-size 64))
(when (> (string-length key) block-size) (chicken-4
(set! key (call-with-output-digest digest-primitive (cut display key <>) 'string))) (import chicken srfi-13)
(set! key (string-pad-right key block-size (integer->char 0))) (use message-digest-basic message-digest-item message-digest-update-item))
(let ((ipad (string-map (lambda (c) (integer->char (bitwise-xor (char->integer c) #x36))) key))
(opad (string-map (lambda (c) (integer->char (bitwise-xor (char->integer c) #x5c))) key))) (chicken-5
(import (chicken base) (chicken bitwise) srfi-13)
(import message-digest-basic message-digest-item message-digest-update-item)))
(define (hmac-primitive key digest-primitive)
(let ((block-size (message-digest-primitive-block-length digest-primitive))
(key_ key))
(when (> (string-length key_) block-size)
(set! key_ (message-digest-string digest-primitive key_ 'string)))
(set! key_ (string-pad-right key_ block-size (integer->char 0)))
(let ((ipad (string-map (lambda (c) (integer->char (bitwise-xor (char->integer c) #x36))) key_))
(opad (string-map (lambda (c) (integer->char (bitwise-xor (char->integer c) #x5c))) key_)))
(make-message-digest-primitive
(lambda ()
(initialize-message-digest digest-primitive))
(message-digest-primitive-digest-length digest-primitive)
(lambda (inner)
(message-digest-update-string inner ipad))
(lambda (inner blob n)
(message-digest-update-object inner blob))
(lambda (inner x)
(finalize-message-digest!
(let ((outer (initialize-message-digest digest-primitive)))
(message-digest-update-string outer opad)
(message-digest-update-string outer (finalize-message-digest inner 'string))
outer)
x))))))
(define (hmac key digest-primitive #!optional (result-form 'string))
(lambda (message) (lambda (message)
(call-with-output-digest digest-primitive (cut display (string-append opad (call-with-output-digest digest-primitive (cut display (string-append ipad message) <>) 'string)) <>) 'string)))) (message-digest-object (hmac-primitive key digest-primitive) message result-form)))
) )

View File

@@ -11,5 +11,4 @@
; Files to install for your extension: ; Files to install for your extension:
'("hmac.o" "hmac.so" "hmac.import.so") '("hmac.o" "hmac.so" "hmac.import.so")
; Assoc list with properties for your extension: ; Assoc list with properties for your extension:
'((version 6) '((static "hmac.o"))) ;; for static linking
(static "hmac.o"))) ;; for static linking

View File

@@ -2,28 +2,41 @@
; email: t@thintz.com ; email: t@thintz.com
; license: bsd ; license: bsd
(use test) (cond-expand
(use sha1 string-utils hmac)
(test-group "HMAC" (chicken-4
(test "Short Key and Message" (use test)
"64608bd9aa157cdfbca795bf9a727fc191a50b66" (use sha1 string-utils hmac))
(string->hex ((hmac "hi" (sha1-primitive) 64) "food is good")))
(test "Long Key, Short Message" (chicken-5
"511387216297726a7947c6006f5be89711662b1f" (import test)
(string->hex ((hmac "hi my name is the big bad wolf" (sha1-primitive) 64) "hi"))) (import sha1 string-hexadecimal hmac)))
(test "Short Key, Long Message (Longer than blocksize)"
"73dc948bab4e0c65b1e5d18ae3694a39a4788bee"
(string->hex ((hmac "key" (sha1-primitive) 64) "this is a really long message that is going to being run through this hmac test to make sure that it works correctly.")))
(test "Larger Blocksize" (test-group "RFC2202 test vectors"
"3dbf833dc1e13c88f0366efaa2ec7d89399c5c1a" (define (testv key msg expected)
(string->hex ((hmac "key key key" (sha1-primitive) 256) "hi what is your name?"))) (test "Vector" expected (string->hex ((hmac key (sha1-primitive)) msg))))
(test "Smaller Blocksize" (testv (make-string 20 (integer->char #x0b))
"dd9547893c27d1af459601bb571c6da8941ac00c" "Hi There"
(string->hex ((hmac "key key key" (sha1-primitive) 16) "hi what is your name?")))) "b617318655057264e28bc0b6fb378c8ef146be00")
(testv "Jefe"
"what do ya want for nothing?"
"effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
(testv "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19"
(make-string 50 (integer->char #xcd))
"4c9007f4026250c6bc8414f9bf50c86c2d7235da")
(testv (make-string 20 (integer->char #xaa))
(make-string 50 (integer->char #xdd))
"125d7342b9ac11cd91a39af48aa17b4f63f175d3")
(testv (make-string 20 (integer->char #x0c))
"Test With Truncation"
"4c1a03424b55e07fe7f27be1d58bb9324a9a5a04")
(testv (make-string 80 (integer->char #xaa))
"Test Using Larger Than Block-Size Key - Hash Key First"
"aa4ae5e15272d00e95705637ce8a3b55ed402112")
(testv (make-string 80 (integer->char #xaa))
"Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data"
"e8e99d0f45237d786d6bbaa7965c7808bbff1a91"))
(test-exit) (test-exit)