| 1 | #include "des.h" |
|---|
| 2 | #include <stdio.h> |
|---|
| 3 | //#include <memory.h> |
|---|
| 4 | #include <string.h> |
|---|
| 5 | #include "../secure_boot.h" |
|---|
| 6 | /* openssl-0.9.7d spr.h */ |
|---|
| 7 | |
|---|
| 8 | const DES_LONG DES_SPtrans[8][64]={ |
|---|
| 9 | { |
|---|
| 10 | /* nibble 0 */ |
|---|
| 11 | 0x02080800L, 0x00080000L, 0x02000002L, 0x02080802L, |
|---|
| 12 | 0x02000000L, 0x00080802L, 0x00080002L, 0x02000002L, |
|---|
| 13 | 0x00080802L, 0x02080800L, 0x02080000L, 0x00000802L, |
|---|
| 14 | 0x02000802L, 0x02000000L, 0x00000000L, 0x00080002L, |
|---|
| 15 | 0x00080000L, 0x00000002L, 0x02000800L, 0x00080800L, |
|---|
| 16 | 0x02080802L, 0x02080000L, 0x00000802L, 0x02000800L, |
|---|
| 17 | 0x00000002L, 0x00000800L, 0x00080800L, 0x02080002L, |
|---|
| 18 | 0x00000800L, 0x02000802L, 0x02080002L, 0x00000000L, |
|---|
| 19 | 0x00000000L, 0x02080802L, 0x02000800L, 0x00080002L, |
|---|
| 20 | 0x02080800L, 0x00080000L, 0x00000802L, 0x02000800L, |
|---|
| 21 | 0x02080002L, 0x00000800L, 0x00080800L, 0x02000002L, |
|---|
| 22 | 0x00080802L, 0x00000002L, 0x02000002L, 0x02080000L, |
|---|
| 23 | 0x02080802L, 0x00080800L, 0x02080000L, 0x02000802L, |
|---|
| 24 | 0x02000000L, 0x00000802L, 0x00080002L, 0x00000000L, |
|---|
| 25 | 0x00080000L, 0x02000000L, 0x02000802L, 0x02080800L, |
|---|
| 26 | 0x00000002L, 0x02080002L, 0x00000800L, 0x00080802L, |
|---|
| 27 | },{ |
|---|
| 28 | /* nibble 1 */ |
|---|
| 29 | 0x40108010L, 0x00000000L, 0x00108000L, 0x40100000L, |
|---|
| 30 | 0x40000010L, 0x00008010L, 0x40008000L, 0x00108000L, |
|---|
| 31 | 0x00008000L, 0x40100010L, 0x00000010L, 0x40008000L, |
|---|
| 32 | 0x00100010L, 0x40108000L, 0x40100000L, 0x00000010L, |
|---|
| 33 | 0x00100000L, 0x40008010L, 0x40100010L, 0x00008000L, |
|---|
| 34 | 0x00108010L, 0x40000000L, 0x00000000L, 0x00100010L, |
|---|
| 35 | 0x40008010L, 0x00108010L, 0x40108000L, 0x40000010L, |
|---|
| 36 | 0x40000000L, 0x00100000L, 0x00008010L, 0x40108010L, |
|---|
| 37 | 0x00100010L, 0x40108000L, 0x40008000L, 0x00108010L, |
|---|
| 38 | 0x40108010L, 0x00100010L, 0x40000010L, 0x00000000L, |
|---|
| 39 | 0x40000000L, 0x00008010L, 0x00100000L, 0x40100010L, |
|---|
| 40 | 0x00008000L, 0x40000000L, 0x00108010L, 0x40008010L, |
|---|
| 41 | 0x40108000L, 0x00008000L, 0x00000000L, 0x40000010L, |
|---|
| 42 | 0x00000010L, 0x40108010L, 0x00108000L, 0x40100000L, |
|---|
| 43 | 0x40100010L, 0x00100000L, 0x00008010L, 0x40008000L, |
|---|
| 44 | 0x40008010L, 0x00000010L, 0x40100000L, 0x00108000L, |
|---|
| 45 | },{ |
|---|
| 46 | /* nibble 2 */ |
|---|
| 47 | 0x04000001L, 0x04040100L, 0x00000100L, 0x04000101L, |
|---|
| 48 | 0x00040001L, 0x04000000L, 0x04000101L, 0x00040100L, |
|---|
| 49 | 0x04000100L, 0x00040000L, 0x04040000L, 0x00000001L, |
|---|
| 50 | 0x04040101L, 0x00000101L, 0x00000001L, 0x04040001L, |
|---|
| 51 | 0x00000000L, 0x00040001L, 0x04040100L, 0x00000100L, |
|---|
| 52 | 0x00000101L, 0x04040101L, 0x00040000L, 0x04000001L, |
|---|
| 53 | 0x04040001L, 0x04000100L, 0x00040101L, 0x04040000L, |
|---|
| 54 | 0x00040100L, 0x00000000L, 0x04000000L, 0x00040101L, |
|---|
| 55 | 0x04040100L, 0x00000100L, 0x00000001L, 0x00040000L, |
|---|
| 56 | 0x00000101L, 0x00040001L, 0x04040000L, 0x04000101L, |
|---|
| 57 | 0x00000000L, 0x04040100L, 0x00040100L, 0x04040001L, |
|---|
| 58 | 0x00040001L, 0x04000000L, 0x04040101L, 0x00000001L, |
|---|
| 59 | 0x00040101L, 0x04000001L, 0x04000000L, 0x04040101L, |
|---|
| 60 | 0x00040000L, 0x04000100L, 0x04000101L, 0x00040100L, |
|---|
| 61 | 0x04000100L, 0x00000000L, 0x04040001L, 0x00000101L, |
|---|
| 62 | 0x04000001L, 0x00040101L, 0x00000100L, 0x04040000L, |
|---|
| 63 | },{ |
|---|
| 64 | /* nibble 3 */ |
|---|
| 65 | 0x00401008L, 0x10001000L, 0x00000008L, 0x10401008L, |
|---|
| 66 | 0x00000000L, 0x10400000L, 0x10001008L, 0x00400008L, |
|---|
| 67 | 0x10401000L, 0x10000008L, 0x10000000L, 0x00001008L, |
|---|
| 68 | 0x10000008L, 0x00401008L, 0x00400000L, 0x10000000L, |
|---|
| 69 | 0x10400008L, 0x00401000L, 0x00001000L, 0x00000008L, |
|---|
| 70 | 0x00401000L, 0x10001008L, 0x10400000L, 0x00001000L, |
|---|
| 71 | 0x00001008L, 0x00000000L, 0x00400008L, 0x10401000L, |
|---|
| 72 | 0x10001000L, 0x10400008L, 0x10401008L, 0x00400000L, |
|---|
| 73 | 0x10400008L, 0x00001008L, 0x00400000L, 0x10000008L, |
|---|
| 74 | 0x00401000L, 0x10001000L, 0x00000008L, 0x10400000L, |
|---|
| 75 | 0x10001008L, 0x00000000L, 0x00001000L, 0x00400008L, |
|---|
| 76 | 0x00000000L, 0x10400008L, 0x10401000L, 0x00001000L, |
|---|
| 77 | 0x10000000L, 0x10401008L, 0x00401008L, 0x00400000L, |
|---|
| 78 | 0x10401008L, 0x00000008L, 0x10001000L, 0x00401008L, |
|---|
| 79 | 0x00400008L, 0x00401000L, 0x10400000L, 0x10001008L, |
|---|
| 80 | 0x00001008L, 0x10000000L, 0x10000008L, 0x10401000L, |
|---|
| 81 | },{ |
|---|
| 82 | /* nibble 4 */ |
|---|
| 83 | 0x08000000L, 0x00010000L, 0x00000400L, 0x08010420L, |
|---|
| 84 | 0x08010020L, 0x08000400L, 0x00010420L, 0x08010000L, |
|---|
| 85 | 0x00010000L, 0x00000020L, 0x08000020L, 0x00010400L, |
|---|
| 86 | 0x08000420L, 0x08010020L, 0x08010400L, 0x00000000L, |
|---|
| 87 | 0x00010400L, 0x08000000L, 0x00010020L, 0x00000420L, |
|---|
| 88 | 0x08000400L, 0x00010420L, 0x00000000L, 0x08000020L, |
|---|
| 89 | 0x00000020L, 0x08000420L, 0x08010420L, 0x00010020L, |
|---|
| 90 | 0x08010000L, 0x00000400L, 0x00000420L, 0x08010400L, |
|---|
| 91 | 0x08010400L, 0x08000420L, 0x00010020L, 0x08010000L, |
|---|
| 92 | 0x00010000L, 0x00000020L, 0x08000020L, 0x08000400L, |
|---|
| 93 | 0x08000000L, 0x00010400L, 0x08010420L, 0x00000000L, |
|---|
| 94 | 0x00010420L, 0x08000000L, 0x00000400L, 0x00010020L, |
|---|
| 95 | 0x08000420L, 0x00000400L, 0x00000000L, 0x08010420L, |
|---|
| 96 | 0x08010020L, 0x08010400L, 0x00000420L, 0x00010000L, |
|---|
| 97 | 0x00010400L, 0x08010020L, 0x08000400L, 0x00000420L, |
|---|
| 98 | 0x00000020L, 0x00010420L, 0x08010000L, 0x08000020L, |
|---|
| 99 | },{ |
|---|
| 100 | /* nibble 5 */ |
|---|
| 101 | 0x80000040L, 0x00200040L, 0x00000000L, 0x80202000L, |
|---|
| 102 | 0x00200040L, 0x00002000L, 0x80002040L, 0x00200000L, |
|---|
| 103 | 0x00002040L, 0x80202040L, 0x00202000L, 0x80000000L, |
|---|
| 104 | 0x80002000L, 0x80000040L, 0x80200000L, 0x00202040L, |
|---|
| 105 | 0x00200000L, 0x80002040L, 0x80200040L, 0x00000000L, |
|---|
| 106 | 0x00002000L, 0x00000040L, 0x80202000L, 0x80200040L, |
|---|
| 107 | 0x80202040L, 0x80200000L, 0x80000000L, 0x00002040L, |
|---|
| 108 | 0x00000040L, 0x00202000L, 0x00202040L, 0x80002000L, |
|---|
| 109 | 0x00002040L, 0x80000000L, 0x80002000L, 0x00202040L, |
|---|
| 110 | 0x80202000L, 0x00200040L, 0x00000000L, 0x80002000L, |
|---|
| 111 | 0x80000000L, 0x00002000L, 0x80200040L, 0x00200000L, |
|---|
| 112 | 0x00200040L, 0x80202040L, 0x00202000L, 0x00000040L, |
|---|
| 113 | 0x80202040L, 0x00202000L, 0x00200000L, 0x80002040L, |
|---|
| 114 | 0x80000040L, 0x80200000L, 0x00202040L, 0x00000000L, |
|---|
| 115 | 0x00002000L, 0x80000040L, 0x80002040L, 0x80202000L, |
|---|
| 116 | 0x80200000L, 0x00002040L, 0x00000040L, 0x80200040L, |
|---|
| 117 | },{ |
|---|
| 118 | /* nibble 6 */ |
|---|
| 119 | 0x00004000L, 0x00000200L, 0x01000200L, 0x01000004L, |
|---|
| 120 | 0x01004204L, 0x00004004L, 0x00004200L, 0x00000000L, |
|---|
| 121 | 0x01000000L, 0x01000204L, 0x00000204L, 0x01004000L, |
|---|
| 122 | 0x00000004L, 0x01004200L, 0x01004000L, 0x00000204L, |
|---|
| 123 | 0x01000204L, 0x00004000L, 0x00004004L, 0x01004204L, |
|---|
| 124 | 0x00000000L, 0x01000200L, 0x01000004L, 0x00004200L, |
|---|
| 125 | 0x01004004L, 0x00004204L, 0x01004200L, 0x00000004L, |
|---|
| 126 | 0x00004204L, 0x01004004L, 0x00000200L, 0x01000000L, |
|---|
| 127 | 0x00004204L, 0x01004000L, 0x01004004L, 0x00000204L, |
|---|
| 128 | 0x00004000L, 0x00000200L, 0x01000000L, 0x01004004L, |
|---|
| 129 | 0x01000204L, 0x00004204L, 0x00004200L, 0x00000000L, |
|---|
| 130 | 0x00000200L, 0x01000004L, 0x00000004L, 0x01000200L, |
|---|
| 131 | 0x00000000L, 0x01000204L, 0x01000200L, 0x00004200L, |
|---|
| 132 | 0x00000204L, 0x00004000L, 0x01004204L, 0x01000000L, |
|---|
| 133 | 0x01004200L, 0x00000004L, 0x00004004L, 0x01004204L, |
|---|
| 134 | 0x01000004L, 0x01004200L, 0x01004000L, 0x00004004L, |
|---|
| 135 | },{ |
|---|
| 136 | /* nibble 7 */ |
|---|
| 137 | 0x20800080L, 0x20820000L, 0x00020080L, 0x00000000L, |
|---|
| 138 | 0x20020000L, 0x00800080L, 0x20800000L, 0x20820080L, |
|---|
| 139 | 0x00000080L, 0x20000000L, 0x00820000L, 0x00020080L, |
|---|
| 140 | 0x00820080L, 0x20020080L, 0x20000080L, 0x20800000L, |
|---|
| 141 | 0x00020000L, 0x00820080L, 0x00800080L, 0x20020000L, |
|---|
| 142 | 0x20820080L, 0x20000080L, 0x00000000L, 0x00820000L, |
|---|
| 143 | 0x20000000L, 0x00800000L, 0x20020080L, 0x20800080L, |
|---|
| 144 | 0x00800000L, 0x00020000L, 0x20820000L, 0x00000080L, |
|---|
| 145 | 0x00800000L, 0x00020000L, 0x20000080L, 0x20820080L, |
|---|
| 146 | 0x00020080L, 0x20000000L, 0x00000000L, 0x00820000L, |
|---|
| 147 | 0x20800080L, 0x20020080L, 0x20020000L, 0x00800080L, |
|---|
| 148 | 0x20820000L, 0x00000080L, 0x00800080L, 0x20020000L, |
|---|
| 149 | 0x20820080L, 0x00800000L, 0x20800000L, 0x20000080L, |
|---|
| 150 | 0x00820000L, 0x00020080L, 0x20020080L, 0x20800000L, |
|---|
| 151 | 0x00000080L, 0x20820000L, 0x00820080L, 0x00000000L, |
|---|
| 152 | 0x20000000L, 0x20800080L, 0x00020000L, 0x00820080L, |
|---|
| 153 | }}; |
|---|
| 154 | |
|---|
| 155 | |
|---|
| 156 | void DES_encrypt2(DES_LONG *data, DES_key_schedule *ks, int enc); |
|---|
| 157 | |
|---|
| 158 | void DES_encrypt3(DES_LONG *data, DES_key_schedule *ks1, |
|---|
| 159 | DES_key_schedule *ks2, DES_key_schedule *ks3); |
|---|
| 160 | void DES_decrypt3(DES_LONG *data, DES_key_schedule *ks1, |
|---|
| 161 | DES_key_schedule *ks2, DES_key_schedule *ks3); |
|---|
| 162 | int DES_check_key_parity(const DES_cblock *key); |
|---|
| 163 | int DES_is_weak_key(const DES_cblock *key); |
|---|
| 164 | |
|---|
| 165 | |
|---|
| 166 | void DES_encrypt2(DES_LONG *data, DES_key_schedule *ks, int enc) |
|---|
| 167 | { |
|---|
| 168 | register DES_LONG l,r,t,u; |
|---|
| 169 | #ifdef DES_PTR |
|---|
| 170 | register const unsigned char *des_SP=(const unsigned char *)DES_SPtrans; |
|---|
| 171 | #endif |
|---|
| 172 | #ifndef DES_UNROLL |
|---|
| 173 | register int i; |
|---|
| 174 | #endif |
|---|
| 175 | register DES_LONG *s; |
|---|
| 176 | |
|---|
| 177 | r=data[0]; |
|---|
| 178 | l=data[1]; |
|---|
| 179 | |
|---|
| 180 | /* Things have been modified so that the initial rotate is |
|---|
| 181 | * done outside the loop. This required the |
|---|
| 182 | * DES_SPtrans values in sp.h to be rotated 1 bit to the right. |
|---|
| 183 | * One perl script later and things have a 5% speed up on a sparc2. |
|---|
| 184 | * Thanks to Richard Outerbridge <71755.204@CompuServe.COM> |
|---|
| 185 | * for pointing this out. */ |
|---|
| 186 | /* clear the top bits on machines with 8byte longs */ |
|---|
| 187 | r=ROTATE(r,29)&0xffffffffL; |
|---|
| 188 | l=ROTATE(l,29)&0xffffffffL; |
|---|
| 189 | |
|---|
| 190 | s=ks->ks->deslong; |
|---|
| 191 | /* I don't know if it is worth the effort of loop unrolling the |
|---|
| 192 | * inner loop */ |
|---|
| 193 | if (enc) |
|---|
| 194 | { |
|---|
| 195 | #ifdef DES_UNROLL |
|---|
| 196 | D_ENCRYPT(l,r, 0); /* 1 */ |
|---|
| 197 | D_ENCRYPT(r,l, 2); /* 2 */ |
|---|
| 198 | D_ENCRYPT(l,r, 4); /* 3 */ |
|---|
| 199 | D_ENCRYPT(r,l, 6); /* 4 */ |
|---|
| 200 | D_ENCRYPT(l,r, 8); /* 5 */ |
|---|
| 201 | D_ENCRYPT(r,l,10); /* 6 */ |
|---|
| 202 | D_ENCRYPT(l,r,12); /* 7 */ |
|---|
| 203 | D_ENCRYPT(r,l,14); /* 8 */ |
|---|
| 204 | D_ENCRYPT(l,r,16); /* 9 */ |
|---|
| 205 | D_ENCRYPT(r,l,18); /* 10 */ |
|---|
| 206 | D_ENCRYPT(l,r,20); /* 11 */ |
|---|
| 207 | D_ENCRYPT(r,l,22); /* 12 */ |
|---|
| 208 | D_ENCRYPT(l,r,24); /* 13 */ |
|---|
| 209 | D_ENCRYPT(r,l,26); /* 14 */ |
|---|
| 210 | D_ENCRYPT(l,r,28); /* 15 */ |
|---|
| 211 | D_ENCRYPT(r,l,30); /* 16 */ |
|---|
| 212 | #else |
|---|
| 213 | for (i=0; i<32; i+=8) |
|---|
| 214 | { |
|---|
| 215 | D_ENCRYPT(l,r,i+0); /* 1 */ |
|---|
| 216 | D_ENCRYPT(r,l,i+2); /* 2 */ |
|---|
| 217 | D_ENCRYPT(l,r,i+4); /* 3 */ |
|---|
| 218 | D_ENCRYPT(r,l,i+6); /* 4 */ |
|---|
| 219 | } |
|---|
| 220 | #endif |
|---|
| 221 | } |
|---|
| 222 | else |
|---|
| 223 | { |
|---|
| 224 | #ifdef DES_UNROLL |
|---|
| 225 | D_ENCRYPT(l,r,30); /* 16 */ |
|---|
| 226 | D_ENCRYPT(r,l,28); /* 15 */ |
|---|
| 227 | D_ENCRYPT(l,r,26); /* 14 */ |
|---|
| 228 | D_ENCRYPT(r,l,24); /* 13 */ |
|---|
| 229 | D_ENCRYPT(l,r,22); /* 12 */ |
|---|
| 230 | D_ENCRYPT(r,l,20); /* 11 */ |
|---|
| 231 | D_ENCRYPT(l,r,18); /* 10 */ |
|---|
| 232 | D_ENCRYPT(r,l,16); /* 9 */ |
|---|
| 233 | D_ENCRYPT(l,r,14); /* 8 */ |
|---|
| 234 | D_ENCRYPT(r,l,12); /* 7 */ |
|---|
| 235 | D_ENCRYPT(l,r,10); /* 6 */ |
|---|
| 236 | D_ENCRYPT(r,l, 8); /* 5 */ |
|---|
| 237 | D_ENCRYPT(l,r, 6); /* 4 */ |
|---|
| 238 | D_ENCRYPT(r,l, 4); /* 3 */ |
|---|
| 239 | D_ENCRYPT(l,r, 2); /* 2 */ |
|---|
| 240 | D_ENCRYPT(r,l, 0); /* 1 */ |
|---|
| 241 | #else |
|---|
| 242 | for (i=30; i>0; i-=8) |
|---|
| 243 | { |
|---|
| 244 | D_ENCRYPT(l,r,i-0); /* 16 */ |
|---|
| 245 | D_ENCRYPT(r,l,i-2); /* 15 */ |
|---|
| 246 | D_ENCRYPT(l,r,i-4); /* 14 */ |
|---|
| 247 | D_ENCRYPT(r,l,i-6); /* 13 */ |
|---|
| 248 | } |
|---|
| 249 | #endif |
|---|
| 250 | } |
|---|
| 251 | /* rotate and clear the top bits on machines with 8byte longs */ |
|---|
| 252 | data[0]=ROTATE(l,3)&0xffffffffL; |
|---|
| 253 | data[1]=ROTATE(r,3)&0xffffffffL; |
|---|
| 254 | l=r=t=u=0; |
|---|
| 255 | } |
|---|
| 256 | |
|---|
| 257 | void DES_encrypt3(DES_LONG *data, DES_key_schedule *ks1, |
|---|
| 258 | DES_key_schedule *ks2, DES_key_schedule *ks3) |
|---|
| 259 | { |
|---|
| 260 | register DES_LONG l,r; |
|---|
| 261 | |
|---|
| 262 | l=data[0]; |
|---|
| 263 | r=data[1]; |
|---|
| 264 | IP(l,r); |
|---|
| 265 | data[0]=l; |
|---|
| 266 | data[1]=r; |
|---|
| 267 | DES_encrypt2((DES_LONG *)data,ks1,DES_ENCRYPT); |
|---|
| 268 | DES_encrypt2((DES_LONG *)data,ks2,DES_DECRYPT); |
|---|
| 269 | DES_encrypt2((DES_LONG *)data,ks3,DES_ENCRYPT); |
|---|
| 270 | l=data[0]; |
|---|
| 271 | r=data[1]; |
|---|
| 272 | FP(r,l); |
|---|
| 273 | data[0]=l; |
|---|
| 274 | data[1]=r; |
|---|
| 275 | } |
|---|
| 276 | |
|---|
| 277 | void DES_decrypt3(DES_LONG *data, DES_key_schedule *ks1, |
|---|
| 278 | DES_key_schedule *ks2, DES_key_schedule *ks3) |
|---|
| 279 | { |
|---|
| 280 | register DES_LONG l,r; |
|---|
| 281 | |
|---|
| 282 | l=data[0]; |
|---|
| 283 | r=data[1]; |
|---|
| 284 | IP(l,r); |
|---|
| 285 | data[0]=l; |
|---|
| 286 | data[1]=r; |
|---|
| 287 | DES_encrypt2((DES_LONG *)data,ks3,DES_DECRYPT); |
|---|
| 288 | DES_encrypt2((DES_LONG *)data,ks2,DES_ENCRYPT); |
|---|
| 289 | DES_encrypt2((DES_LONG *)data,ks1,DES_DECRYPT); |
|---|
| 290 | l=data[0]; |
|---|
| 291 | r=data[1]; |
|---|
| 292 | FP(r,l); |
|---|
| 293 | data[0]=l; |
|---|
| 294 | data[1]=r; |
|---|
| 295 | } |
|---|
| 296 | |
|---|
| 297 | /* openssl-0.9.7d ecb3_enc.c */ |
|---|
| 298 | void DES_ecb3_encrypt(const DES_cblock *input, DES_cblock *output, |
|---|
| 299 | DES_key_schedule *ks1, DES_key_schedule *ks2, |
|---|
| 300 | DES_key_schedule *ks3, |
|---|
| 301 | int enc) |
|---|
| 302 | { |
|---|
| 303 | register DES_LONG l0,l1; |
|---|
| 304 | DES_LONG ll[2]; |
|---|
| 305 | const unsigned char *in = &(*input)[0]; |
|---|
| 306 | unsigned char *out = &(*output)[0]; |
|---|
| 307 | |
|---|
| 308 | c2l(in,l0); |
|---|
| 309 | c2l(in,l1); |
|---|
| 310 | ll[0]=l0; |
|---|
| 311 | ll[1]=l1; |
|---|
| 312 | if (enc) |
|---|
| 313 | DES_encrypt3(ll,ks1,ks2,ks3); |
|---|
| 314 | else |
|---|
| 315 | DES_decrypt3(ll,ks1,ks2,ks3); |
|---|
| 316 | l0=ll[0]; |
|---|
| 317 | l1=ll[1]; |
|---|
| 318 | l2c(l0,out); |
|---|
| 319 | l2c(l1,out); |
|---|
| 320 | } |
|---|
| 321 | |
|---|
| 322 | void DES_set_key_unchecked(const DES_cblock *key, DES_key_schedule *schedule) |
|---|
| 323 | { |
|---|
| 324 | static int shifts2[16]={0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0}; |
|---|
| 325 | register DES_LONG c,d,t,s,t2; |
|---|
| 326 | register const unsigned char *in; |
|---|
| 327 | register DES_LONG *k; |
|---|
| 328 | register int i; |
|---|
| 329 | |
|---|
| 330 | k = &schedule->ks->deslong[0]; |
|---|
| 331 | in = &(*key)[0]; |
|---|
| 332 | |
|---|
| 333 | c2l(in,c); |
|---|
| 334 | c2l(in,d); |
|---|
| 335 | |
|---|
| 336 | /* do PC1 in 47 simple operations :-) |
|---|
| 337 | * Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov) |
|---|
| 338 | * for the inspiration. :-) */ |
|---|
| 339 | PERM_OP (d,c,t,4,0x0f0f0f0fL); |
|---|
| 340 | HPERM_OP(c,t,-2,0xcccc0000L); |
|---|
| 341 | HPERM_OP(d,t,-2,0xcccc0000L); |
|---|
| 342 | PERM_OP (d,c,t,1,0x55555555L); |
|---|
| 343 | PERM_OP (c,d,t,8,0x00ff00ffL); |
|---|
| 344 | PERM_OP (d,c,t,1,0x55555555L); |
|---|
| 345 | d= (((d&0x000000ffL)<<16L)| (d&0x0000ff00L) | |
|---|
| 346 | ((d&0x00ff0000L)>>16L)|((c&0xf0000000L)>>4L)); |
|---|
| 347 | c&=0x0fffffffL; |
|---|
| 348 | |
|---|
| 349 | for (i=0; i<ITERATIONS; i++) |
|---|
| 350 | { |
|---|
| 351 | if (shifts2[i]) |
|---|
| 352 | { c=((c>>2L)|(c<<26L)); d=((d>>2L)|(d<<26L)); } |
|---|
| 353 | else |
|---|
| 354 | { c=((c>>1L)|(c<<27L)); d=((d>>1L)|(d<<27L)); } |
|---|
| 355 | c&=0x0fffffffL; |
|---|
| 356 | d&=0x0fffffffL; |
|---|
| 357 | /* could be a few less shifts but I am to lazy at this |
|---|
| 358 | * point in time to investigate */ |
|---|
| 359 | s= des_skb[0][ (c )&0x3f ]| |
|---|
| 360 | des_skb[1][((c>> 6L)&0x03)|((c>> 7L)&0x3c)]| |
|---|
| 361 | des_skb[2][((c>>13L)&0x0f)|((c>>14L)&0x30)]| |
|---|
| 362 | des_skb[3][((c>>20L)&0x01)|((c>>21L)&0x06) | |
|---|
| 363 | ((c>>22L)&0x38)]; |
|---|
| 364 | t= des_skb[4][ (d )&0x3f ]| |
|---|
| 365 | des_skb[5][((d>> 7L)&0x03)|((d>> 8L)&0x3c)]| |
|---|
| 366 | des_skb[6][ (d>>15L)&0x3f ]| |
|---|
| 367 | des_skb[7][((d>>21L)&0x0f)|((d>>22L)&0x30)]; |
|---|
| 368 | |
|---|
| 369 | /* table contained 0213 4657 */ |
|---|
| 370 | t2=((t<<16L)|(s&0x0000ffffL))&0xffffffffL; |
|---|
| 371 | *(k++)=ROTATE(t2,30)&0xffffffffL; |
|---|
| 372 | |
|---|
| 373 | t2=((s>>16L)|(t&0xffff0000L)); |
|---|
| 374 | *(k++)=ROTATE(t2,26)&0xffffffffL; |
|---|
| 375 | } |
|---|
| 376 | } |
|---|
| 377 | |
|---|
| 378 | |
|---|
| 379 | |
|---|