(Arne Babenhauserheide)
2016-04-06: safepassword: provide 3 implementations safepassword: provide 3 implementations
diff --git a/examples/safepassword.w b/examples/safepassword.w
--- a/examples/safepassword.w
+++ b/examples/safepassword.w
@@ -11,22 +11,73 @@ define-module : examples safepassword
import
only (srfi srfi-27) random-source-make-integers
. make-random-source random-source-randomize!
- only (srfi srfi-1) second
+ only (srfi srfi-1) second third iota
+ srfi srfi-42
+
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 : flatten e
+ cond
+ : pair? e
+ ` ,@(flatten (car e)) ,@(flatten (cdr e))
+ : null? e
+ list
+ else
+ list e
+
+
+define : password/srfi-42 length
+ let
+ : qwertysafeletters "0123456789ABCDEFGHJKLMNPQRSTUVWXabcdefghijkmnopqrstuvwx"
+ ;; that’s newbase60 without yz_
+ ;; means 5.78 bits of entropy per letter.
+ delimiters ",.!?-"
+ ;; that’s 2.32 bits of entropy per delimiter
+ list->string
+ append-ec (: i (iota length 1))
+ cons : randomletter qwertysafeletters
+ if : and (not (= i length)) : zero? : modulo i 4
+ cons : randomletter delimiters
+ list
+ list
+
+
+define : password/map length
+ let
+ : qwertysafeletters "0123456789ABCDEFGHJKLMNPQRSTUVWXabcdefghijkmnopqrstuvwx"
+ ;; that’s newbase60 without yz_
+ ;; means 5.78 bits of entropy per letter.
+ delimiters ",.!?-"
+ ;; that’s 2.32 bits of entropy per delimiter
+ list->string
+ flatten
+ map
+ lambda : i
+ let
+ : letter : randomletter qwertysafeletters
+ if : and (not (= i length)) : zero? : modulo i 4
+ list letter
+ randomletter delimiters
+ list letter
+ iota length 1
+
+
define : password length
let
- : quertysafeletters "0123456789ABCDEFGHJKLMNPQRSTUVWXabcdefghijkmnopqrstuvwx"
+ : qwertysafeletters "0123456789ABCDEFGHJKLMNPQRSTUVWXabcdefghijkmnopqrstuvwx"
;; that’s newbase60 without yz_
;; means 5.78 bits of entropy per letter.
delimiters ",.!?-"
@@ -37,19 +88,28 @@ define : password length
if : zero? remaining
reverse-list->string letters
fill
- cons : randomletter quertysafeletters
+ cons : randomletter qwertysafeletters
if : and (not (= length remaining)) : zero? : modulo remaining 4
cons : randomletter delimiters
. letters
. letters
- remaining 1
+
define : main args
let
:
len
- if : = 2 : length args
+ if : <= 2 : length args
string->number : second args
. 16
- display : password len
- newline
+ let
+ : idx (if (> 3 (length args)) 1 (string->number (third args)))
+ cond
+ : = idx 1
+ display : password len
+ : = idx 2
+ display : password/map len
+ : = idx 3
+ display : password/srfi-42 len
+ newline