Sicherung
[libgcrypt.git] / cipher / des.c
1 /* des.c
2  *      Copyright (C) 1998 Free Software Foundation, Inc.
3  *
4  * This file is part of GNUPG.
5  *
6  * GNUPG is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * GNUPG is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  */
20
21 #include <config.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <assert.h>
26 #include "util.h"
27 #include "types.h"
28 #include "des.h"
29
30
31 static const int IP[64] = {
32   58, 50, 42, 34, 26, 18, 10,  2, 60, 52, 44, 36, 28, 20, 12, 4,
33   62, 54, 46, 38, 30, 22, 14,  6, 64, 56, 48, 40, 32, 24, 16, 8,
34   57, 49, 41, 33, 25, 17,  9,  1, 59, 51, 43, 35, 27, 19, 11, 3,
35   61, 53, 45, 37, 29, 21, 13,  5, 63, 55, 47, 39, 31, 23, 15, 7
36 };
37
38 /* this is IP^(-1) */
39 static const int IPinv[64] = {
40   40,  8, 48, 16, 56, 24, 64, 32, 39,  7, 47, 15, 55, 23, 63, 31,
41   38,  6, 46, 14, 54, 22, 62, 30, 37,  5, 45, 13, 53, 21, 61, 29,
42   36,  4, 44, 12, 52, 20, 60, 28, 35,  3, 43, 11, 51, 19, 59, 27,
43   34,  2, 42, 10, 50, 18, 58, 26, 33,  1, 41,  9, 49, 17, 57, 25
44 };
45
46 static const int E[48] = {
47   32,  1,  2,  3,  4,  5,  4,  5,  6,  7,  8,  9,
48    8,  9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17,
49   16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,
50   24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32,  1
51 };
52
53 static const int P[32] = {
54   16,  7, 20, 21, 29, 12, 28, 17,  1, 15, 23, 26,  5, 18, 31, 10,
55   2,   8, 24, 14, 32, 27,  3,  9, 19, 13, 30,  6, 22, 11,  4, 25
56 };
57
58 static const int PC1[56] = {
59   57, 49, 41, 33, 25, 17,  9, 1, 58, 50, 42, 34, 26, 18,
60   10,  2, 59, 51, 43, 35, 27, 19, 11,  3, 60, 52, 44, 36,
61   63, 55, 47, 39, 31, 23, 15,  7, 62, 54, 46, 38, 30, 22,
62   14,  6, 61, 53, 45, 37, 29, 21, 13,  5, 28, 20, 12,  4
63 };
64
65 static const int PC2[48] = {
66   14, 17, 11, 24,  1,  5,  3, 28, 15,  6, 21, 10,
67   23, 19, 12,  4, 26,  8, 16,  7, 27, 20, 13,  2,
68   41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,
69   44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32
70 };
71
72 /* S-boxes */
73 static const int sbox[8][4][16]= {
74     { { 14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7 },
75       {  0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8 },
76       {  4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0 },
77       { 15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13 }
78     },
79     { { 15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10 },
80       {  3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5 },
81       {  0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15 },
82       { 13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9 }
83     },
84     { { 10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8 },
85       { 13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1 },
86       { 13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7 },
87       {  1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12 }
88     },
89     { {  7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15 },
90       { 13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9 },
91       { 10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4 },
92       {  3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14 }
93     },
94     { {  2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9 },
95       { 14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6 },
96       {  4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14 },
97       { 11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3 }
98     },
99     { { 12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11 },
100       { 10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8 },
101       {  9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6 },
102       {  4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13 }
103     },
104     { {  4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1 },
105       { 13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6 },
106       {  1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2 },
107       {  6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12 }
108     },
109     { { 13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7 },
110       {  1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2 },
111       {  7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8 },
112       {  2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11 }
113     }
114 };
115
116 /*
117  * How much to rotate each 28 bit half of the pc1 permutated
118  *  56 bit key before using pc2 to give the i' key
119  */
120 static const int rots[16] = {
121   1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
122 };
123
124
125 struct ip_table { u32 l, r };
126
127
128
129 static struct ip_table *ip_tbl, *ipinv_tbl;
130
131 static struct ip_table *
132 make_ip_table( int *bitno )
133 {
134     struct ip_table *ip = m_alloc( 8*256* sizeof *ip );
135     for(i=0; i < 8; i++ )
136
137     return ip;
138 }
139
140
141 static void
142 gen_tables()
143 {
144     ip_tbl = make_ip_table( IP );
145     ipinv_tbl = make_ip_table( IPinv );
146 }
147
148
149
150
151
152
153
154 void
155 des_encrypt_block( DES_context *bc, byte *outbuf, byte *inbuf )
156 {
157     u32 l, r;
158
159     data =   inbuf[0] << 56 | inbuf[1] << 48 | inbuf[2] << 40 | inbuf[3] << 32
160            | inbuf[4] << 24 | inbuf[5] << 16 | inbuf[6] <<  8 | inbuf[7];
161
162 #define IP(L, R, B) \
163         L  = ip[0][B[0]].l; R  = ip[0][B[0]].r; \
164         L |= ip[1][B[1]].l; R |= ip[1][B[1]].r; \
165         L |= ip[2][B[2]].l; R |= ip[2][B[2]].r; \
166         L |= ip[3][B[3]].l; R |= ip[3][B[3]].r; \
167         L |= ip[4][B[4]].l; R |= ip[4][B[4]].r; \
168         L |= ip[5][B[5]].l; R |= ip[5][B[5]].r; \
169         L |= ip[6][B[6]].l; R |= ip[6][B[6]].r; \
170         L |= ip[7][B[7]].l; R |= ip[7][B[7]].r
171
172
173
174     encrypt( bc, &d1, &d2 );
175     outbuf[0] = (d1 >> 24) & 0xff;
176     outbuf[1] = (d1 >> 16) & 0xff;
177     outbuf[2] = (d1 >>  8) & 0xff;
178     outbuf[3] =  d1        & 0xff;
179     outbuf[4] = (d2 >> 24) & 0xff;
180     outbuf[5] = (d2 >> 16) & 0xff;
181     outbuf[6] = (d2 >>  8) & 0xff;
182     outbuf[7] =  d2        & 0xff;
183 }
184
185
186 void
187 des_decrypt_block( BLOWFISH_context *bc, byte *outbuf, byte *inbuf )
188 {
189     u32 d1, d2;
190
191     d1 = inbuf[0] << 24 | inbuf[1] << 16 | inbuf[2] << 8 | inbuf[3];
192     d2 = inbuf[4] << 24 | inbuf[5] << 16 | inbuf[6] << 8 | inbuf[7];
193     decrypt( bc, &d1, &d2 );
194     outbuf[0] = (d1 >> 24) & 0xff;
195     outbuf[1] = (d1 >> 16) & 0xff;
196     outbuf[2] = (d1 >>  8) & 0xff;
197     outbuf[3] =  d1        & 0xff;
198     outbuf[4] = (d2 >> 24) & 0xff;
199     outbuf[5] = (d2 >> 16) & 0xff;
200     outbuf[6] = (d2 >>  8) & 0xff;
201     outbuf[7] =  d2        & 0xff;
202 }
203
204
205 static void
206 selftest()
207 {
208 }
209
210
211 void
212 des_3des_setkey( DES_context *c, byte *key, unsigned keylen )
213 {
214     c->tripledes = 1;
215 }
216
217 void
218 des_setkey( DES_context *c, byte *key, unsigned keylen )
219 {
220 }
221
222