1 | =pod
|
---|
2 |
|
---|
3 | =head1 NAME
|
---|
4 |
|
---|
5 | DES_random_key, DES_set_key, DES_key_sched, DES_set_key_checked,
|
---|
6 | DES_set_key_unchecked, DES_set_odd_parity, DES_is_weak_key,
|
---|
7 | DES_ecb_encrypt, DES_ecb2_encrypt, DES_ecb3_encrypt, DES_ncbc_encrypt,
|
---|
8 | DES_cfb_encrypt, DES_ofb_encrypt, DES_pcbc_encrypt, DES_cfb64_encrypt,
|
---|
9 | DES_ofb64_encrypt, DES_xcbc_encrypt, DES_ede2_cbc_encrypt,
|
---|
10 | DES_ede2_cfb64_encrypt, DES_ede2_ofb64_encrypt, DES_ede3_cbc_encrypt,
|
---|
11 | DES_ede3_cfb64_encrypt, DES_ede3_ofb64_encrypt,
|
---|
12 | DES_cbc_cksum, DES_quad_cksum, DES_string_to_key, DES_string_to_2keys,
|
---|
13 | DES_fcrypt, DES_crypt - DES encryption
|
---|
14 |
|
---|
15 | =head1 SYNOPSIS
|
---|
16 |
|
---|
17 | #include <openssl/des.h>
|
---|
18 |
|
---|
19 | The following functions have been deprecated since OpenSSL 3.0, and can be
|
---|
20 | hidden entirely by defining B<OPENSSL_API_COMPAT> with a suitable version value,
|
---|
21 | see L<openssl_user_macros(7)>:
|
---|
22 |
|
---|
23 | void DES_random_key(DES_cblock *ret);
|
---|
24 |
|
---|
25 | int DES_set_key(const_DES_cblock *key, DES_key_schedule *schedule);
|
---|
26 | int DES_key_sched(const_DES_cblock *key, DES_key_schedule *schedule);
|
---|
27 | int DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule);
|
---|
28 | void DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule);
|
---|
29 |
|
---|
30 | void DES_set_odd_parity(DES_cblock *key);
|
---|
31 | int DES_is_weak_key(const_DES_cblock *key);
|
---|
32 |
|
---|
33 | void DES_ecb_encrypt(const_DES_cblock *input, DES_cblock *output,
|
---|
34 | DES_key_schedule *ks, int enc);
|
---|
35 | void DES_ecb2_encrypt(const_DES_cblock *input, DES_cblock *output,
|
---|
36 | DES_key_schedule *ks1, DES_key_schedule *ks2, int enc);
|
---|
37 | void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output,
|
---|
38 | DES_key_schedule *ks1, DES_key_schedule *ks2,
|
---|
39 | DES_key_schedule *ks3, int enc);
|
---|
40 |
|
---|
41 | void DES_ncbc_encrypt(const unsigned char *input, unsigned char *output,
|
---|
42 | long length, DES_key_schedule *schedule, DES_cblock *ivec,
|
---|
43 | int enc);
|
---|
44 | void DES_cfb_encrypt(const unsigned char *in, unsigned char *out,
|
---|
45 | int numbits, long length, DES_key_schedule *schedule,
|
---|
46 | DES_cblock *ivec, int enc);
|
---|
47 | void DES_ofb_encrypt(const unsigned char *in, unsigned char *out,
|
---|
48 | int numbits, long length, DES_key_schedule *schedule,
|
---|
49 | DES_cblock *ivec);
|
---|
50 | void DES_pcbc_encrypt(const unsigned char *input, unsigned char *output,
|
---|
51 | long length, DES_key_schedule *schedule, DES_cblock *ivec,
|
---|
52 | int enc);
|
---|
53 | void DES_cfb64_encrypt(const unsigned char *in, unsigned char *out,
|
---|
54 | long length, DES_key_schedule *schedule, DES_cblock *ivec,
|
---|
55 | int *num, int enc);
|
---|
56 | void DES_ofb64_encrypt(const unsigned char *in, unsigned char *out,
|
---|
57 | long length, DES_key_schedule *schedule, DES_cblock *ivec,
|
---|
58 | int *num);
|
---|
59 |
|
---|
60 | void DES_xcbc_encrypt(const unsigned char *input, unsigned char *output,
|
---|
61 | long length, DES_key_schedule *schedule, DES_cblock *ivec,
|
---|
62 | const_DES_cblock *inw, const_DES_cblock *outw, int enc);
|
---|
63 |
|
---|
64 | void DES_ede2_cbc_encrypt(const unsigned char *input, unsigned char *output,
|
---|
65 | long length, DES_key_schedule *ks1,
|
---|
66 | DES_key_schedule *ks2, DES_cblock *ivec, int enc);
|
---|
67 | void DES_ede2_cfb64_encrypt(const unsigned char *in, unsigned char *out,
|
---|
68 | long length, DES_key_schedule *ks1,
|
---|
69 | DES_key_schedule *ks2, DES_cblock *ivec,
|
---|
70 | int *num, int enc);
|
---|
71 | void DES_ede2_ofb64_encrypt(const unsigned char *in, unsigned char *out,
|
---|
72 | long length, DES_key_schedule *ks1,
|
---|
73 | DES_key_schedule *ks2, DES_cblock *ivec, int *num);
|
---|
74 |
|
---|
75 | void DES_ede3_cbc_encrypt(const unsigned char *input, unsigned char *output,
|
---|
76 | long length, DES_key_schedule *ks1,
|
---|
77 | DES_key_schedule *ks2, DES_key_schedule *ks3,
|
---|
78 | DES_cblock *ivec, int enc);
|
---|
79 | void DES_ede3_cfb64_encrypt(const unsigned char *in, unsigned char *out,
|
---|
80 | long length, DES_key_schedule *ks1,
|
---|
81 | DES_key_schedule *ks2, DES_key_schedule *ks3,
|
---|
82 | DES_cblock *ivec, int *num, int enc);
|
---|
83 | void DES_ede3_ofb64_encrypt(const unsigned char *in, unsigned char *out,
|
---|
84 | long length, DES_key_schedule *ks1,
|
---|
85 | DES_key_schedule *ks2, DES_key_schedule *ks3,
|
---|
86 | DES_cblock *ivec, int *num);
|
---|
87 |
|
---|
88 | DES_LONG DES_cbc_cksum(const unsigned char *input, DES_cblock *output,
|
---|
89 | long length, DES_key_schedule *schedule,
|
---|
90 | const_DES_cblock *ivec);
|
---|
91 | DES_LONG DES_quad_cksum(const unsigned char *input, DES_cblock output[],
|
---|
92 | long length, int out_count, DES_cblock *seed);
|
---|
93 | void DES_string_to_key(const char *str, DES_cblock *key);
|
---|
94 | void DES_string_to_2keys(const char *str, DES_cblock *key1, DES_cblock *key2);
|
---|
95 |
|
---|
96 | char *DES_fcrypt(const char *buf, const char *salt, char *ret);
|
---|
97 | char *DES_crypt(const char *buf, const char *salt);
|
---|
98 |
|
---|
99 | =head1 DESCRIPTION
|
---|
100 |
|
---|
101 | All of the functions described on this page are deprecated. Applications should
|
---|
102 | instead use L<EVP_EncryptInit_ex(3)>, L<EVP_EncryptUpdate(3)> and
|
---|
103 | L<EVP_EncryptFinal_ex(3)> or the equivalently named decrypt functions.
|
---|
104 |
|
---|
105 | This library contains a fast implementation of the DES encryption
|
---|
106 | algorithm.
|
---|
107 |
|
---|
108 | There are two phases to the use of DES encryption. The first is the
|
---|
109 | generation of a I<DES_key_schedule> from a key, the second is the
|
---|
110 | actual encryption. A DES key is of type I<DES_cblock>. This type
|
---|
111 | consists of 8 bytes with odd parity. The least significant bit in
|
---|
112 | each byte is the parity bit. The key schedule is an expanded form of
|
---|
113 | the key; it is used to speed the encryption process.
|
---|
114 |
|
---|
115 | DES_random_key() generates a random key. The random generator must be
|
---|
116 | seeded when calling this function.
|
---|
117 | If the automatic seeding or reseeding of the OpenSSL CSPRNG fails due to
|
---|
118 | external circumstances (see L<RAND(7)>), the operation will fail.
|
---|
119 | If the function fails, 0 is returned.
|
---|
120 |
|
---|
121 | Before a DES key can be used, it must be converted into the
|
---|
122 | architecture dependent I<DES_key_schedule> via the
|
---|
123 | DES_set_key_checked() or DES_set_key_unchecked() function.
|
---|
124 |
|
---|
125 | DES_set_key_checked() will check that the key passed is of odd parity
|
---|
126 | and is not a weak or semi-weak key. If the parity is wrong, then -1
|
---|
127 | is returned. If the key is a weak key, then -2 is returned. If an
|
---|
128 | error is returned, the key schedule is not generated.
|
---|
129 |
|
---|
130 | DES_set_key() works like DES_set_key_checked() and remains for
|
---|
131 | backward compatibility.
|
---|
132 |
|
---|
133 | DES_set_odd_parity() sets the parity of the passed I<key> to odd.
|
---|
134 |
|
---|
135 | DES_is_weak_key() returns 1 if the passed key is a weak key, 0 if it
|
---|
136 | is ok.
|
---|
137 |
|
---|
138 | The following routines mostly operate on an input and output stream of
|
---|
139 | I<DES_cblock>s.
|
---|
140 |
|
---|
141 | DES_ecb_encrypt() is the basic DES encryption routine that encrypts or
|
---|
142 | decrypts a single 8-byte I<DES_cblock> in I<electronic code book>
|
---|
143 | (ECB) mode. It always transforms the input data, pointed to by
|
---|
144 | I<input>, into the output data, pointed to by the I<output> argument.
|
---|
145 | If the I<encrypt> argument is nonzero (DES_ENCRYPT), the I<input>
|
---|
146 | (cleartext) is encrypted in to the I<output> (ciphertext) using the
|
---|
147 | key_schedule specified by the I<schedule> argument, previously set via
|
---|
148 | I<DES_set_key>. If I<encrypt> is zero (DES_DECRYPT), the I<input> (now
|
---|
149 | ciphertext) is decrypted into the I<output> (now cleartext). Input
|
---|
150 | and output may overlap. DES_ecb_encrypt() does not return a value.
|
---|
151 |
|
---|
152 | DES_ecb3_encrypt() encrypts/decrypts the I<input> block by using
|
---|
153 | three-key Triple-DES encryption in ECB mode. This involves encrypting
|
---|
154 | the input with I<ks1>, decrypting with the key schedule I<ks2>, and
|
---|
155 | then encrypting with I<ks3>. This routine greatly reduces the chances
|
---|
156 | of brute force breaking of DES and has the advantage of if I<ks1>,
|
---|
157 | I<ks2> and I<ks3> are the same, it is equivalent to just encryption
|
---|
158 | using ECB mode and I<ks1> as the key.
|
---|
159 |
|
---|
160 | The macro DES_ecb2_encrypt() is provided to perform two-key Triple-DES
|
---|
161 | encryption by using I<ks1> for the final encryption.
|
---|
162 |
|
---|
163 | DES_ncbc_encrypt() encrypts/decrypts using the I<cipher-block-chaining>
|
---|
164 | (CBC) mode of DES. If the I<encrypt> argument is nonzero, the
|
---|
165 | routine cipher-block-chain encrypts the cleartext data pointed to by
|
---|
166 | the I<input> argument into the ciphertext pointed to by the I<output>
|
---|
167 | argument, using the key schedule provided by the I<schedule> argument,
|
---|
168 | and initialization vector provided by the I<ivec> argument. If the
|
---|
169 | I<length> argument is not an integral multiple of eight bytes, the
|
---|
170 | last block is copied to a temporary area and zero filled. The output
|
---|
171 | is always an integral multiple of eight bytes.
|
---|
172 |
|
---|
173 | DES_xcbc_encrypt() is RSA's DESX mode of DES. It uses I<inw> and
|
---|
174 | I<outw> to 'whiten' the encryption. I<inw> and I<outw> are secret
|
---|
175 | (unlike the iv) and are as such, part of the key. So the key is sort
|
---|
176 | of 24 bytes. This is much better than CBC DES.
|
---|
177 |
|
---|
178 | DES_ede3_cbc_encrypt() implements outer triple CBC DES encryption with
|
---|
179 | three keys. This means that each DES operation inside the CBC mode is
|
---|
180 | C<C=E(ks3,D(ks2,E(ks1,M)))>. This mode is used by SSL.
|
---|
181 |
|
---|
182 | The DES_ede2_cbc_encrypt() macro implements two-key Triple-DES by
|
---|
183 | reusing I<ks1> for the final encryption. C<C=E(ks1,D(ks2,E(ks1,M)))>.
|
---|
184 | This form of Triple-DES is used by the RSAREF library.
|
---|
185 |
|
---|
186 | DES_pcbc_encrypt() encrypts/decrypts using the propagating cipher block
|
---|
187 | chaining mode used by Kerberos v4. Its parameters are the same as
|
---|
188 | DES_ncbc_encrypt().
|
---|
189 |
|
---|
190 | DES_cfb_encrypt() encrypts/decrypts using cipher feedback mode. This
|
---|
191 | method takes an array of characters as input and outputs an array of
|
---|
192 | characters. It does not require any padding to 8 character groups.
|
---|
193 | Note: the I<ivec> variable is changed and the new changed value needs to
|
---|
194 | be passed to the next call to this function. Since this function runs
|
---|
195 | a complete DES ECB encryption per I<numbits>, this function is only
|
---|
196 | suggested for use when sending a small number of characters.
|
---|
197 |
|
---|
198 | DES_cfb64_encrypt()
|
---|
199 | implements CFB mode of DES with 64-bit feedback. Why is this
|
---|
200 | useful you ask? Because this routine will allow you to encrypt an
|
---|
201 | arbitrary number of bytes, without 8 byte padding. Each call to this
|
---|
202 | routine will encrypt the input bytes to output and then update ivec
|
---|
203 | and num. num contains 'how far' we are though ivec. If this does
|
---|
204 | not make much sense, read more about CFB mode of DES.
|
---|
205 |
|
---|
206 | DES_ede3_cfb64_encrypt() and DES_ede2_cfb64_encrypt() is the same as
|
---|
207 | DES_cfb64_encrypt() except that Triple-DES is used.
|
---|
208 |
|
---|
209 | DES_ofb_encrypt() encrypts using output feedback mode. This method
|
---|
210 | takes an array of characters as input and outputs an array of
|
---|
211 | characters. It does not require any padding to 8 character groups.
|
---|
212 | Note: the I<ivec> variable is changed and the new changed value needs to
|
---|
213 | be passed to the next call to this function. Since this function runs
|
---|
214 | a complete DES ECB encryption per I<numbits>, this function is only
|
---|
215 | suggested for use when sending a small number of characters.
|
---|
216 |
|
---|
217 | DES_ofb64_encrypt() is the same as DES_cfb64_encrypt() using Output
|
---|
218 | Feed Back mode.
|
---|
219 |
|
---|
220 | DES_ede3_ofb64_encrypt() and DES_ede2_ofb64_encrypt() is the same as
|
---|
221 | DES_ofb64_encrypt(), using Triple-DES.
|
---|
222 |
|
---|
223 | The following functions are included in the DES library for
|
---|
224 | compatibility with the MIT Kerberos library.
|
---|
225 |
|
---|
226 | DES_cbc_cksum() produces an 8 byte checksum based on the input stream
|
---|
227 | (via CBC encryption). The last 4 bytes of the checksum are returned
|
---|
228 | and the complete 8 bytes are placed in I<output>. This function is
|
---|
229 | used by Kerberos v4. Other applications should use
|
---|
230 | L<EVP_DigestInit(3)> etc. instead.
|
---|
231 |
|
---|
232 | DES_quad_cksum() is a Kerberos v4 function. It returns a 4 byte
|
---|
233 | checksum from the input bytes. The algorithm can be iterated over the
|
---|
234 | input, depending on I<out_count>, 1, 2, 3 or 4 times. If I<output> is
|
---|
235 | non-NULL, the 8 bytes generated by each pass are written into
|
---|
236 | I<output>.
|
---|
237 |
|
---|
238 | The following are DES-based transformations:
|
---|
239 |
|
---|
240 | DES_fcrypt() is a fast version of the Unix crypt(3) function. This
|
---|
241 | version takes only a small amount of space relative to other fast
|
---|
242 | crypt() implementations. This is different to the normal crypt() in
|
---|
243 | that the third parameter is the buffer that the return value is
|
---|
244 | written into. It needs to be at least 14 bytes long. This function
|
---|
245 | is thread safe, unlike the normal crypt().
|
---|
246 |
|
---|
247 | DES_crypt() is a faster replacement for the normal system crypt().
|
---|
248 | This function calls DES_fcrypt() with a static array passed as the
|
---|
249 | third parameter. This mostly emulates the normal non-thread-safe semantics
|
---|
250 | of crypt(3).
|
---|
251 | The B<salt> must be two ASCII characters.
|
---|
252 |
|
---|
253 | The values returned by DES_fcrypt() and DES_crypt() are terminated by NUL
|
---|
254 | character.
|
---|
255 |
|
---|
256 | DES_enc_write() writes I<len> bytes to file descriptor I<fd> from
|
---|
257 | buffer I<buf>. The data is encrypted via I<pcbc_encrypt> (default)
|
---|
258 | using I<sched> for the key and I<iv> as a starting vector. The actual
|
---|
259 | data send down I<fd> consists of 4 bytes (in network byte order)
|
---|
260 | containing the length of the following encrypted data. The encrypted
|
---|
261 | data then follows, padded with random data out to a multiple of 8
|
---|
262 | bytes.
|
---|
263 |
|
---|
264 | =head1 BUGS
|
---|
265 |
|
---|
266 | DES_cbc_encrypt() does not modify B<ivec>; use DES_ncbc_encrypt()
|
---|
267 | instead.
|
---|
268 |
|
---|
269 | DES_cfb_encrypt() and DES_ofb_encrypt() operates on input of 8 bits.
|
---|
270 | What this means is that if you set numbits to 12, and length to 2, the
|
---|
271 | first 12 bits will come from the 1st input byte and the low half of
|
---|
272 | the second input byte. The second 12 bits will have the low 8 bits
|
---|
273 | taken from the 3rd input byte and the top 4 bits taken from the 4th
|
---|
274 | input byte. The same holds for output. This function has been
|
---|
275 | implemented this way because most people will be using a multiple of 8
|
---|
276 | and because once you get into pulling bytes input bytes apart things
|
---|
277 | get ugly!
|
---|
278 |
|
---|
279 | DES_string_to_key() is available for backward compatibility with the
|
---|
280 | MIT library. New applications should use a cryptographic hash function.
|
---|
281 | The same applies for DES_string_to_2key().
|
---|
282 |
|
---|
283 | =head1 NOTES
|
---|
284 |
|
---|
285 | The B<des> library was written to be source code compatible with
|
---|
286 | the MIT Kerberos library.
|
---|
287 |
|
---|
288 | Applications should use the higher level functions
|
---|
289 | L<EVP_EncryptInit(3)> etc. instead of calling these
|
---|
290 | functions directly.
|
---|
291 |
|
---|
292 | Single-key DES is insecure due to its short key size. ECB mode is
|
---|
293 | not suitable for most applications; see L<des_modes(7)>.
|
---|
294 |
|
---|
295 | =head1 RETURN VALUES
|
---|
296 |
|
---|
297 | DES_set_key(), DES_key_sched(), DES_set_key_checked() and DES_is_weak_key()
|
---|
298 | return 0 on success or negative values on error.
|
---|
299 |
|
---|
300 | DES_cbc_cksum() and DES_quad_cksum() return 4-byte integer representing the
|
---|
301 | last 4 bytes of the checksum of the input.
|
---|
302 |
|
---|
303 | DES_fcrypt() returns a pointer to the caller-provided buffer and DES_crypt() -
|
---|
304 | to a static buffer on success; otherwise they return NULL.
|
---|
305 |
|
---|
306 | =head1 SEE ALSO
|
---|
307 |
|
---|
308 | L<des_modes(7)>,
|
---|
309 | L<EVP_EncryptInit(3)>
|
---|
310 |
|
---|
311 | =head1 HISTORY
|
---|
312 |
|
---|
313 | All of these functions were deprecated in OpenSSL 3.0.
|
---|
314 |
|
---|
315 | The requirement that the B<salt> parameter to DES_crypt() and DES_fcrypt()
|
---|
316 | be two ASCII characters was first enforced in
|
---|
317 | OpenSSL 1.1.0. Previous versions tried to use the letter uppercase B<A>
|
---|
318 | if both character were not present, and could crash when given non-ASCII
|
---|
319 | on some platforms.
|
---|
320 |
|
---|
321 | =head1 COPYRIGHT
|
---|
322 |
|
---|
323 | Copyright 2000-2021 The OpenSSL Project Authors. All Rights Reserved.
|
---|
324 |
|
---|
325 | Licensed under the Apache License 2.0 (the "License"). You may not use
|
---|
326 | this file except in compliance with the License. You can obtain a copy
|
---|
327 | in the file LICENSE in the source distribution or at
|
---|
328 | L<https://www.openssl.org/source/license.html>.
|
---|
329 |
|
---|
330 | =cut
|
---|