USING: kernel math sequences namespaces crypto math-contrib ; IN: crypto-internals ! Blum Blum Shub, M = pq TUPLE: bbs x n ; : generate-bbs-primes ( numbits -- p q ) #! two primes congruent to 3 (mod 4) dup [ random-miller-rabin-prime==3(mod4) ] 2apply ; IN: crypto : make-bbs ( numbits -- blum-blum-shub ) #! returns a Blum-Blum-Shub tuple generate-bbs-primes * [ find-relative-prime ] keep ; IN: crypto-internals SYMBOL: blum-blum-shub 256 make-bbs global [ blum-blum-shub set ] bind IN: crypto : next-bbs-bit ( bbs -- bit ) #! x = x^2 mod n, return low bit of calculated x [ [ bbs-x ] keep 2 swap bbs-n ^mod ] keep [ set-bbs-x ] keep bbs-x 1 bitand ; SYMBOL: temp-bbs : (bbs-bits) ( numbits bbs -- n ) temp-bbs set [ [ temp-bbs get next-bbs-bit ] swap make-bits ] with-scope ; : random-bbs-bits* ( numbits bbs -- n ) (bbs-bits) ; : random-bbs-bits ( numbits -- n ) blum-blum-shub get (bbs-bits) ;