1 /* 2 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 #include <stdio.h> 11 12 #define DES_FCRYPT 13 #include "des_locl.h" 14 #undef DES_FCRYPT 15 16 #undef PERM_OP 17 #define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\ 18 (b)^=(t),\ 19 (a)^=((t)<<(n))) 20 21 #undef HPERM_OP 22 #define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\ 23 (a)=(a)^(t)^(t>>(16-(n))))\ 24 25 void fcrypt_body(DES_LONG *out, DES_key_schedule *ks, DES_LONG Eswap0, 26 DES_LONG Eswap1) 27 { 28 register DES_LONG l, r, t, u; 29 register DES_LONG *s; 30 register int j; 31 register DES_LONG E0, E1; 32 33 l = 0; 34 r = 0; 35 36 s = (DES_LONG *)ks; 37 E0 = Eswap0; 38 E1 = Eswap1; 39 40 for (j = 0; j < 25; j++) { 41 D_ENCRYPT(l, r, 0); /* 1 */ 42 D_ENCRYPT(r, l, 2); /* 2 */ 43 D_ENCRYPT(l, r, 4); /* 3 */ 44 D_ENCRYPT(r, l, 6); /* 4 */ 45 D_ENCRYPT(l, r, 8); /* 5 */ 46 D_ENCRYPT(r, l, 10); /* 6 */ 47 D_ENCRYPT(l, r, 12); /* 7 */ 48 D_ENCRYPT(r, l, 14); /* 8 */ 49 D_ENCRYPT(l, r, 16); /* 9 */ 50 D_ENCRYPT(r, l, 18); /* 10 */ 51 D_ENCRYPT(l, r, 20); /* 11 */ 52 D_ENCRYPT(r, l, 22); /* 12 */ 53 D_ENCRYPT(l, r, 24); /* 13 */ 54 D_ENCRYPT(r, l, 26); /* 14 */ 55 D_ENCRYPT(l, r, 28); /* 15 */ 56 D_ENCRYPT(r, l, 30); /* 16 */ 57 t = l; 58 l = r; 59 r = t; 60 } 61 l = ROTATE(l, 3) & 0xffffffffL; 62 r = ROTATE(r, 3) & 0xffffffffL; 63 64 PERM_OP(l, r, t, 1, 0x55555555L); 65 PERM_OP(r, l, t, 8, 0x00ff00ffL); 66 PERM_OP(l, r, t, 2, 0x33333333L); 67 PERM_OP(r, l, t, 16, 0x0000ffffL); 68 PERM_OP(l, r, t, 4, 0x0f0f0f0fL); 69 70 out[0] = r; 71 out[1] = l; 72 } 73