@@ -21,161 +21,57 @@ namespace teggo
21
21
# define _TEGGO_NEWDES_FAKE_INLINE CXX_FAKE_INLINE
22
22
#endif
23
23
24
- CXX_FAKE_INLINE
25
- void NEWDES_Cipher::Normalize_ (byte_t const * kunrav)
26
- {
27
- int i,j;
28
- memset (key_unrav,0 ,sizeof (key_unrav));
29
- for ( i = 0 ; i < 9 ; ++i )
30
- {
31
- for ( j = 0 ; j < 4 ; ++j )
32
- key_unrav[i*8 +j] = kunrav[i*7 +j];
33
- if ( i < 8 )
34
- {
35
- key_unrav[i*8 +j] = kunrav[i*7 +j]; ++j;
36
- key_unrav[i*8 +j+1 ] = kunrav[i*7 +j]; ++j;
37
- key_unrav[i*8 +j+1 ] = kunrav[i*7 +j]; ++j;
38
- }
39
- }
40
- }
41
-
42
-
43
24
_TEGGO_NEWDES_FAKE_INLINE
44
25
void NEWDES_Cipher::SetupEncipher (void const * key)
45
26
{
46
- int i,j;
47
- #if defined _X86_ASSEMBLER
48
- byte_t kunrav[UNRAV_BYTES];
49
- #else
50
- byte_t * kunrav = key_unrav;
51
- #endif
52
- for ( j=0 ; j < UNRAV_BYTES; )
53
- for ( i=0 ; i < KEY_BYTES; ++i)
54
- kunrav[j++] = ((byte_t const *)key)[i];
55
- #if defined _X86_ASSEMBLER
56
- Normalize_ (kunrav);
57
- #endif
27
+ NDES_Init_Encipher (&ctx,key);
58
28
}
59
29
60
30
_TEGGO_NEWDES_FAKE_INLINE
61
- void NEWDES_Cipher::SetupDecipher (void const * _key )
31
+ void NEWDES_Cipher::SetupDecipher (void const * key )
62
32
{
63
- #if defined _X86_ASSEMBLER
64
- byte_t kunrav[UNRAV_BYTES];
65
- #else
66
- byte_t * kunrav = key_unrav;
67
- #endif
68
- byte_t * k = kunrav;
69
- byte_t const * key = (byte_t const *)_key;
70
- int i = 11 , j=0 ;
71
- while (1 )
72
- {
73
- *(k++) = key[i];
74
- i = ((i+1 ) % KEY_BYTES );
75
- *(k++) = key[i];
76
- i = ((i+1 ) % KEY_BYTES );
77
- *(k++) = key[i];
78
- i = ((i+1 ) % KEY_BYTES );
79
-
80
- *(k++) = key[i];
81
- i = (i+9 ) % 15 ;
82
- if (i == 12 ) break ;
83
-
84
- *(k++) = key[i++];
85
- *(k++) = key[i++];
86
- *(k++) = key[i];
87
- i = (i+9 ) % 15 ;
88
- }
89
- #if defined _X86_ASSEMBLER
90
- Normalize_ (kunrav);
91
- #endif
33
+ NDES_Init_Decipher (&ctx,key);
92
34
}
93
35
94
36
_TEGGO_NEWDES_FAKE_INLINE
95
- void NEWDES_Cipher::DoCipherBlock (void * _b )
37
+ void NEWDES_Cipher::DoCipherBlock (void * b )
96
38
{
97
- #if defined _X86_ASSEMBLER
98
- NEWDES_DoCipher_S (key_unrav,_b,1 );
99
- #else
100
- static byte_t rotor[] =
101
- {
102
- 32 ,137 ,239 ,188 ,102 ,125 ,221 , 72 ,212 , 68 , 81 , 37 , 86 ,237 ,147 ,149 ,
103
- 70 ,229 , 17 ,124 ,115 ,207 , 33 , 20 ,122 ,143 , 25 ,215 , 51 ,183 ,138 ,142 ,
104
- 146 ,211 ,110 ,173 , 1 ,228 ,189 , 14 ,103 , 78 ,162 , 36 ,253 ,167 ,116 ,255 ,
105
- 158 , 45 ,185 , 50 , 98 ,168 ,250 ,235 , 54 ,141 ,195 ,247 ,240 , 63 ,148 , 2 ,
106
- 224 ,169 ,214 ,180 , 62 , 22 ,117 ,108 , 19 ,172 ,161 ,159 ,160 , 47 , 43 ,171 ,
107
- 194 ,175 ,178 , 56 ,196 ,112 , 23 ,220 , 89 , 21 ,164 ,130 ,157 , 8 , 85 ,251 ,
108
- 216 , 44 , 94 ,179 ,226 , 38 , 90 ,119 , 40 ,202 , 34 ,206 , 35 , 69 ,231 ,246 ,
109
- 29 ,109 , 74 , 71 ,176 , 6 , 60 ,145 , 65 , 13 , 77 ,151 , 12 ,127 , 95 ,199 ,
110
- 57 ,101 , 5 ,232 ,150 ,210 ,129 , 24 ,181 , 10 ,121 ,187 , 48 ,193 ,139 ,252 ,
111
- 219 , 64 , 88 ,233 , 96 ,128 , 80 , 53 ,191 ,144 ,218 , 11 ,106 ,132 ,155 ,104 ,
112
- 91 ,136 , 31 , 42 ,243 , 66 ,126 ,135 , 30 , 26 , 87 ,186 ,182 ,154 ,242 ,123 ,
113
- 82 ,166 ,208 , 39 ,152 ,190 ,113 ,205 ,114 ,105 ,225 , 84 , 73 ,163 , 99 ,111 ,
114
- 204 , 61 ,200 ,217 ,170 , 15 ,198 , 28 ,192 ,254 ,134 ,234 ,222 , 7 ,236 ,248 ,
115
- 201 , 41 ,177 ,156 , 92 ,131 , 67 ,249 ,245 ,184 ,203 , 9 ,241 , 0 , 27 , 46 ,
116
- 133 ,174 , 75 , 18 , 93 ,209 ,100 ,120 , 76 ,213 , 16 , 83 , 4 ,107 ,140 , 52 ,
117
- 58 , 55 , 3 ,244 , 97 ,197 ,238 ,227 ,118 , 49 , 79 ,230 ,223 ,165 ,153 , 59
118
- };
119
-
120
- unsigned char * k = key_unrav;
121
- byte_t * b = (byte_t *)_b;
122
- for (int count=8 ; count--;)
123
- {
124
- b[4 ] = b[4 ] ^ rotor[b[0 ] ^ *(k++)];
125
- b[5 ] = b[5 ] ^ rotor[b[1 ] ^ *(k++)];
126
- b[6 ] = b[6 ] ^ rotor[b[2 ] ^ *(k++)];
127
- b[7 ] = b[7 ] ^ rotor[b[3 ] ^ *(k++)];
128
-
129
- b[1 ] = b[1 ] ^ rotor[b[4 ] ^ *(k++)];
130
- b[2 ] = b[2 ] ^ rotor[b[4 ] ^ b[5 ]];
131
- b[3 ] = b[3 ] ^ rotor[b[6 ] ^ *(k++)];
132
- b[0 ] = b[0 ] ^ rotor[b[7 ] ^ *(k++)];
133
- }
134
- b[4 ] = b[4 ] ^ rotor[b[0 ] ^ *(k++)];
135
- b[5 ] = b[5 ] ^ rotor[b[1 ] ^ *(k++)];
136
- b[6 ] = b[6 ] ^ rotor[b[2 ] ^ *(k++)];
137
- b[7 ] = b[7 ] ^ rotor[b[3 ] ^ *(k++)];
138
- #endif
39
+ NDES_Cipher_8 (&ctx,b);
139
40
}
140
41
141
42
_TEGGO_NEWDES_FAKE_INLINE
142
43
void NEWDES_Cipher::DoCipher (void * data,u32_t count)
143
44
{
144
- #if defined _X86_ASSEMBLER
145
- NEWDES_DoCipher_S (key_unrav,(byte_t *)data,count);
146
- #else
147
- for (u32_t i = 0 ; i < count; ++i)
148
- DoCipherBlock ((byte_t *)data+BLOCK_BYTES*i);
149
- #endif
45
+ NDES_Cipher (&ctx,data,count);
150
46
}
151
47
152
48
_TEGGO_NEWDES_FAKE_INLINE
153
49
void NEWDES_Cipher::DoCipherCBCI (void * data,u32_t count, uint64_t IVc)
154
50
{
155
- byte_t q[BLOCK_BYTES ] = {0 };
51
+ byte_t q[NDES_BLOCK_BYTES ] = {0 };
156
52
if (IVc) memcpy (q,&IVc,8 );
157
53
for (u32_t i = 0 ; i < count; ++i)
158
54
{
159
- for ( int j =0 ; j < BLOCK_BYTES ; ++j )
160
- *((byte_t *)data+BLOCK_BYTES *i+j) ^= *(q+j);
161
- DoCipherBlock ((byte_t *)data+BLOCK_BYTES *i);
162
- memcpy (q,(byte_t *)data+BLOCK_BYTES *i,BLOCK_BYTES );
55
+ for ( int j =0 ; j < NDES_BLOCK_BYTES ; ++j )
56
+ *((byte_t *)data+NDES_BLOCK_BYTES *i+j) ^= *(q+j);
57
+ DoCipherBlock ((byte_t *)data+NDES_BLOCK_BYTES *i);
58
+ memcpy (q,(byte_t *)data+NDES_BLOCK_BYTES *i,NDES_BLOCK_BYTES );
163
59
}
164
60
}
165
61
166
62
_TEGGO_NEWDES_FAKE_INLINE
167
63
void NEWDES_Cipher::DoCipherCBCO (void * data,u32_t count, uint64_t IVc)
168
64
{
169
- byte_t q[BLOCK_BYTES ] = {0 };
65
+ byte_t q[NDES_BLOCK_BYTES ] = {0 };
170
66
if (IVc) memcpy (q,&IVc,8 );
171
67
for (u32_t i = 0 ; i < count; ++i)
172
68
{
173
- byte_t w[BLOCK_BYTES ];
174
- memcpy (w,(byte_t *)data+BLOCK_BYTES *i,BLOCK_BYTES );
175
- DoCipherBlock ((byte_t *)data+BLOCK_BYTES *i);
176
- for ( int j =0 ; j < BLOCK_BYTES ; ++j )
177
- *((byte_t *)data+BLOCK_BYTES *i+j) ^= *(q+j);
178
- memcpy (q,w,BLOCK_BYTES );
69
+ byte_t w[NDES_BLOCK_BYTES ];
70
+ memcpy (w,(byte_t *)data+NDES_BLOCK_BYTES *i,NDES_BLOCK_BYTES );
71
+ DoCipherBlock ((byte_t *)data+NDES_BLOCK_BYTES *i);
72
+ for ( int j =0 ; j < NDES_BLOCK_BYTES ; ++j )
73
+ *((byte_t *)data+NDES_BLOCK_BYTES *i+j) ^= *(q+j);
74
+ memcpy (q,w,NDES_BLOCK_BYTES );
179
75
}
180
76
}
181
77
0 commit comments