1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
format ELF64 executable
macro genclass class, class_len
{
;; Generate 16 bits (smallest) of randomness from the cpu
rdrand ax
;; Modulo into len range to index in
xor rdx, rdx
mov rbx, class_len
div bx
;; Save output letter into out_buf, bump rcx
add rdx, class
mov rdx, [rdx]
mov [rcx], rdx
inc rcx
inc rsi
}
segment readable executable
entry main
main:
;; No arg preload case
cmp [rsp], word 1
jne argparse
mov r8, qword 3
mov r9, qword 2
mov r10, qword 3
jmp generate
argparse:
;; Check args (need 3)
cmp [rsp], word 3
jle fail
;; load arg1
mov r8, [rsp+16]
mov r8, [r8]
and r8, 0xFF
sub r8, 48
;; load arg2
mov r9, [rsp+24]
mov r9, [r9]
and r9, 0xFF
sub r9, 48
;; load arg3
mov r10, [rsp+32]
mov r10, [r10]
and r10, 0xFF
sub r10, 48
generate:
;; Store which output byte we're up to in rcx
mov rcx, out_buf
;; Store chars generated in rsi
xor rsi, rsi
tripleter:
genclass consonants, consonants_len
genclass vowels, vowels_len
genclass consonants, consonants_len
dec r8
test r8, r8
jnz tripleter
symboler:
genclass symbols, symbols_len
dec r9
test r9, r9
jnz symboler
numberer:
genclass numbers, numbers_len
dec r10
test r10, r10
jnz numberer
;; Append new line to string
mov [rcx], word 10
inc rsi
;; Special case to caps the first character
xor rax, rax
mov al, byte [out_buf]
sub al, 32
mov rbx, out_buf
mov [rbx], al
;; Write
mov rdi, 1 ;; stdout
mov rdx, rsi
mov rsi, out_buf
mov rax, 0x01
syscall
;; Exit (code 0)
mov rdi, 0
mov rax, 0x3c
syscall
fail:
;; Write
mov rdi, 1 ;; stdout
mov rsi, usage
mov rdx, usage_len
mov rax, 0x01
syscall
;; Exit 1
mov rdi, 1
mov rax, 0x3c
syscall
segment readable writeable
usage db "usage: passmgen [<triplet#> <symbol#> <number#>]", 10
usage_len = $ - usage
numbers db "0123456789"
numbers_len = $ - numbers
vowels db "aeiou"
vowels_len = $ - vowels
consonants db "bcdfghjklmnpqrstvwxyz"
consonants_len = $ - consonants
symbols db "!@#$%&()-=_+[]{}\\|;<>/?."
symbols_len = $ - symbols
out_buf rb 64
|