1 /* $OpenBSD: des.h,v 1.19 2015/02/07 13:19:15 doug Exp $ */
2 /* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young (eay@cryptsoft.com).
7  * The implementation was written so as to conform with Netscapes SSL.
8  *
9  * This library is free for commercial and non-commercial use as core.stdc.config.c_long as
10  * the following conditions are aheared to.  The following conditions
11  * apply to all code found in this distribution, be it the RC4, RSA,
12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13  * included with this distribution is covered by the same copyright terms
14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15  *
16  * Copyright remains Eric Young's, and as such any Copyright notices in
17  * the code are not to be removed.
18  * If this package is used in a product, Eric Young should be given attribution
19  * as the author of the parts of the library used.
20  * This can be in the form of a textual message at program startup or
21  * in documentation (online or textual) provided with the package.
22  *
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the copyright
27  *    notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  *    notice, this list of conditions and the following disclaimer in the
30  *    documentation and/or other materials provided with the distribution.
31  * 3. All advertising materials mentioning features or use of this software
32  *    must display the following acknowledgement:
33  *    "This product includes cryptographic software written by
34  *     Eric Young (eay@cryptsoft.com)"
35  *    The word 'cryptographic' can be left out if the rouines from the library
36  *    being used are not cryptographic related :-).
37  * 4. If you include any Windows specific code (or a derivative thereof) from
38  *    the apps directory (application code) you must include an acknowledgement:
39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40  *
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  *
53  * The licence and distribution terms for any publically available version or
54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
55  * copied and put under another distribution licence
56  * [including the GNU Public Licence.]
57  */
58 module libressl_d.openssl.des;
59 
60 
61 enum HEADER_NEW_DES_H = true;
62 
63 private static import core.stdc.config;
64 public import libressl_d.openssl.opensslconf;
65 
66 version (OPENSSL_NO_DES) {
67 	static assert(false, "DES is disabled.");
68 }
69 
70 extern (C):
71 nothrow @nogc:
72 
73 alias DES_cblock = ubyte[8];
74 alias const_DES_cblock = /* const */ ubyte[8];
75 
76 /*
77  * With "const", gcc 2.8.1 on Solaris thinks that DES_cblock *
78  * and const_DES_cblock * are incompatible pointer types.
79  */
80 
81 union ks_
82 {
83 	.DES_cblock cblock;
84 
85 	/**
86 	 * make sure things are correct size on machines with
87 	 * 8 byte longs
88 	 */
89 	libressl_d.openssl.opensslconf.DES_LONG[2] deslong;
90 }
91 
92 struct DES_ks
93 {
94 	.ks_[16] ks;
95 }
96 
97 alias DES_key_schedule = .DES_ks;
98 
99 enum DES_KEY_SZ = .DES_cblock.sizeof;
100 enum DES_SCHEDULE_SZ = .DES_key_schedule.sizeof;
101 
102 enum DES_ENCRYPT = 1;
103 enum DES_DECRYPT = 0;
104 
105 enum DES_CBC_MODE = 0;
106 enum DES_PCBC_MODE = 1;
107 
108 pragma(inline, true)
109 void DES_ecb2_encrypt(.const_DES_cblock* i, .DES_cblock* o, .DES_key_schedule* k1, .DES_key_schedule* k2, int e)
110 
111 	do
112 	{
113 		.DES_ecb3_encrypt(i, o, k1, k2, k1, e);
114 	}
115 
116 pragma(inline, true)
117 void DES_ede2_cbc_encrypt(const (ubyte)* i, ubyte* o, core.stdc.config.c_long l, .DES_key_schedule* k1, .DES_key_schedule* k2, .DES_cblock* iv, int e)
118 
119 	do
120 	{
121 		.DES_ede3_cbc_encrypt(i, o, l, k1, k2, k1, iv, e);
122 	}
123 
124 pragma(inline, true)
125 void DES_ede2_cfb64_encrypt(const (ubyte)* i, ubyte* o, core.stdc.config.c_long l, .DES_key_schedule* k1, .DES_key_schedule* k2, .DES_cblock* iv, int* n, int e)
126 
127 	do
128 	{
129 		.DES_ede3_cfb64_encrypt(i, o, l, k1, k2, k1, iv, n, e);
130 	}
131 
132 pragma(inline, true)
133 void DES_ede2_ofb64_encrypt(const (ubyte)* i, ubyte* o, core.stdc.config.c_long l, .DES_key_schedule* k1, .DES_key_schedule* k2, .DES_cblock* iv, int* n)
134 
135 	do
136 	{
137 		.DES_ede3_ofb64_encrypt(i, o, l, k1, k2, k1, iv, n);
138 	}
139 
140 /**
141  * defaults to false
142  */
143 extern __gshared int DES_check_key;
144 
145 /**
146  * defaults to DES_PCBC_MODE
147  */
148 extern __gshared int DES_rw_mode;
149 
150 const (char)* DES_options();
151 void DES_ecb3_encrypt(.const_DES_cblock* input, .DES_cblock* output, .DES_key_schedule* ks1, .DES_key_schedule* ks2, .DES_key_schedule* ks3, int enc);
152 libressl_d.openssl.opensslconf.DES_LONG DES_cbc_cksum(const (ubyte)* input, .DES_cblock* output, core.stdc.config.c_long length_, .DES_key_schedule* schedule, .const_DES_cblock* ivec);
153 /* DES_cbc_encrypt does not update the IV!  Use DES_ncbc_encrypt instead. */
154 void DES_cbc_encrypt(const (ubyte)* input, ubyte* output, core.stdc.config.c_long length_, .DES_key_schedule* schedule, .DES_cblock* ivec, int enc);
155 void DES_ncbc_encrypt(const (ubyte)* input, ubyte* output, core.stdc.config.c_long length_, .DES_key_schedule* schedule, .DES_cblock* ivec, int enc);
156 void DES_xcbc_encrypt(const (ubyte)* input, ubyte* output, core.stdc.config.c_long length_, .DES_key_schedule* schedule, .DES_cblock* ivec, .const_DES_cblock* inw, .const_DES_cblock* outw, int enc);
157 void DES_cfb_encrypt(const (ubyte)* in_, ubyte* out_, int numbits, core.stdc.config.c_long length_, .DES_key_schedule* schedule, .DES_cblock* ivec, int enc);
158 void DES_ecb_encrypt(.const_DES_cblock* input, .DES_cblock* output, .DES_key_schedule* ks, int enc);
159 
160 /**
161  * This is the DES encryption function that gets called by just about
162  * every other DES routine in the library.  You should not use this
163  * function except to implement 'modes' of DES.  I say this because the
164  * functions that call this routine do the conversion from 'char *' to
165  * core.stdc.config.c_long, and this needs to be done to make sure 'non-aligned' memory
166  * access do not occur.  The characters are loaded 'little endian'.
167  * Data is a pointer to 2 core.stdc.config.c_ulong's and ks is the
168  * DES_key_schedule to use.  enc, is non zero specifies encryption,
169  * zero if decryption.
170  */
171 void DES_encrypt1(libressl_d.openssl.opensslconf.DES_LONG* data, .DES_key_schedule* ks, int enc);
172 
173 /**
174  * This functions is the same as DES_encrypt1() except that the DES
175  * initial permutation (IP) and final permutation (FP) have been left
176  * out.  As for DES_encrypt1(), you should not use this function.
177  * It is used by the routines in the library that implement triple DES.
178  * IP() DES_encrypt2() DES_encrypt2() DES_encrypt2() FP() is the same
179  * as DES_encrypt1() DES_encrypt1() DES_encrypt1() except faster :-\).
180  */
181 void DES_encrypt2(libressl_d.openssl.opensslconf.DES_LONG* data, .DES_key_schedule* ks, int enc);
182 
183 void DES_encrypt3(libressl_d.openssl.opensslconf.DES_LONG* data, .DES_key_schedule* ks1, .DES_key_schedule* ks2, .DES_key_schedule* ks3);
184 void DES_decrypt3(libressl_d.openssl.opensslconf.DES_LONG* data, .DES_key_schedule* ks1, .DES_key_schedule* ks2, .DES_key_schedule* ks3);
185 void DES_ede3_cbc_encrypt(const (ubyte)* input, ubyte* output, core.stdc.config.c_long length_, .DES_key_schedule* ks1, .DES_key_schedule* ks2, .DES_key_schedule* ks3, .DES_cblock* ivec, int enc);
186 void DES_ede3_cbcm_encrypt(const (ubyte)* in_, ubyte* out_, core.stdc.config.c_long length_, .DES_key_schedule* ks1, .DES_key_schedule* ks2, .DES_key_schedule* ks3, .DES_cblock* ivec1, .DES_cblock* ivec2, int enc);
187 void DES_ede3_cfb64_encrypt(const (ubyte)* in_, ubyte* out_, core.stdc.config.c_long length_, .DES_key_schedule* ks1, .DES_key_schedule* ks2, .DES_key_schedule* ks3, .DES_cblock* ivec, int* num, int enc);
188 void DES_ede3_cfb_encrypt(const (ubyte)* in_, ubyte* out_, int numbits, core.stdc.config.c_long length_, .DES_key_schedule* ks1, .DES_key_schedule* ks2, .DES_key_schedule* ks3, .DES_cblock* ivec, int enc);
189 void DES_ede3_ofb64_encrypt(const (ubyte)* in_, ubyte* out_, core.stdc.config.c_long length_, .DES_key_schedule* ks1, .DES_key_schedule* ks2, .DES_key_schedule* ks3, .DES_cblock* ivec, int* num);
190 int DES_enc_read(int fd, void* buf, int len, .DES_key_schedule* sched, .DES_cblock* iv);
191 int DES_enc_write(int fd, const (void)* buf, int len, .DES_key_schedule* sched, .DES_cblock* iv);
192 char* DES_fcrypt(const (char)* buf, const (char)* salt, char* ret);
193 char* DES_crypt(const (char)* buf, const (char)* salt);
194 void DES_ofb_encrypt(const (ubyte)* in_, ubyte* out_, int numbits, core.stdc.config.c_long length_, .DES_key_schedule* schedule, .DES_cblock* ivec);
195 void DES_pcbc_encrypt(const (ubyte)* input, ubyte* output, core.stdc.config.c_long length_, .DES_key_schedule* schedule, .DES_cblock* ivec, int enc);
196 libressl_d.openssl.opensslconf.DES_LONG DES_quad_cksum(const (ubyte)* input, .DES_cblock* output, core.stdc.config.c_long length_, int out_count, .DES_cblock* seed);
197 int DES_random_key(.DES_cblock* ret);
198 void DES_set_odd_parity(.DES_cblock* key);
199 int DES_check_key_parity(.const_DES_cblock* key);
200 int DES_is_weak_key(.const_DES_cblock* key);
201 
202 /**
203  * DES_set_key (= set_key = DES_key_sched = key_sched) calls
204  * DES_set_key_checked if global variable DES_check_key is set,
205  * DES_set_key_unchecked otherwise.
206  */
207 int DES_set_key(.const_DES_cblock* key, .DES_key_schedule* schedule);
208 
209 int DES_key_sched(.const_DES_cblock* key, .DES_key_schedule* schedule);
210 int DES_set_key_checked(.const_DES_cblock* key, .DES_key_schedule* schedule);
211 void DES_set_key_unchecked(.const_DES_cblock* key, .DES_key_schedule* schedule);
212 void DES_string_to_key(const (char)* str, .DES_cblock* key);
213 void DES_string_to_2keys(const (char)* str, .DES_cblock* key1, .DES_cblock* key2);
214 void DES_cfb64_encrypt(const (ubyte)* in_, ubyte* out_, core.stdc.config.c_long length_, .DES_key_schedule* schedule, .DES_cblock* ivec, int* num, int enc);
215 void DES_ofb64_encrypt(const (ubyte)* in_, ubyte* out_, core.stdc.config.c_long length_, .DES_key_schedule* schedule, .DES_cblock* ivec, int* num);
216 
217 alias DES_fixup_key_parity = .DES_set_odd_parity;