~ubuntu-branches/debian/sid/botan/sid

« back to all changes in this revision

Viewing changes to src/rmd128.cpp

  • Committer: Package Import Robot
  • Author(s): Laszlo Boszormenyi (GCS)
  • Date: 2018-03-01 22:23:25 UTC
  • mfrom: (1.2.2)
  • Revision ID: package-import@ubuntu.com-20180301222325-7p7vc45gu3hta34d
Tags: 2.4.0-2
* Don't remove .doctrees from the manual if it doesn't exist.
* Don't specify parallel to debhelper.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*************************************************
2
 
* RIPEMD-128 Source File                         *
3
 
* (C) 1999-2007 The Botan Project                *
4
 
*************************************************/
5
 
 
6
 
#include <botan/rmd128.h>
7
 
#include <botan/bit_ops.h>
8
 
 
9
 
namespace Botan {
10
 
 
11
 
namespace {
12
 
 
13
 
/*************************************************
14
 
* RIPEMD-128 F1 Function                         *
15
 
*************************************************/
16
 
inline void F1(u32bit& A, u32bit B, u32bit C, u32bit D,
17
 
               u32bit msg, u32bit shift)
18
 
   {
19
 
   A += (B ^ C ^ D) + msg;
20
 
   A  = rotate_left(A, shift);
21
 
   }
22
 
 
23
 
/*************************************************
24
 
* RIPEMD-128 F2 Function                         *
25
 
*************************************************/
26
 
inline void F2(u32bit& A, u32bit B, u32bit C, u32bit D,
27
 
               u32bit msg, u32bit shift, u32bit magic)
28
 
   {
29
 
   A += (D ^ (B & (C ^ D))) + msg + magic;
30
 
   A  = rotate_left(A, shift);
31
 
   }
32
 
 
33
 
/*************************************************
34
 
* RIPEMD-128 F3 Function                         *
35
 
*************************************************/
36
 
inline void F3(u32bit& A, u32bit B, u32bit C, u32bit D,
37
 
               u32bit msg, u32bit shift, u32bit magic)
38
 
   {
39
 
   A += (D ^ (B | ~C)) + msg + magic;
40
 
   A  = rotate_left(A, shift);
41
 
   }
42
 
 
43
 
/*************************************************
44
 
* RIPEMD-128 F4 Function                         *
45
 
*************************************************/
46
 
inline void F4(u32bit& A, u32bit B, u32bit C, u32bit D,
47
 
               u32bit msg, u32bit shift, u32bit magic)
48
 
   {
49
 
   A += (C ^ (D & (B ^ C))) + msg + magic;
50
 
   A  = rotate_left(A, shift);
51
 
   }
52
 
 
53
 
}
54
 
 
55
 
/*************************************************
56
 
* RIPEMD-128 Compression Function                *
57
 
*************************************************/
58
 
void RIPEMD_128::hash(const byte input[])
59
 
   {
60
 
   for(u32bit j = 0; j != 16; ++j)
61
 
      M[j] = make_u32bit(input[4*j+3], input[4*j+2], input[4*j+1], input[4*j]);
62
 
 
63
 
   u32bit A1 = digest[0], A2 = A1, B1 = digest[1], B2 = B1,
64
 
          C1 = digest[2], C2 = C1, D1 = digest[3], D2 = D1;
65
 
 
66
 
   const u32bit MAGIC2 = 0x5A827999, MAGIC3 = 0x6ED9EBA1,
67
 
                MAGIC4 = 0x8F1BBCDC, MAGIC5 = 0x50A28BE6,
68
 
                MAGIC6 = 0x5C4DD124, MAGIC7 = 0x6D703EF3;
69
 
 
70
 
   F1(A1,B1,C1,D1,M[ 0],11       );   F4(A2,B2,C2,D2,M[ 5], 8,MAGIC5);
71
 
   F1(D1,A1,B1,C1,M[ 1],14       );   F4(D2,A2,B2,C2,M[14], 9,MAGIC5);
72
 
   F1(C1,D1,A1,B1,M[ 2],15       );   F4(C2,D2,A2,B2,M[ 7], 9,MAGIC5);
73
 
   F1(B1,C1,D1,A1,M[ 3],12       );   F4(B2,C2,D2,A2,M[ 0],11,MAGIC5);
74
 
   F1(A1,B1,C1,D1,M[ 4], 5       );   F4(A2,B2,C2,D2,M[ 9],13,MAGIC5);
75
 
   F1(D1,A1,B1,C1,M[ 5], 8       );   F4(D2,A2,B2,C2,M[ 2],15,MAGIC5);
76
 
   F1(C1,D1,A1,B1,M[ 6], 7       );   F4(C2,D2,A2,B2,M[11],15,MAGIC5);
77
 
   F1(B1,C1,D1,A1,M[ 7], 9       );   F4(B2,C2,D2,A2,M[ 4], 5,MAGIC5);
78
 
   F1(A1,B1,C1,D1,M[ 8],11       );   F4(A2,B2,C2,D2,M[13], 7,MAGIC5);
79
 
   F1(D1,A1,B1,C1,M[ 9],13       );   F4(D2,A2,B2,C2,M[ 6], 7,MAGIC5);
80
 
   F1(C1,D1,A1,B1,M[10],14       );   F4(C2,D2,A2,B2,M[15], 8,MAGIC5);
81
 
   F1(B1,C1,D1,A1,M[11],15       );   F4(B2,C2,D2,A2,M[ 8],11,MAGIC5);
82
 
   F1(A1,B1,C1,D1,M[12], 6       );   F4(A2,B2,C2,D2,M[ 1],14,MAGIC5);
83
 
   F1(D1,A1,B1,C1,M[13], 7       );   F4(D2,A2,B2,C2,M[10],14,MAGIC5);
84
 
   F1(C1,D1,A1,B1,M[14], 9       );   F4(C2,D2,A2,B2,M[ 3],12,MAGIC5);
85
 
   F1(B1,C1,D1,A1,M[15], 8       );   F4(B2,C2,D2,A2,M[12], 6,MAGIC5);
86
 
 
87
 
   F2(A1,B1,C1,D1,M[ 7], 7,MAGIC2);   F3(A2,B2,C2,D2,M[ 6], 9,MAGIC6);
88
 
   F2(D1,A1,B1,C1,M[ 4], 6,MAGIC2);   F3(D2,A2,B2,C2,M[11],13,MAGIC6);
89
 
   F2(C1,D1,A1,B1,M[13], 8,MAGIC2);   F3(C2,D2,A2,B2,M[ 3],15,MAGIC6);
90
 
   F2(B1,C1,D1,A1,M[ 1],13,MAGIC2);   F3(B2,C2,D2,A2,M[ 7], 7,MAGIC6);
91
 
   F2(A1,B1,C1,D1,M[10],11,MAGIC2);   F3(A2,B2,C2,D2,M[ 0],12,MAGIC6);
92
 
   F2(D1,A1,B1,C1,M[ 6], 9,MAGIC2);   F3(D2,A2,B2,C2,M[13], 8,MAGIC6);
93
 
   F2(C1,D1,A1,B1,M[15], 7,MAGIC2);   F3(C2,D2,A2,B2,M[ 5], 9,MAGIC6);
94
 
   F2(B1,C1,D1,A1,M[ 3],15,MAGIC2);   F3(B2,C2,D2,A2,M[10],11,MAGIC6);
95
 
   F2(A1,B1,C1,D1,M[12], 7,MAGIC2);   F3(A2,B2,C2,D2,M[14], 7,MAGIC6);
96
 
   F2(D1,A1,B1,C1,M[ 0],12,MAGIC2);   F3(D2,A2,B2,C2,M[15], 7,MAGIC6);
97
 
   F2(C1,D1,A1,B1,M[ 9],15,MAGIC2);   F3(C2,D2,A2,B2,M[ 8],12,MAGIC6);
98
 
   F2(B1,C1,D1,A1,M[ 5], 9,MAGIC2);   F3(B2,C2,D2,A2,M[12], 7,MAGIC6);
99
 
   F2(A1,B1,C1,D1,M[ 2],11,MAGIC2);   F3(A2,B2,C2,D2,M[ 4], 6,MAGIC6);
100
 
   F2(D1,A1,B1,C1,M[14], 7,MAGIC2);   F3(D2,A2,B2,C2,M[ 9],15,MAGIC6);
101
 
   F2(C1,D1,A1,B1,M[11],13,MAGIC2);   F3(C2,D2,A2,B2,M[ 1],13,MAGIC6);
102
 
   F2(B1,C1,D1,A1,M[ 8],12,MAGIC2);   F3(B2,C2,D2,A2,M[ 2],11,MAGIC6);
103
 
 
104
 
   F3(A1,B1,C1,D1,M[ 3],11,MAGIC3);   F2(A2,B2,C2,D2,M[15], 9,MAGIC7);
105
 
   F3(D1,A1,B1,C1,M[10],13,MAGIC3);   F2(D2,A2,B2,C2,M[ 5], 7,MAGIC7);
106
 
   F3(C1,D1,A1,B1,M[14], 6,MAGIC3);   F2(C2,D2,A2,B2,M[ 1],15,MAGIC7);
107
 
   F3(B1,C1,D1,A1,M[ 4], 7,MAGIC3);   F2(B2,C2,D2,A2,M[ 3],11,MAGIC7);
108
 
   F3(A1,B1,C1,D1,M[ 9],14,MAGIC3);   F2(A2,B2,C2,D2,M[ 7], 8,MAGIC7);
109
 
   F3(D1,A1,B1,C1,M[15], 9,MAGIC3);   F2(D2,A2,B2,C2,M[14], 6,MAGIC7);
110
 
   F3(C1,D1,A1,B1,M[ 8],13,MAGIC3);   F2(C2,D2,A2,B2,M[ 6], 6,MAGIC7);
111
 
   F3(B1,C1,D1,A1,M[ 1],15,MAGIC3);   F2(B2,C2,D2,A2,M[ 9],14,MAGIC7);
112
 
   F3(A1,B1,C1,D1,M[ 2],14,MAGIC3);   F2(A2,B2,C2,D2,M[11],12,MAGIC7);
113
 
   F3(D1,A1,B1,C1,M[ 7], 8,MAGIC3);   F2(D2,A2,B2,C2,M[ 8],13,MAGIC7);
114
 
   F3(C1,D1,A1,B1,M[ 0],13,MAGIC3);   F2(C2,D2,A2,B2,M[12], 5,MAGIC7);
115
 
   F3(B1,C1,D1,A1,M[ 6], 6,MAGIC3);   F2(B2,C2,D2,A2,M[ 2],14,MAGIC7);
116
 
   F3(A1,B1,C1,D1,M[13], 5,MAGIC3);   F2(A2,B2,C2,D2,M[10],13,MAGIC7);
117
 
   F3(D1,A1,B1,C1,M[11],12,MAGIC3);   F2(D2,A2,B2,C2,M[ 0],13,MAGIC7);
118
 
   F3(C1,D1,A1,B1,M[ 5], 7,MAGIC3);   F2(C2,D2,A2,B2,M[ 4], 7,MAGIC7);
119
 
   F3(B1,C1,D1,A1,M[12], 5,MAGIC3);   F2(B2,C2,D2,A2,M[13], 5,MAGIC7);
120
 
 
121
 
   F4(A1,B1,C1,D1,M[ 1],11,MAGIC4);   F1(A2,B2,C2,D2,M[ 8],15       );
122
 
   F4(D1,A1,B1,C1,M[ 9],12,MAGIC4);   F1(D2,A2,B2,C2,M[ 6], 5       );
123
 
   F4(C1,D1,A1,B1,M[11],14,MAGIC4);   F1(C2,D2,A2,B2,M[ 4], 8       );
124
 
   F4(B1,C1,D1,A1,M[10],15,MAGIC4);   F1(B2,C2,D2,A2,M[ 1],11       );
125
 
   F4(A1,B1,C1,D1,M[ 0],14,MAGIC4);   F1(A2,B2,C2,D2,M[ 3],14       );
126
 
   F4(D1,A1,B1,C1,M[ 8],15,MAGIC4);   F1(D2,A2,B2,C2,M[11],14       );
127
 
   F4(C1,D1,A1,B1,M[12], 9,MAGIC4);   F1(C2,D2,A2,B2,M[15], 6       );
128
 
   F4(B1,C1,D1,A1,M[ 4], 8,MAGIC4);   F1(B2,C2,D2,A2,M[ 0],14       );
129
 
   F4(A1,B1,C1,D1,M[13], 9,MAGIC4);   F1(A2,B2,C2,D2,M[ 5], 6       );
130
 
   F4(D1,A1,B1,C1,M[ 3],14,MAGIC4);   F1(D2,A2,B2,C2,M[12], 9       );
131
 
   F4(C1,D1,A1,B1,M[ 7], 5,MAGIC4);   F1(C2,D2,A2,B2,M[ 2],12       );
132
 
   F4(B1,C1,D1,A1,M[15], 6,MAGIC4);   F1(B2,C2,D2,A2,M[13], 9       );
133
 
   F4(A1,B1,C1,D1,M[14], 8,MAGIC4);   F1(A2,B2,C2,D2,M[ 9],12       );
134
 
   F4(D1,A1,B1,C1,M[ 5], 6,MAGIC4);   F1(D2,A2,B2,C2,M[ 7], 5       );
135
 
   F4(C1,D1,A1,B1,M[ 6], 5,MAGIC4);   F1(C2,D2,A2,B2,M[10],15       );
136
 
   F4(B1,C1,D1,A1,M[ 2],12,MAGIC4);   F1(B2,C2,D2,A2,M[14], 8       );
137
 
 
138
 
   D2        = digest[1] + C1 + D2; digest[1] = digest[2] + D1 + A2;
139
 
   digest[2] = digest[3] + A1 + B2; digest[3] = digest[0] + B1 + C2;
140
 
   digest[0] = D2;
141
 
   }
142
 
 
143
 
/*************************************************
144
 
* Copy out the digest                            *
145
 
*************************************************/
146
 
void RIPEMD_128::copy_out(byte output[])
147
 
   {
148
 
   for(u32bit j = 0; j != OUTPUT_LENGTH; ++j)
149
 
      output[j] = get_byte(3 - (j % 4), digest[j/4]);
150
 
   }
151
 
 
152
 
/*************************************************
153
 
* Clear memory of sensitive data                 *
154
 
*************************************************/
155
 
void RIPEMD_128::clear() throw()
156
 
   {
157
 
   MDx_HashFunction::clear();
158
 
   M.clear();
159
 
   digest[0] = 0x67452301;
160
 
   digest[1] = 0xEFCDAB89;
161
 
   digest[2] = 0x98BADCFE;
162
 
   digest[3] = 0x10325476;
163
 
   }
164
 
 
165
 
}