| .\" Copyright 2000 Nicolás Lichtmaier <nick@debian.org> |
| .\" Created 2000-07-22 00:52-0300 |
| .\" |
| .\" %%%LICENSE_START(GPLv2+_DOC_FULL) |
| .\" This is free documentation; you can redistribute it and/or |
| .\" modify it under the terms of the GNU General Public License as |
| .\" published by the Free Software Foundation; either version 2 of |
| .\" the License, or (at your option) any later version. |
| .\" |
| .\" The GNU General Public License's references to "object code" |
| .\" and "executables" are to be interpreted as the output of any |
| .\" document formatting or typesetting system, including |
| .\" intermediate and printed output. |
| .\" |
| .\" This manual is distributed in the hope that it will be useful, |
| .\" but WITHOUT ANY WARRANTY; without even the implied warranty of |
| .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| .\" GNU General Public License for more details. |
| .\" |
| .\" You should have received a copy of the GNU General Public |
| .\" License along with this manual; if not, see |
| .\" <http://www.gnu.org/licenses/>. |
| .\" %%%LICENSE_END |
| .\" |
| .\" Modified 2002-07-23 19:21:35 CEST 2002 Walter Harms |
| .\" <walter.harms@informatik.uni-oldenburg.de> |
| .\" |
| .\" Modified 2003-04-04, aeb |
| .\" |
| .TH ENCRYPT 3 2021-03-22 "" "Linux Programmer's Manual" |
| .SH NAME |
| encrypt, setkey, encrypt_r, setkey_r \- encrypt 64-bit messages |
| .SH SYNOPSIS |
| .nf |
| .BR "#define _XOPEN_SOURCE" " /* See feature_test_macros(7) */" |
| .B #include <unistd.h> |
| .PP |
| .BI "void encrypt(char " block "[64], int " edflag ); |
| .PP |
| .BR "#define _XOPEN_SOURCE" " /* See feature_test_macros(7) */" |
| .B #include <stdlib.h> |
| .PP |
| .BI "void setkey(const char *" key ); |
| .PP |
| .BR "#define _GNU_SOURCE" " /* See feature_test_macros(7) */" |
| .B "#include <crypt.h>" |
| .PP |
| .BI "void setkey_r(const char *" key ", struct crypt_data *" data ); |
| .BI "void encrypt_r(char *" block ", int " edflag \ |
| ", struct crypt_data *" data ); |
| .fi |
| .PP |
| Each of these requires linking with \fI\-lcrypt\fP. |
| .SH DESCRIPTION |
| These functions encrypt and decrypt 64-bit messages. |
| The |
| .BR setkey () |
| function sets the key used by |
| .BR encrypt (). |
| The |
| .I key |
| argument used here is an array of 64 bytes, each of which has |
| numerical value 1 or 0. |
| The bytes key[n] where n=8*i-1 are ignored, |
| so that the effective key length is 56 bits. |
| .PP |
| The |
| .BR encrypt () |
| function modifies the passed buffer, encoding if |
| .I edflag |
| is 0, and decoding if 1 is being passed. |
| Like the |
| .I key |
| argument, also |
| .I block |
| is a bit vector representation of the actual value that is encoded. |
| The result is returned in that same vector. |
| .PP |
| These two functions are not reentrant, that is, the key data is |
| kept in static storage. |
| The functions |
| .BR setkey_r () |
| and |
| .BR encrypt_r () |
| are the reentrant versions. |
| They use the following |
| structure to hold the key data: |
| .PP |
| .in +4n |
| .EX |
| struct crypt_data { |
| char keysched[16 * 8]; |
| char sb0[32768]; |
| char sb1[32768]; |
| char sb2[32768]; |
| char sb3[32768]; |
| char crypt_3_buf[14]; |
| char current_salt[2]; |
| long current_saltbits; |
| int direction; |
| int initialized; |
| }; |
| .EE |
| .in |
| .PP |
| Before calling |
| .BR setkey_r () |
| set |
| .I data\->initialized |
| to zero. |
| .SH RETURN VALUE |
| These functions do not return any value. |
| .SH ERRORS |
| Set |
| .I errno |
| to zero before calling the above functions. |
| On success, |
| .I errno |
| is unchanged. |
| .TP |
| .B ENOSYS |
| The function is not provided. |
| (For example because of former USA export restrictions.) |
| .SH VERSIONS |
| Because they employ the DES block cipher, |
| which is no longer considered secure, |
| .BR crypt (), |
| .BR crypt_r (), |
| .BR setkey (), |
| and |
| .BR setkey_r () |
| were removed in glibc 2.28. |
| Applications should switch to a modern cryptography library, such as |
| .BR libgcrypt . |
| .SH ATTRIBUTES |
| For an explanation of the terms used in this section, see |
| .BR attributes (7). |
| .ad l |
| .nh |
| .TS |
| allbox; |
| lbx lb lb |
| l l l. |
| Interface Attribute Value |
| T{ |
| .BR encrypt (), |
| .BR setkey () |
| T} Thread safety MT-Unsafe race:crypt |
| T{ |
| .BR encrypt_r (), |
| .BR setkey_r () |
| T} Thread safety MT-Safe |
| .TE |
| .hy |
| .ad |
| .sp 1 |
| .SH CONFORMING TO |
| .BR encrypt (), |
| .BR setkey (): |
| POSIX.1-2001, POSIX.1-2008, SUS, SVr4. |
| .PP |
| The functions |
| .BR encrypt_r () |
| and |
| .BR setkey_r () |
| are GNU extensions. |
| .SH NOTES |
| .SS Availability in glibc |
| See |
| .BR crypt (3). |
| .SS Features in glibc |
| In glibc 2.2, these functions use the DES algorithm. |
| .SH EXAMPLES |
| .EX |
| #define _XOPEN_SOURCE |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <unistd.h> |
| #include <crypt.h> |
| |
| int |
| main(void) |
| { |
| char key[64]; |
| char orig[9] = "eggplant"; |
| char buf[64]; |
| char txt[9]; |
| |
| for (int i = 0; i < 64; i++) { |
| key[i] = rand() & 1; |
| } |
| |
| for (int i = 0; i < 8; i++) { |
| for (int j = 0; j < 8; j++) { |
| buf[i * 8 + j] = orig[i] >> j & 1; |
| } |
| setkey(key); |
| } |
| printf("Before encrypting: %s\en", orig); |
| |
| encrypt(buf, 0); |
| for (int i = 0; i < 8; i++) { |
| for (int j = 0, txt[i] = \(aq\e0\(aq; j < 8; j++) { |
| txt[i] |= buf[i * 8 + j] << j; |
| } |
| txt[8] = \(aq\e0\(aq; |
| } |
| printf("After encrypting: %s\en", txt); |
| |
| encrypt(buf, 1); |
| for (int i = 0; i < 8; i++) { |
| for (int j = 0, txt[i] = \(aq\e0\(aq; j < 8; j++) { |
| txt[i] |= buf[i * 8 + j] << j; |
| } |
| txt[8] = \(aq\e0\(aq; |
| } |
| printf("After decrypting: %s\en", txt); |
| exit(EXIT_SUCCESS); |
| } |
| .EE |
| .SH SEE ALSO |
| .BR cbc_crypt (3), |
| .BR crypt (3), |
| .BR ecb_crypt (3), |
| .\" .BR fcrypt (3) |