;;;; message-digest-primitive.scm ;;;; Kon Lovett, Jan '06 (message-digest.scm) ;;;; Kon Lovett, May '10 (message-digest.scm) ;;;; Kon Lovett, Apr '12 ;;;; Kon Lovett, Aug '17 ;; Issues ;; ;; - see tiger-hash , sha2 , sha1 , ripemd , md5 , hashes ;; ;; - synthesize raw-update from update (module message-digest-primitive (;export ; Algorithm API make-message-digest-primitive message-digest-primitive? check-message-digest-primitive error-message-digest-primitive message-digest-primitive-name message-digest-primitive-block-length message-digest-primitive-context-info message-digest-primitive-digest-length message-digest-primitive-init message-digest-primitive-update message-digest-primitive-final message-digest-primitive-raw-update) (import scheme) (import chicken) (import (only type-checks define-check+error-type check-positive-fixnum check-procedure) (only type-errors error-argument-type)) (require-library type-checks type-errors) ;;; Support ;; (define (positive-fixnum? obj) (and (fixnum? obj) (positive? obj)) ) (define (primitive-ctx-info? obj) (or (procedure? obj) (positive-fixnum? obj)) ) (define (primitive-name? obj) (or (symbol? obj) (string? obj)) ) ;;; Message Digest Algorithm API ;; (define (check-message-digest-arguments loc ctx-info digest-len init update final block-len name raw-update) (unless (primitive-ctx-info? ctx-info) (error-argument-type loc ctx-info "positive-fixnum or procedure" 'context-info) ) (check-positive-fixnum loc digest-len 'digest-length) (check-procedure loc init 'digest-initializer) (check-procedure loc update 'digest-updater) (check-procedure loc final 'digest-finalizer) (check-positive-fixnum loc block-len 'block-length) (unless (primitive-name? name) (error-argument-type loc name "symbol or string" 'name) ) (when raw-update (check-procedure loc raw-update 'digest-raw-updater) ) ) ;; (define-record-type message-digest-primitive (*make-message-digest-primitive ctxi digest-len init update final block-len name raw-update) message-digest-primitive? (ctxi message-digest-primitive-context-info) (digest-len message-digest-primitive-digest-length) (init message-digest-primitive-init) (update message-digest-primitive-update) (final message-digest-primitive-final) (block-len message-digest-primitive-block-length) (name message-digest-primitive-name) (raw-update message-digest-primitive-raw-update) ) (define-check+error-type message-digest-primitive) (define (make-message-digest-primitive ctx-info digest-len init update final . rest) ; (define (pull-arg args pred defprc) (if (and (not (null? args)) (pred (car args))) (values (car args) (cdr args)) (values (defprc) args) ) ) ; (let*-values (((block-len rest) (pull-arg rest number? (lambda () 4))) ((name rest) (pull-arg rest primitive-name? (lambda () (gensym 'message-digest-primitive)))) ((raw-update rest) (pull-arg rest procedure? (lambda () #f))) ) (check-message-digest-arguments 'make-message-digest-primitive ctx-info digest-len init update final block-len name raw-update) (*make-message-digest-primitive ctx-info digest-len init update final block-len name raw-update) ) ) ) ;module message-digest-primitive