;;;; sha2.scm (module sha2 (;export sha256-binary-digest sha384-binary-digest sha512-binary-digest sha256-digest sha384-digest sha512-digest sha256-primitive sha384-primitive sha512-primitive) (import chicken scheme foreign) (require-extension message-digest) (declare (fixnum) (no-procedure-checks) ) #> #define SHA2_USE_INTTYPES_H 1 #define SHA2_USE_MEMSET_MEMCPY 1 #define SHA2_LITTLE_ENDIAN 1234 #define SHA2_BIG_ENDIAN 4321 #ifdef C_BIG_ENDIAN # define SHA2_BYTE_ORDER SHA2_BIG_ENDIAN #endif #ifdef C_LITTLE_ENDIAN # define SHA2_BYTE_ORDER SHA2_LITTLE_ENDIAN #endif #include "sha2-base.c" #undef SHA2_LITTLE_ENDIAN #undef SHA2_BIG_ENDIAN #undef SHA2_BYTE_ORDER #undef SHA2_USE_MEMSET_MEMCPY #undef SHA2_USE_INTTYPES_H <# ;;; 256 (define-foreign-variable context-size-256 int "sizeof(SHA256_CTX)") (define sha256-init (foreign-lambda void "SHA256_Init" c-pointer)) (define sha256-update (foreign-lambda void "SHA256_Update" c-pointer pointer int)) (define sha256-final (foreign-lambda void "SHA256_Final" c-pointer pointer)) (define-constant digest-length-256 32) ; SHA256_DIGEST_LENGTH (define (sha256-binary-digest obj) (make-binary-message-digest obj context-size-256 digest-length-256 sha256-init sha256-update sha256-final 'sha256-binary-digest)) (define (sha256-digest obj) (make-message-digest obj context-size-256 digest-length-256 sha256-init sha256-update sha256-final 'sha256-digest)) (define (sha256-primitive) (make-message-digest-primitive context-size-256 digest-length-256 sha256-init sha256-update sha256-final 'sha256-primitive)) ;;; 384 (define-foreign-variable context-size-384 int "sizeof(SHA384_CTX)") (define sha384-init (foreign-lambda void "SHA384_Init" c-pointer)) (define sha384-update (foreign-lambda void "SHA384_Update" c-pointer pointer int)) (define sha384-final (foreign-lambda void "SHA384_Final" c-pointer pointer)) (define-constant digest-length-384 48) ; SHA384_DIGEST_LENGTH (define (sha384-binary-digest obj) (make-binary-message-digest obj context-size-384 digest-length-384 sha384-init sha384-update sha384-final 'sha384-binary-digest)) (define (sha384-digest obj) (make-message-digest obj context-size-384 digest-length-384 sha384-init sha384-update sha384-final 'sha384-digest)) (define (sha384-primitive) (make-message-digest-primitive context-size-384 digest-length-384 sha384-init sha384-update sha384-final 'sha384-primitive)) ;;; 512 (define-foreign-variable context-size-512 int "sizeof(SHA512_CTX)") (define sha512-init (foreign-lambda void "SHA512_Init" c-pointer)) (define sha512-update (foreign-lambda void "SHA512_Update" c-pointer pointer int)) (define sha512-final (foreign-lambda void "SHA512_Final" c-pointer pointer)) (define-constant digest-length-512 64) ; SHA512_DIGEST_LENGTH (define (sha512-binary-digest obj) (make-binary-message-digest obj context-size-512 digest-length-512 sha512-init sha512-update sha512-final 'sha512-binary-digest)) (define (sha512-digest obj) (make-message-digest obj context-size-512 digest-length-512 sha512-init sha512-update sha512-final 'sha512-digest)) (define (sha512-primitive) (make-message-digest-primitive context-size-512 digest-length-512 sha512-init sha512-update sha512-final 'sha512-primitive)) ) ;module sha2