Blame doc/man3/DES_random_key.pod

Packit c4476c
=pod
Packit c4476c
Packit c4476c
=head1 NAME
Packit c4476c
Packit c4476c
DES_random_key, DES_set_key, DES_key_sched, DES_set_key_checked,
Packit c4476c
DES_set_key_unchecked, DES_set_odd_parity, DES_is_weak_key,
Packit c4476c
DES_ecb_encrypt, DES_ecb2_encrypt, DES_ecb3_encrypt, DES_ncbc_encrypt,
Packit c4476c
DES_cfb_encrypt, DES_ofb_encrypt, DES_pcbc_encrypt, DES_cfb64_encrypt,
Packit c4476c
DES_ofb64_encrypt, DES_xcbc_encrypt, DES_ede2_cbc_encrypt,
Packit c4476c
DES_ede2_cfb64_encrypt, DES_ede2_ofb64_encrypt, DES_ede3_cbc_encrypt,
Packit c4476c
DES_ede3_cfb64_encrypt, DES_ede3_ofb64_encrypt,
Packit c4476c
DES_cbc_cksum, DES_quad_cksum, DES_string_to_key, DES_string_to_2keys,
Packit c4476c
DES_fcrypt, DES_crypt - DES encryption
Packit c4476c
Packit c4476c
=head1 SYNOPSIS
Packit c4476c
Packit c4476c
 #include <openssl/des.h>
Packit c4476c
Packit c4476c
 void DES_random_key(DES_cblock *ret);
Packit c4476c
Packit c4476c
 int DES_set_key(const_DES_cblock *key, DES_key_schedule *schedule);
Packit c4476c
 int DES_key_sched(const_DES_cblock *key, DES_key_schedule *schedule);
Packit c4476c
 int DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule);
Packit c4476c
 void DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule);
Packit c4476c
Packit c4476c
 void DES_set_odd_parity(DES_cblock *key);
Packit c4476c
 int DES_is_weak_key(const_DES_cblock *key);
Packit c4476c
Packit c4476c
 void DES_ecb_encrypt(const_DES_cblock *input, DES_cblock *output,
Packit c4476c
                      DES_key_schedule *ks, int enc);
Packit c4476c
 void DES_ecb2_encrypt(const_DES_cblock *input, DES_cblock *output,
Packit c4476c
                       DES_key_schedule *ks1, DES_key_schedule *ks2, int enc);
Packit c4476c
 void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output,
Packit c4476c
                       DES_key_schedule *ks1, DES_key_schedule *ks2,
Packit c4476c
                       DES_key_schedule *ks3, int enc);
Packit c4476c
Packit c4476c
 void DES_ncbc_encrypt(const unsigned char *input, unsigned char *output,
Packit c4476c
                       long length, DES_key_schedule *schedule, DES_cblock *ivec,
Packit c4476c
                       int enc);
Packit c4476c
 void DES_cfb_encrypt(const unsigned char *in, unsigned char *out,
Packit c4476c
                      int numbits, long length, DES_key_schedule *schedule,
Packit c4476c
                      DES_cblock *ivec, int enc);
Packit c4476c
 void DES_ofb_encrypt(const unsigned char *in, unsigned char *out,
Packit c4476c
                      int numbits, long length, DES_key_schedule *schedule,
Packit c4476c
                      DES_cblock *ivec);
Packit c4476c
 void DES_pcbc_encrypt(const unsigned char *input, unsigned char *output,
Packit c4476c
                       long length, DES_key_schedule *schedule, DES_cblock *ivec,
Packit c4476c
                       int enc);
Packit c4476c
 void DES_cfb64_encrypt(const unsigned char *in, unsigned char *out,
Packit c4476c
                        long length, DES_key_schedule *schedule, DES_cblock *ivec,
Packit c4476c
                        int *num, int enc);
Packit c4476c
 void DES_ofb64_encrypt(const unsigned char *in, unsigned char *out,
Packit c4476c
                        long length, DES_key_schedule *schedule, DES_cblock *ivec,
Packit c4476c
                        int *num);
Packit c4476c
Packit c4476c
 void DES_xcbc_encrypt(const unsigned char *input, unsigned char *output,
Packit c4476c
                       long length, DES_key_schedule *schedule, DES_cblock *ivec,
Packit c4476c
                       const_DES_cblock *inw, const_DES_cblock *outw, int enc);
Packit c4476c
Packit c4476c
 void DES_ede2_cbc_encrypt(const unsigned char *input, unsigned char *output,
Packit c4476c
                           long length, DES_key_schedule *ks1,
Packit c4476c
                           DES_key_schedule *ks2, DES_cblock *ivec, int enc);
Packit c4476c
 void DES_ede2_cfb64_encrypt(const unsigned char *in, unsigned char *out,
Packit c4476c
                             long length, DES_key_schedule *ks1,
Packit c4476c
                             DES_key_schedule *ks2, DES_cblock *ivec,
Packit c4476c
                             int *num, int enc);
Packit c4476c
 void DES_ede2_ofb64_encrypt(const unsigned char *in, unsigned char *out,
Packit c4476c
                             long length, DES_key_schedule *ks1,
Packit c4476c
                             DES_key_schedule *ks2, DES_cblock *ivec, int *num);
Packit c4476c
Packit c4476c
 void DES_ede3_cbc_encrypt(const unsigned char *input, unsigned char *output,
Packit c4476c
                           long length, DES_key_schedule *ks1,
Packit c4476c
                           DES_key_schedule *ks2, DES_key_schedule *ks3,
Packit c4476c
                           DES_cblock *ivec, int enc);
Packit c4476c
 void DES_ede3_cfb64_encrypt(const unsigned char *in, unsigned char *out,
Packit c4476c
                             long length, DES_key_schedule *ks1,
Packit c4476c
                             DES_key_schedule *ks2, DES_key_schedule *ks3,
Packit c4476c
                             DES_cblock *ivec, int *num, int enc);
Packit c4476c
 void DES_ede3_ofb64_encrypt(const unsigned char *in, unsigned char *out,
Packit c4476c
                             long length, DES_key_schedule *ks1,
Packit c4476c
                             DES_key_schedule *ks2, DES_key_schedule *ks3,
Packit c4476c
                             DES_cblock *ivec, int *num);
Packit c4476c
Packit c4476c
 DES_LONG DES_cbc_cksum(const unsigned char *input, DES_cblock *output,
Packit c4476c
                        long length, DES_key_schedule *schedule,
Packit c4476c
                        const_DES_cblock *ivec);
Packit c4476c
 DES_LONG DES_quad_cksum(const unsigned char *input, DES_cblock output[],
Packit c4476c
                         long length, int out_count, DES_cblock *seed);
Packit c4476c
 void DES_string_to_key(const char *str, DES_cblock *key);
Packit c4476c
 void DES_string_to_2keys(const char *str, DES_cblock *key1, DES_cblock *key2);
Packit c4476c
Packit c4476c
 char *DES_fcrypt(const char *buf, const char *salt, char *ret);
Packit c4476c
 char *DES_crypt(const char *buf, const char *salt);
Packit c4476c
Packit c4476c
=head1 DESCRIPTION
Packit c4476c
Packit c4476c
This library contains a fast implementation of the DES encryption
Packit c4476c
algorithm.
Packit c4476c
Packit c4476c
There are two phases to the use of DES encryption.  The first is the
Packit c4476c
generation of a I<DES_key_schedule> from a key, the second is the
Packit c4476c
actual encryption.  A DES key is of type I<DES_cblock>. This type
Packit c4476c
consists of 8 bytes with odd parity.  The least significant bit in
Packit c4476c
each byte is the parity bit.  The key schedule is an expanded form of
Packit c4476c
the key; it is used to speed the encryption process.
Packit c4476c
Packit c4476c
DES_random_key() generates a random key.  The random generator must be
Packit c4476c
seeded when calling this function.
Packit c4476c
If the automatic seeding or reseeding of the OpenSSL CSPRNG fails due to
Packit c4476c
external circumstances (see L<RAND(7)>), the operation will fail.
Packit c4476c
If the function fails, 0 is returned.
Packit c4476c
Packit c4476c
Before a DES key can be used, it must be converted into the
Packit c4476c
architecture dependent I<DES_key_schedule> via the
Packit c4476c
DES_set_key_checked() or DES_set_key_unchecked() function.
Packit c4476c
Packit c4476c
DES_set_key_checked() will check that the key passed is of odd parity
Packit c4476c
and is not a weak or semi-weak key.  If the parity is wrong, then -1
Packit c4476c
is returned.  If the key is a weak key, then -2 is returned.  If an
Packit c4476c
error is returned, the key schedule is not generated.
Packit c4476c
Packit c4476c
DES_set_key() works like
Packit c4476c
DES_set_key_checked() if the I<DES_check_key> flag is non-zero,
Packit c4476c
otherwise like DES_set_key_unchecked().  These functions are available
Packit c4476c
for compatibility; it is recommended to use a function that does not
Packit c4476c
depend on a global variable.
Packit c4476c
Packit c4476c
DES_set_odd_parity() sets the parity of the passed I<key> to odd.
Packit c4476c
Packit c4476c
DES_is_weak_key() returns 1 if the passed key is a weak key, 0 if it
Packit c4476c
is ok.
Packit c4476c
Packit c4476c
The following routines mostly operate on an input and output stream of
Packit c4476c
I<DES_cblock>s.
Packit c4476c
Packit c4476c
DES_ecb_encrypt() is the basic DES encryption routine that encrypts or
Packit c4476c
decrypts a single 8-byte I<DES_cblock> in I<electronic code book>
Packit c4476c
(ECB) mode.  It always transforms the input data, pointed to by
Packit c4476c
I<input>, into the output data, pointed to by the I<output> argument.
Packit c4476c
If the I<encrypt> argument is non-zero (DES_ENCRYPT), the I<input>
Packit c4476c
(cleartext) is encrypted in to the I<output> (ciphertext) using the
Packit c4476c
key_schedule specified by the I<schedule> argument, previously set via
Packit c4476c
I<DES_set_key>. If I<encrypt> is zero (DES_DECRYPT), the I<input> (now
Packit c4476c
ciphertext) is decrypted into the I<output> (now cleartext).  Input
Packit c4476c
and output may overlap.  DES_ecb_encrypt() does not return a value.
Packit c4476c
Packit c4476c
DES_ecb3_encrypt() encrypts/decrypts the I<input> block by using
Packit c4476c
three-key Triple-DES encryption in ECB mode.  This involves encrypting
Packit c4476c
the input with I<ks1>, decrypting with the key schedule I<ks2>, and
Packit c4476c
then encrypting with I<ks3>.  This routine greatly reduces the chances
Packit c4476c
of brute force breaking of DES and has the advantage of if I<ks1>,
Packit c4476c
I<ks2> and I<ks3> are the same, it is equivalent to just encryption
Packit c4476c
using ECB mode and I<ks1> as the key.
Packit c4476c
Packit c4476c
The macro DES_ecb2_encrypt() is provided to perform two-key Triple-DES
Packit c4476c
encryption by using I<ks1> for the final encryption.
Packit c4476c
Packit c4476c
DES_ncbc_encrypt() encrypts/decrypts using the I<cipher-block-chaining>
Packit c4476c
(CBC) mode of DES.  If the I<encrypt> argument is non-zero, the
Packit c4476c
routine cipher-block-chain encrypts the cleartext data pointed to by
Packit c4476c
the I<input> argument into the ciphertext pointed to by the I<output>
Packit c4476c
argument, using the key schedule provided by the I<schedule> argument,
Packit c4476c
and initialization vector provided by the I<ivec> argument.  If the
Packit c4476c
I<length> argument is not an integral multiple of eight bytes, the
Packit c4476c
last block is copied to a temporary area and zero filled.  The output
Packit c4476c
is always an integral multiple of eight bytes.
Packit c4476c
Packit c4476c
DES_xcbc_encrypt() is RSA's DESX mode of DES.  It uses I<inw> and
Packit c4476c
I<outw> to 'whiten' the encryption.  I<inw> and I<outw> are secret
Packit c4476c
(unlike the iv) and are as such, part of the key.  So the key is sort
Packit c4476c
of 24 bytes.  This is much better than CBC DES.
Packit c4476c
Packit c4476c
DES_ede3_cbc_encrypt() implements outer triple CBC DES encryption with
Packit c4476c
three keys. This means that each DES operation inside the CBC mode is
Packit c4476c
C<C=E(ks3,D(ks2,E(ks1,M)))>.  This mode is used by SSL.
Packit c4476c
Packit c4476c
The DES_ede2_cbc_encrypt() macro implements two-key Triple-DES by
Packit c4476c
reusing I<ks1> for the final encryption.  C<C=E(ks1,D(ks2,E(ks1,M)))>.
Packit c4476c
This form of Triple-DES is used by the RSAREF library.
Packit c4476c
Packit c4476c
DES_pcbc_encrypt() encrypts/decrypts using the propagating cipher block
Packit c4476c
chaining mode used by Kerberos v4. Its parameters are the same as
Packit c4476c
DES_ncbc_encrypt().
Packit c4476c
Packit c4476c
DES_cfb_encrypt() encrypts/decrypts using cipher feedback mode.  This
Packit c4476c
method takes an array of characters as input and outputs an array of
Packit c4476c
characters.  It does not require any padding to 8 character groups.
Packit c4476c
Note: the I<ivec> variable is changed and the new changed value needs to
Packit c4476c
be passed to the next call to this function.  Since this function runs
Packit c4476c
a complete DES ECB encryption per I<numbits>, this function is only
Packit c4476c
suggested for use when sending a small number of characters.
Packit c4476c
Packit c4476c
DES_cfb64_encrypt()
Packit c4476c
implements CFB mode of DES with 64-bit feedback.  Why is this
Packit c4476c
useful you ask?  Because this routine will allow you to encrypt an
Packit c4476c
arbitrary number of bytes, without 8 byte padding.  Each call to this
Packit c4476c
routine will encrypt the input bytes to output and then update ivec
Packit c4476c
and num.  num contains 'how far' we are though ivec.  If this does
Packit c4476c
not make much sense, read more about CFB mode of DES.
Packit c4476c
Packit c4476c
DES_ede3_cfb64_encrypt() and DES_ede2_cfb64_encrypt() is the same as
Packit c4476c
DES_cfb64_encrypt() except that Triple-DES is used.
Packit c4476c
Packit c4476c
DES_ofb_encrypt() encrypts using output feedback mode.  This method
Packit c4476c
takes an array of characters as input and outputs an array of
Packit c4476c
characters.  It does not require any padding to 8 character groups.
Packit c4476c
Note: the I<ivec> variable is changed and the new changed value needs to
Packit c4476c
be passed to the next call to this function.  Since this function runs
Packit c4476c
a complete DES ECB encryption per I<numbits>, this function is only
Packit c4476c
suggested for use when sending a small number of characters.
Packit c4476c
Packit c4476c
DES_ofb64_encrypt() is the same as DES_cfb64_encrypt() using Output
Packit c4476c
Feed Back mode.
Packit c4476c
Packit c4476c
DES_ede3_ofb64_encrypt() and DES_ede2_ofb64_encrypt() is the same as
Packit c4476c
DES_ofb64_encrypt(), using Triple-DES.
Packit c4476c
Packit c4476c
The following functions are included in the DES library for
Packit c4476c
compatibility with the MIT Kerberos library.
Packit c4476c
Packit c4476c
DES_cbc_cksum() produces an 8 byte checksum based on the input stream
Packit c4476c
(via CBC encryption).  The last 4 bytes of the checksum are returned
Packit c4476c
and the complete 8 bytes are placed in I<output>. This function is
Packit c4476c
used by Kerberos v4.  Other applications should use
Packit c4476c
L<EVP_DigestInit(3)> etc. instead.
Packit c4476c
Packit c4476c
DES_quad_cksum() is a Kerberos v4 function.  It returns a 4 byte
Packit c4476c
checksum from the input bytes.  The algorithm can be iterated over the
Packit c4476c
input, depending on I<out_count>, 1, 2, 3 or 4 times.  If I<output> is
Packit c4476c
non-NULL, the 8 bytes generated by each pass are written into
Packit c4476c
I<output>.
Packit c4476c
Packit c4476c
The following are DES-based transformations:
Packit c4476c
Packit c4476c
DES_fcrypt() is a fast version of the Unix crypt(3) function.  This
Packit c4476c
version takes only a small amount of space relative to other fast
Packit c4476c
crypt() implementations.  This is different to the normal crypt() in
Packit c4476c
that the third parameter is the buffer that the return value is
Packit c4476c
written into.  It needs to be at least 14 bytes long.  This function
Packit c4476c
is thread safe, unlike the normal crypt().
Packit c4476c
Packit c4476c
DES_crypt() is a faster replacement for the normal system crypt().
Packit c4476c
This function calls DES_fcrypt() with a static array passed as the
Packit c4476c
third parameter.  This mostly emulates the normal non-thread-safe semantics
Packit c4476c
of crypt(3).
Packit c4476c
The B<salt> must be two ASCII characters.
Packit c4476c
Packit c4476c
The values returned by DES_fcrypt() and DES_crypt() are terminated by NUL
Packit c4476c
character.
Packit c4476c
Packit c4476c
DES_enc_write() writes I<len> bytes to file descriptor I<fd> from
Packit c4476c
buffer I<buf>. The data is encrypted via I<pcbc_encrypt> (default)
Packit c4476c
using I<sched> for the key and I<iv> as a starting vector.  The actual
Packit c4476c
data send down I<fd> consists of 4 bytes (in network byte order)
Packit c4476c
containing the length of the following encrypted data.  The encrypted
Packit c4476c
data then follows, padded with random data out to a multiple of 8
Packit c4476c
bytes.
Packit c4476c
Packit c4476c
=head1 BUGS
Packit c4476c
Packit c4476c
DES_cbc_encrypt() does not modify B<ivec>; use DES_ncbc_encrypt()
Packit c4476c
instead.
Packit c4476c
Packit c4476c
DES_cfb_encrypt() and DES_ofb_encrypt() operates on input of 8 bits.
Packit c4476c
What this means is that if you set numbits to 12, and length to 2, the
Packit c4476c
first 12 bits will come from the 1st input byte and the low half of
Packit c4476c
the second input byte.  The second 12 bits will have the low 8 bits
Packit c4476c
taken from the 3rd input byte and the top 4 bits taken from the 4th
Packit c4476c
input byte.  The same holds for output.  This function has been
Packit c4476c
implemented this way because most people will be using a multiple of 8
Packit c4476c
and because once you get into pulling bytes input bytes apart things
Packit c4476c
get ugly!
Packit c4476c
Packit c4476c
DES_string_to_key() is available for backward compatibility with the
Packit c4476c
MIT library.  New applications should use a cryptographic hash function.
Packit c4476c
The same applies for DES_string_to_2key().
Packit c4476c
Packit c4476c
=head1 NOTES
Packit c4476c
Packit c4476c
The B<des> library was written to be source code compatible with
Packit c4476c
the MIT Kerberos library.
Packit c4476c
Packit c4476c
Applications should use the higher level functions
Packit c4476c
L<EVP_EncryptInit(3)> etc. instead of calling these
Packit c4476c
functions directly.
Packit c4476c
Packit c4476c
Single-key DES is insecure due to its short key size.  ECB mode is
Packit c4476c
not suitable for most applications; see L<des_modes(7)>.
Packit c4476c
Packit c4476c
=head1 RETURN VALUES
Packit c4476c
Packit c4476c
DES_set_key(), DES_key_sched(), DES_set_key_checked() and DES_is_weak_key()
Packit c4476c
return 0 on success or negative values on error.
Packit c4476c
Packit c4476c
DES_cbc_cksum() and DES_quad_cksum() return 4-byte integer representing the
Packit c4476c
last 4 bytes of the checksum of the input.
Packit c4476c
Packit c4476c
DES_fcrypt() returns a pointer to the caller-provided buffer and DES_crypt() -
Packit c4476c
to a static buffer on success; otherwise they return NULL.
Packit c4476c
Packit c4476c
=head1 SEE ALSO
Packit c4476c
Packit c4476c
L<des_modes(7)>,
Packit c4476c
L<EVP_EncryptInit(3)>
Packit c4476c
Packit c4476c
=head1 HISTORY
Packit c4476c
Packit c4476c
The requirement that the B<salt> parameter to DES_crypt() and DES_fcrypt()
Packit c4476c
be two ASCII characters was first enforced in
Packit c4476c
OpenSSL 1.1.0.  Previous versions tried to use the letter uppercase B
Packit c4476c
if both character were not present, and could crash when given non-ASCII
Packit c4476c
on some platforms.
Packit c4476c
Packit c4476c
=head1 COPYRIGHT
Packit c4476c
Packit c4476c
Copyright 2000-2019 The OpenSSL Project Authors. All Rights Reserved.
Packit c4476c
Packit c4476c
Licensed under the OpenSSL license (the "License").  You may not use
Packit c4476c
this file except in compliance with the License.  You can obtain a copy
Packit c4476c
in the file LICENSE in the source distribution or at
Packit c4476c
L<https://www.openssl.org/source/license.html>.
Packit c4476c
Packit c4476c
=cut