OpenCores
URL https://opencores.org/ocsvn/sc2v/sc2v/trunk

Subversion Repositories sc2v

[/] [sc2v/] [tags/] [arelease/] [examples/] [md5.cpp] - Blame information for rev 36

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jcastillo
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  MD5 main implementation file                                ////
4
////                                                              ////
5
////  This file is part of the SystemC MD5                        ////
6
////                                                              ////
7
////  Description:                                                ////
8
////  MD5 main implementation file                                ////
9
////                                                              ////
10
////  To Do:                                                      ////
11
////   - done                                                     ////
12
////                                                              ////
13
////  Author(s):                                                  ////
14
////      - Javier Castillo, jcastilo@opencores.org               ////
15
////                                                              ////
16
//////////////////////////////////////////////////////////////////////
17
////                                                              ////
18
//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
19
////                                                              ////
20
//// This source file may be used and distributed without         ////
21
//// restriction provided that this copyright statement is not    ////
22
//// removed from the file and that any derivative work contains  ////
23
//// the original copyright notice and the associated disclaimer. ////
24
////                                                              ////
25
//// This source file is free software; you can redistribute it   ////
26
//// and/or modify it under the terms of the GNU Lesser General   ////
27
//// Public License as published by the Free Software Foundation; ////
28
//// either version 2.1 of the License, or (at your option) any   ////
29
//// later version.                                               ////
30
////                                                              ////
31
//// This source is distributed in the hope that it will be       ////
32
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
33
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
34
//// PURPOSE.  See the GNU Lesser General Public License for more ////
35
//// details.                                                     ////
36
////                                                              ////
37
//// You should have received a copy of the GNU Lesser General    ////
38
//// Public License along with this source; if not, download it   ////
39
//// from http://www.opencores.org/lgpl.shtml                     ////
40
////                                                              ////
41
//////////////////////////////////////////////////////////////////////
42
//
43
// CVS Revision History
44
//
45
// $Log: not supported by cvs2svn $
46
// Revision 1.1.1.1  2004/09/08 16:24:49  jcastillo
47
// Initial release
48
//
49
 
50
#include "md5.h"
51
 
52
 
53
void
54
md5::md5_rom ()
55
{
56
  switch (round64.read ())
57
    {
58
    case 0:
59
      t.write (0xD76AA478070);
60
      break;
61
    case 1:
62
      t.write (0xE8C7B7560C1);
63
      break;
64
    case 2:
65
      t.write (0x242070DB112);
66
      break;
67
    case 3:
68
      t.write (0xC1BDCEEE163);
69
      break;
70
    case 4:
71
      t.write (0xF57C0FAF074);
72
      break;
73
    case 5:
74
      t.write (0x4787C62A0C5);
75
      break;
76
    case 6:
77
      t.write (0xA8304613116);
78
      break;
79
    case 7:
80
      t.write (0xFD469501167);
81
      break;
82
    case 8:
83
      t.write (0x698098D8078);
84
      break;
85
    case 9:
86
      t.write (0x8B44F7AF0C9);
87
      break;
88
    case 10:
89
      t.write (0xFFFF5BB111A);
90
      break;
91
    case 11:
92
      t.write (0x895CD7BE16B);
93
      break;
94
    case 12:
95
      t.write (0x6B90112207C);
96
      break;
97
    case 13:
98
      t.write (0xFD9871930CD);
99
      break;
100
    case 14:
101
      t.write (0xA679438E11E);
102
      break;
103
    case 15:
104
      t.write (0x49B4082116F);
105
      break;
106
 
107
    case 16:
108
      t.write (0xf61e2562051);
109
      break;
110
    case 17:
111
      t.write (0xc040b340096);
112
      break;
113
    case 18:
114
      t.write (0x265e5a510EB);
115
      break;
116
    case 19:
117
      t.write (0xe9b6c7aa140);
118
      break;
119
    case 20:
120
      t.write (0xd62f105d055);
121
      break;
122
    case 21:
123
      t.write (0x0244145309A);
124
      break;
125
    case 22:
126
      t.write (0xd8a1e6810EF);
127
      break;
128
    case 23:
129
      t.write (0xe7d3fbc8144);
130
      break;
131
    case 24:
132
      t.write (0x21e1cde6059);
133
      break;
134
    case 25:
135
      t.write (0xc33707d609E);
136
      break;
137
    case 26:
138
      t.write (0xf4d50d870E3);
139
      break;
140
    case 27:
141
      t.write (0x455a14ed148);
142
      break;
143
    case 28:
144
      t.write (0xa9e3e90505D);
145
      break;
146
    case 29:
147
      t.write (0xfcefa3f8092);
148
      break;
149
    case 30:
150
      t.write (0x676f02d90E7);
151
      break;
152
    case 31:
153
      t.write (0x8d2a4c8a14C);
154
      break;
155
 
156
    case 32:
157
      t.write (0xfffa3942045);
158
      break;
159
    case 33:
160
      t.write (0x8771f6810B8);
161
      break;
162
    case 34:
163
      t.write (0x6d9d612210B);
164
      break;
165
    case 35:
166
      t.write (0xfde5380c17E);
167
      break;
168
    case 36:
169
      t.write (0xa4beea44041);
170
      break;
171
    case 37:
172
      t.write (0x4bdecfa90B4);
173
      break;
174
    case 38:
175
      t.write (0xf6bb4b60107);
176
      break;
177
    case 39:
178
      t.write (0xbebfbc7017A);
179
      break;
180
    case 40:
181
      t.write (0x289b7ec604D);
182
      break;
183
    case 41:
184
      t.write (0xeaa127fa0B0);
185
      break;
186
    case 42:
187
      t.write (0xd4ef3085103);
188
      break;
189
    case 43:
190
      t.write (0x04881d05176);
191
      break;
192
    case 44:
193
      t.write (0xd9d4d039049);
194
      break;
195
    case 45:
196
      t.write (0xe6db99e50BC);
197
      break;
198
    case 46:
199
      t.write (0x1fa27cf810F);
200
      break;
201
    case 47:
202
      t.write (0xc4ac5665172);
203
      break;
204
 
205
    case 48:
206
      t.write (0xf4292244060);
207
      break;
208
    case 49:
209
      t.write (0x432aff970A7);
210
      break;
211
    case 50:
212
      t.write (0xab9423a70FE);
213
      break;
214
    case 51:
215
      t.write (0xfc93a039155);
216
      break;
217
    case 52:
218
      t.write (0x655b59c306C);
219
      break;
220
    case 53:
221
      t.write (0x8f0ccc920A3);
222
      break;
223
    case 54:
224
      t.write (0xffeff47d0FA);
225
      break;
226
    case 55:
227
      t.write (0x85845dd1151);
228
      break;
229
    case 56:
230
      t.write (0x6fa87e4f068);
231
      break;
232
    case 57:
233
      t.write (0xfe2ce6e00AF);
234
      break;
235
    case 58:
236
      t.write (0xa30143140F6);
237
      break;
238
    case 59:
239
      t.write (0x4e0811a115D);
240
      break;
241
    case 60:
242
      t.write (0xf7537e82064);
243
      break;
244
    case 61:
245
      t.write (0xbd3af2350AB);
246
      break;
247
    case 62:
248
      t.write (0x2ad7d2bb0F2);
249
      break;
250
    case 63:
251
      t.write (0xeb86d391159);
252
      break;
253
 
254
    }
255
}
256
 
257
 
258
void
259
md5::funcs ()
260
{
261
  sc_uint < 32 > aux, fr_var, tr_var, rotate1, rotate2;
262
  sc_uint < 8 > s_var;
263
  sc_uint < 4 > nblock;
264
  sc_uint < 32 > message_var[16];
265
 
266
  message_var[0]=message.read().range(511,480);
267
  message_var[1]=message.read().range(479,448);
268
  message_var[2]=message.read().range(447,416);
269
  message_var[3]=message.read().range(415,384);
270
  message_var[4]=message.read().range(383,352);
271
  message_var[5]=message.read().range(351,320);
272
  message_var[6]=message.read().range(319,288);
273
  message_var[7]=message.read().range(287,256);
274
  message_var[8]=message.read().range(255,224);
275
  message_var[9]=message.read().range(223,192);
276
  message_var[10]=message.read().range(191,160);
277
  message_var[11]=message.read().range(159,128);
278
  message_var[12]=message.read().range(127,96);
279
  message_var[13]=message.read().range(95,64);
280
  message_var[14]=message.read().range(63,32);
281
  message_var[15]=message.read().range(31,0);
282
 
283
  fr_var = 0;
284
 
285
  switch (round.read ())
286
    {
287
    case 0:
288
      fr_var = ((br.read () & cr.read ()) | (~br.read () & dr.read ()));
289
      break;
290
    case 1:
291
      fr_var = ((br.read () & dr.read ()) | (cr.read () & (~dr.read ())));
292
      break;
293
    case 2:
294
      fr_var = (br.read () ^ cr.read () ^ dr.read ());
295
      break;
296
    case 3:
297
      fr_var = (cr.read () ^ (br.read () | ~dr.read ()));
298
      break;
299
    default:
300
      break;
301
    }
302
 
303
  tr_var = t.read ().range (43, 12);
304
  s_var = t.read ().range (11, 4);
305
  nblock = t.read ().range (3, 0);
306
 
307
  aux = (ar.read () + fr_var + message_var[(int) nblock] + tr_var);
308
 
309
  //cout << (int)round64.read() << " " << (int)fr_var << " " << (int)aux << " " << (int)nblock << " " << (int)message_var[(int)nblock] << endl;
310
 
311
  rotate1 = aux << (int) s_var;
312
  rotate2 = aux >> (int) (32 - s_var);
313
  func_out.write (br.read () + (rotate1 | rotate2));
314
 
315
}
316
 
317
void
318
md5::round64FSM ()
319
{
320
 
321
  next_ar.write (ar.read ());
322
  next_br.write (br.read ());
323
  next_cr.write (cr.read ());
324
  next_dr.write (dr.read ());
325
  next_round64.write (round64.read ());
326
  next_round.write (round.read ());
327
  hash_generated.write (0);
328
 
329
  if (generate_hash.read () != 0)
330
    {
331
      next_ar.write (dr.read ());
332
      next_br.write (func_out.read ());
333
      next_cr.write (br.read ());
334
      next_dr.write (cr.read ());
335
    }
336
 
337
  switch (round64.read ())
338
    {
339
 
340
    case 0:
341
      next_round.write (0);
342
      if (generate_hash.read ())
343
        {
344
          next_round64.write (1);
345
        }
346
      break;
347
    case 15:
348
    case 31:
349
    case 47:
350
      next_round.write (round.read () + 1);
351
      next_round64.write (round64.read () + 1);
352
      break;
353
    case 63:
354
      next_round.write (0);
355
      next_round64.write (0);
356
      hash_generated.write (1);
357
      break;
358
    default:
359
      next_round64.write (round64.read () + 1);
360
      break;
361
    }
362
 
363
  if (newtext_i.read ())
364
    {
365
      next_ar.write (0x67452301);
366
      next_br.write (0xEFCDAB89);
367
      next_cr.write (0x98BADCFE);
368
      next_dr.write (0x10325476);
369
      next_round.write (0);
370
      next_round64.write (0);
371
    }
372
 
373
  if (getdata_state.read () == 0)
374
    {
375
      next_ar.write (A.read ());
376
      next_br.write (B.read ());
377
      next_cr.write (C.read ());
378
      next_dr.write (D.read ());
379
    }
380
}
381
 
382
void
383
md5::reg_signal ()
384
{
385
  if (!reset)
386
    {
387
      ready_o.write (0);
388
      data_o.write (0);
389
      message.write (0);
390
 
391
      ar.write (0x67452301);
392
      br.write (0xEFCDAB89);
393
      cr.write (0x98BADCFE);
394
      dr.write (0x10325476);
395
 
396
      getdata_state.write (0);
397
      generate_hash.write (0);
398
 
399
      round.write (0);
400
      round64.write (0);
401
 
402
      A.write (0x67452301);
403
      B.write (0xEFCDAB89);
404
      C.write (0x98BADCFE);
405
      D.write (0x10325476);
406
 
407
    }
408
  else
409
    {
410
      ready_o.write (next_ready_o.read ());
411
      data_o.write (next_data_o.read ());
412
      message.write (next_message.read ());
413
 
414
      ar.write (next_ar.read ());
415
      br.write (next_br.read ());
416
      cr.write (next_cr.read ());
417
      dr.write (next_dr.read ());
418
 
419
      A.write (next_A.read ());
420
      B.write (next_B.read ());
421
      C.write (next_C.read ());
422
      D.write (next_D.read ());
423
 
424
      generate_hash.write (next_generate_hash.read ());
425
      getdata_state.write (next_getdata_state.read ());
426
 
427
      round.write (next_round.read ());
428
      round64.write (next_round64.read ());
429
 
430
    }
431
 
432
}
433
 
434
 
435
void
436
md5::md5_getdata ()
437
{
438
 
439
  sc_biguint < 128 > data_o_var;
440
  sc_biguint < 512 > aux;
441
 
442
  sc_uint < 32 > A_t, B_t, C_t, D_t;
443
 
444
  next_A.write (A.read ());
445
  next_B.write (B.read ());
446
  next_C.write (C.read ());
447
  next_D.write (D.read ());
448
 
449
  next_generate_hash.write (0);
450
  next_ready_o.write (0);
451
  next_data_o.write (0);
452
 
453
  aux = message.read ();
454
  next_message.write (message.read ());
455
  next_getdata_state.write (getdata_state.read ());
456
 
457
  if (newtext_i.read ())
458
    {
459
      next_A.write (0x67452301);
460
      next_B.write (0xEFCDAB89);
461
      next_C.write (0x98BADCFE);
462
      next_D.write (0x10325476);
463
      next_getdata_state.write (0);
464
    }
465
 
466
  switch (getdata_state.read ())
467
    {
468
 
469
    case 0:
470
      if (load_i.read ())
471
        {
472
          aux.range (511, 384) = data_i.read ();
473
          next_message.write (aux);
474
          next_getdata_state.write (1);
475
        }
476
      break;
477
    case 1:
478
      if (load_i.read ())
479
        {
480
          aux.range (383, 256) = data_i.read ();
481
          next_message.write (aux);
482
          next_getdata_state.write (2);
483
        }
484
      break;
485
    case 2:
486
      if (load_i.read ())
487
        {
488
          aux.range (255, 128) = data_i.read ();
489
          next_message.write (aux);
490
          next_getdata_state.write (3);
491
        }
492
      break;
493
    case 3:
494
      if (load_i.read ())
495
        {
496
          aux.range (127, 0) = data_i.read ();
497
          next_message.write (aux);
498
          next_getdata_state.write (4);
499
          next_generate_hash.write (1);
500
        }
501
      break;
502
    case 4:
503
      next_generate_hash.write (1);
504
 
505
      A_t = dr.read () + A.read ();
506
      B_t = func_out.read () + B.read ();
507
      C_t = br.read () + C.read ();
508
      D_t = cr.read () + D.read ();
509
 
510
      data_o_var.range (127, 96) = A_t;
511
      data_o_var.range (95, 64) = B_t;
512
      data_o_var.range (63, 32) = C_t;
513
      data_o_var.range (31, 0) = D_t;
514
      next_data_o.write (data_o_var);
515
 
516
 
517
      if (hash_generated.read ())
518
        {
519
          next_A.write (A_t);
520
          next_B.write (B_t);
521
          next_C.write (C_t);
522
          next_D.write (D_t);
523
          next_getdata_state.write (0);
524
          next_ready_o.write (1);
525
          next_generate_hash.write (0);
526
        }
527
      break;
528
    }
529
 
530
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.