;;;; sha256-api.scm -*- Scheme -*- ;;;; Kon Lovett, Jul '18 #> #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 #define SHA256 #include "sha2-base.c" #undef SHA256 #undef SHA2_LITTLE_ENDIAN #undef SHA2_BIG_ENDIAN #undef SHA2_BYTE_ORDER #undef SHA2_USE_MEMSET_MEMCPY #undef SHA2_USE_INTTYPES_H static void shim_SHA256_Final(SHA256_CTX* context, sha2_byte digest[]) { SHA256_Final(digest, context); } <# (module sha256-api (;export name version context-size digest-length block-length init update final raw-update) (import scheme (chicken base) (chicken foreign)) ;; (define name 'sha256) (define version "1.0.1") (define-foreign-variable digest_length unsigned-int "SHA256_DIGEST_LENGTH") (define-foreign-variable block_length unsigned-int "SHA256_BLOCK_LENGTH") (define-foreign-variable context_size unsigned-int "sizeof(SHA256_CTX)") (define context-size context_size) (define digest-length digest_length) (define block-length block_length) (define init (foreign-lambda void "SHA256_Init" c-pointer)) (define update (foreign-lambda void "SHA256_Update" c-pointer scheme-pointer unsigned-int)) (define final (foreign-lambda void "shim_SHA256_Final" c-pointer scheme-pointer)) (define raw-update (foreign-lambda void "SHA256_Update" c-pointer c-pointer unsigned-int)) ) ;module sha256-api