;;;; 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 (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) (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)) ) ;;; Message Digest Algorithm API ;; (define (check-message-digest-arguments loc ctx-info digest-len init update final block-len name) (unless (or (procedure? ctx-info) (positive-fixnum? 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 (or (symbol? name) (string? name)) (error-argument-type loc name "symbol or string" 'name) ) ) ;; (define-record-type message-digest-primitive (*make-message-digest-primitive ctxi digest-len init update final block-len name) 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) ) (define-check+error-type message-digest-primitive) (define (make-message-digest-primitive ctx-info digest-len init update final . rest) (let-values (((block-len rest) (if (and (not (null? rest)) (number? (car rest))) (values (car rest) (cdr rest)) (values 4 rest) ) ) ) (let ((name (if (null? rest) (gensym "mdp") (car rest) ) ) ) (check-message-digest-arguments 'make-message-digest-primitive ctx-info digest-len init update final block-len name) (*make-message-digest-primitive ctx-info digest-len init update final block-len name) ) ) ) ) ;module message-digest-primitive