-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPRF.inc
executable file
·153 lines (131 loc) · 4.17 KB
/
PRF.inc
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
; prf.inc - Pseudo Random function based on HMAC
;
; Copyright (C) 2016 Denis Karpenko
;
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program. If not, see <http://www.gnu.org/licenses/>.
;PRF(secret, seed) = HMAC_hash(secret, A(1) + seed) +
; HMAC_hash(secret, A(2) + seed) +
; HMAC_hash(secret, A(3) + seed)
;A() is defined as:
;
; A(0) = seed
; A(i) = HMAC_hash(secret, A(i-1))
A_1 rb l
A_2 rb l
A_3 rb l
A_4 rb l
;prf_output rb l*4
tmp_buffer rb 2*b
; input ebx->secret,edx=secret_length, eax->seed, esi=seed_length
proc prf _label, label_size, _output
push eax
push esi
push eax
push esi
push eax
push esi
push eax
push esi
push eax
push esi
stdcall hmac_setkey, tmp_buffer
;firstly calculate As
;label_addition
mov eax,[_label]
mov edi,[label_size]
stdcall hmac_hash,tmp_buffer
pop edi
pop eax
stdcall hmac_add, tmp_buffer
mov edi,A_1
stdcall hmac_final, tmp_buffer
; A_1 was calculated
mov eax,A_1
mov edi,l
stdcall hmac_hash, tmp_buffer
mov edi,A_2
stdcall hmac_final, tmp_buffer
; A_2 was calculated
mov eax,A_2
mov edi,l
stdcall hmac_hash, tmp_buffer
mov edi,A_3
stdcall hmac_final, tmp_buffer
; A_3 was calculated
mov eax,A_3
mov edi,l
stdcall hmac_hash, tmp_buffer
mov edi,A_4
stdcall hmac_final, tmp_buffer
; A_4 was calculated
mov eax,A_1
mov edi,l
stdcall hmac_hash, tmp_buffer
;label_addition
mov eax,[_label]
mov edi,[label_size]
stdcall hmac_add,tmp_buffer
pop edi
pop eax
stdcall hmac_add, tmp_buffer
mov edi,[_output]
stdcall hmac_final, tmp_buffer
; prf_output= HMAC_hash(secret, A(1) + seed)
mov eax,A_2
mov edi,l
stdcall hmac_hash, tmp_buffer
;label_addition
mov eax,[_label]
mov edi,[label_size]
stdcall hmac_add,tmp_buffer
pop edi
pop eax
stdcall hmac_add, tmp_buffer
mov edi,[_output]
add edi,l
stdcall hmac_final, tmp_buffer
; prf_output= HMAC_hash(secret, A(1) + seed)+HMAC_hash(secret, A(2) + seed)
mov eax,A_3
mov edi,l
stdcall hmac_hash, tmp_buffer
;label_addition
mov eax,[_label]
mov edi,[label_size]
stdcall hmac_add,tmp_buffer
pop edi
pop eax
stdcall hmac_add, tmp_buffer
mov edi,[_output]
add edi,2*l
stdcall hmac_final, tmp_buffer
;prf_output= HMAC_hash(secret, A(1) + seed)+HMAC_hash(secret, A(2) + seed)+HMAC_hash(secret, A(3) + seed)
mov eax,A_4
mov edi,l
stdcall hmac_hash, tmp_buffer
;label_addition
mov eax,[_label]
mov edi,[label_size]
stdcall hmac_add,tmp_buffer
pop edi
pop eax
stdcall hmac_add, tmp_buffer
mov edi,[_output]
add edi,3*l
stdcall hmac_final, tmp_buffer
;DEBUGF 1,'PRF:\n'
;stdcall dump_512bit_hex, [_output]
ret
endp
; prf_output= HMAC_hash(secret, A(1) + seed)+HMAC_hash(secret, A(2) + seed)+HMAC_hash(secret, A(3) + seed)+HMAC_hash(secret, A(4) + seed)
;128 bytes!!