summaryrefslogtreecommitdiff
path: root/pasmgen.asm
blob: ffcce2c0b7ccf96f37b0c3e4d9d9da96a1405113 (plain) (blame)
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