aboutsummaryrefslogtreecommitdiff
path: root/raw-wiki-dump/GitRepositories%2Fcore%2Fhash%2Fsha1.trac
blob: d4c246d67d35be75b8c5ce069ef122b26566c8fb (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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
{{{
#!htmlcomment

This page is maintained automatically by a script.  Don't modify this page by hand,
your changes will just be overwritten the next time the script runs.  Talk to your
Friendly Neighborhood Repository Maintainer if you need to change something here.

}}}

{{{
#!html
<h1>sha1</h1>

<h2>Introduction</h2>

<p>Verilog implementation of the SHA-1 cryptgraphic hash function. The
functionality follows the specification in NIST FIPS 180-4.</p>

<p>The sha1 design is divided into the following sections.</p>

<ul>
<li>src/rtl - RTL source files</li>
<li>src/tb  - Testbenches for the RTL files</li>
<li>src/model/python - Functional model written in python</li>
<li>doc/ - documentation (currently not done.)</li>
<li>toolruns/ - Where tools are supposed to be run. Includes a Makefile
for building and simulating the design using <a href="http://iverilog.icarus.com/">Icarus
Verilog</a>.</li>
</ul>

<p>The actual core consists of the following RTL files:</p>

<ul>
<li>sha1.v</li>
<li>sha1_core.v</li>
<li>sha1_w_mem.v</li>
</ul>

<p>The main core functionality is in the sha1_core file. The file
sha1_w_mem contains the message block memory W (see FIPS 180-4).
The top level entity is called sha1_core. The sha1_core module has wide
interfaces (512 bit block input, 160 bit digest). In order to make it
usable you probably want to wrap the core with a bus interface.</p>

<p>The file sha1.v contains a top level wrapper that provides a simple
interface with 32-bit data access . This interface contains mesage block
and digest registers to allow a host to load the next block while the
current block is being processed.</p>

<h2>API</h2>

<p>The following list contains the address map for all registers
implemented by the sha1 top level wrapper:</p>

<table>
<thead>
<tr>
  <th>address</th>
  <th>name</th>
  <th>access</th>
  <th>description</th>
</tr>
</thead>
<tbody>
<tr>
  <td>0x00</td>
  <td>name0</td>
  <td>R</td>
  <td>"SHA1"</td>
</tr>
<tr>
  <td>0x01</td>
  <td>name1</td>
  <td>R</td>
  <td>"    "</td>
</tr>
<tr>
  <td>0x02</td>
  <td>version</td>
  <td>R</td>
  <td>"0.50"</td>
</tr>
<tr>
  <td></td>
</tr>
<tr>
  <td>0x08</td>
  <td>control</td>
  <td>R/W</td>
  <td>Control of core. Bit 0: init, Bit 1: next</td>
</tr>
<tr>
  <td>0x09</td>
  <td>status</td>
  <td>R/W</td>
  <td>Status of core. Bit 0: Ready, Bit 1: valid data</td>
</tr>
<tr>
  <td></td>
</tr>
<tr>
  <td>0x10</td>
  <td>block0</td>
  <td>R/W</td>
  <td>data block register</td>
</tr>
<tr>
  <td>0x11</td>
  <td>block1</td>
  <td>R/W</td>
  <td>data block register</td>
</tr>
<tr>
  <td>0x12</td>
  <td>block2</td>
  <td>R/W</td>
  <td>data block register</td>
</tr>
<tr>
  <td>0x13</td>
  <td>block3</td>
  <td>R/W</td>
  <td>data block register</td>
</tr>
<tr>
  <td>0x14</td>
  <td>block4</td>
  <td>R/W</td>
  <td>data block register</td>
</tr>
<tr>
  <td>0x15</td>
  <td>block5</td>
  <td>R/W</td>
  <td>data block register</td>
</tr>
<tr>
  <td>0x16</td>
  <td>block6</td>
  <td>R/W</td>
  <td>data block register</td>
</tr>
<tr>
  <td>0x17</td>
  <td>block7</td>
  <td>R/W</td>
  <td>data block register</td>
</tr>
<tr>
  <td>0x18</td>
  <td>block8</td>
  <td>R/W</td>
  <td>data block register</td>
</tr>
<tr>
  <td>0x19</td>
  <td>block9</td>
  <td>R/W</td>
  <td>data block register</td>
</tr>
<tr>
  <td>0x1a</td>
  <td>block10</td>
  <td>R/W</td>
  <td>data block register</td>
</tr>
<tr>
  <td>0x1b</td>
  <td>block11</td>
  <td>R/W</td>
  <td>data block register</td>
</tr>
<tr>
  <td>0x1c</td>
  <td>block12</td>
  <td>R/W</td>
  <td>data block register</td>
</tr>
<tr>
  <td>0x1d</td>
  <td>block13</td>
  <td>R/W</td>
  <td>data block register</td>
</tr>
<tr>
  <td>0x1e</td>
  <td>block14</td>
  <td>R/W</td>
  <td>data block register</td>
</tr>
<tr>
  <td>0x1f</td>
  <td>block15</td>
  <td>R/W</td>
  <td>data block register</td>
</tr>
<tr>
  <td></td>
</tr>
<tr>
  <td>0x20</td>
  <td>digest0</td>
  <td>R/W</td>
  <td>digest register</td>
</tr>
<tr>
  <td>0x21</td>
  <td>digest1</td>
  <td>R/W</td>
  <td>digest register</td>
</tr>
<tr>
  <td>0x22</td>
  <td>digest2</td>
  <td>R/W</td>
  <td>digest register</td>
</tr>
<tr>
  <td>0x23</td>
  <td>digest3</td>
  <td>R/W</td>
  <td>digest register</td>
</tr>
<tr>
  <td>0x24</td>
  <td>digest4</td>
  <td>R/W</td>
  <td>digest register</td>
</tr>
</tbody>
</table>

<h2>Implementation details</h2>

<p>The implementation is iterative with one cycle/round. The initialization
takes one cycle. The W memory is based around a sliding window of 16
32-bit registers that are updated in sync with the round processing. The
total latency/message block is 82 cycles.</p>

<p>All registers have asynchronous reset.</p>

<p>The design has been implemented and tested on TerasIC DE0-Nano and C5G
FPGA boards.</p>

<h2>Status</h2>

<p>The design has been implemented and extensively been tested on TerasIC
DE0-Nano and C5G FPGA boards. The core has also been tested using SW
running on The Novena CPU talking to the core in the Xilinx Spartan-6
FPGA.</p>

<h2>FPGA-results</h2>

<h3>Altera Cyclone FPGAs</h3>

<p>Implementation results using Altera Quartus-II 13.1.</p>

<p><strong><em>Altera Cyclone IV E</em></strong></p>

<ul>
<li>EP4CE6F17C6</li>
<li>2913 LEs</li>
<li>1527 regs</li>
<li>107 MHz</li>
</ul>

<p><strong><em>Altera Cyclone IV GX</em></strong></p>

<ul>
<li>EP4CGX22CF19C6</li>
<li>2814 LEs</li>
<li>1527 regs</li>
<li>105 MHz</li>
</ul>

<p><strong><em>Altera Cyclone V</em></strong></p>

<ul>
<li>5CGXFC7C7F23C8</li>
<li>1124 ALMs</li>
<li>1527 regs</li>
<li>104 MHz</li>
</ul>

<h3>Xilinx FPGAs</h3>

<p>Implementation results using ISE 14.7.</p>

<p><em>* Xilinx Spartan-6 *</em></p>

<ul>
<li>xc6slx45-3csg324</li>
<li>1589 LUTs</li>
<li>564 Slices</li>
<li>1592 regs</li>
<li>100 MHz</li>
</ul>

<h2>TODO</h2>

<ul>
<li>Documentation</li>
</ul>
}}}

[[RepositoryIndex(format=table,glob=core/hash/sha1)]]

|| Clone `https://git.cryptech.is/core/hash/sha1.git` ||