(Arne Babenhauserheide)
2016-04-06: implement safe password generator. implement safe password generator.
diff --git a/examples/safepassword.w b/examples/safepassword.w
--- a/examples/safepassword.w
+++ b/examples/safepassword.w
@@ -8,5 +8,48 @@ exec guile -L $(dirname $(dirname $(real
define-module : examples safepassword
. #:export : password
+import
+ only (srfi srfi-27) random-source-make-integers
+ . make-random-source random-source-randomize!
+ only (srfi srfi-1) second
+
+define random-source : make-random-source
+random-source-randomize! random-source
+
+define random-integer
+ random-source-make-integers random-source
+
+define : randomletter letters
+ string-ref letters
+ random-integer
+ string-length letters
+
+define : password length
+ let
+ : quertysafeletters "0123456789ABCDEFGHJKLMNPQRSTUVWXabcdefghijkmnopqrstuvwx"
+ ;; that’s newbase60 without yz_
+ ;; means 5.78 bits entropy per letter.
+ delimiters ",.!?-+"
+ ;; that’s 2.5 bits entropy per delimiter
+ let fill
+ : letters '()
+ remaining length
+ if : zero? remaining
+ reverse-list->string letters
+ fill
+ cons : randomletter quertysafeletters
+ if : and (not (= length remaining)) : zero? : modulo remaining 4
+ cons : randomletter delimiters
+ . letters
+ . letters
+ - remaining 1
+
define : main args
- display "password\n"
+ let
+ :
+ len
+ if : = 2 : length args
+ string->number : second args
+ . 16
+ display : password len
+ newline