(import (chicken base)) (import (chicken foreign)) (import crypto-tools) (import format) (define (make-next-ctr bsize) (lambda (iv) (let ((origiv '())) (if (null? origiv) (set! origiv iv)) (let* ((cnt origiv) (ocnt cnt) (ncnt ((foreign-lambda* void ((blob in) (int blocksize)) " char cur; int block; for(block=blocksize-1;block>=0;block--) { cur = in[block]; if (cur >= 255) { in[block] = 0; continue; } in[block] = cur+1; break; } ") cnt bsize))) (set! cnt ncnt) ocnt)))) (define iv (make-next-ctr 16)) (format "starts:~A~%" (iv (hexstring->blob "0000000000000000"))) (format "it is:~A~%" (iv 0)) (format "it is:~A~%" (iv 0)) (format "it is:~A~%" (iv 0)) (format "it is:~A~%" (iv 0)) (format "it is:~A~%" (iv 0)) (format "it is:~A~%" (iv 0))