mirror of https://github.com/mkerrisk/man-pages
207 lines
4.9 KiB
Groff
207 lines
4.9 KiB
Groff
.\" 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 2015-08-08 "" "Linux Programmer's Manual"
|
|
.SH NAME
|
|
encrypt, setkey, encrypt_r, setkey_r \- encrypt 64-bit messages
|
|
.SH SYNOPSIS
|
|
.BR "#define _XOPEN_SOURCE" " /* See feature_test_macros(7) */"
|
|
.br
|
|
.B #include <unistd.h>
|
|
.sp
|
|
.BI "void encrypt(char " block "[64], int " edflag );
|
|
.sp
|
|
.BR "#define _XOPEN_SOURCE" " /* See feature_test_macros(7) */"
|
|
.br
|
|
.B #include <stdlib.h>
|
|
.sp
|
|
.BI "void setkey(const char *" key );
|
|
.sp
|
|
.BR "#define _GNU_SOURCE" " /* See feature_test_macros(7) */"
|
|
.br
|
|
.B "#include <crypt.h>"
|
|
.sp
|
|
.BI "void setkey_r(const char *" key ", struct crypt_data *" data );
|
|
.br
|
|
.BI "void encrypt_r(char *" block ", int " edflag \
|
|
", struct crypt_data *" data );
|
|
.sp
|
|
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:
|
|
.in +4n
|
|
.nf
|
|
|
|
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 int current_saltbits;
|
|
int direction;
|
|
int initialized;
|
|
};
|
|
.fi
|
|
.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, it is unchanged.
|
|
.TP
|
|
.B ENOSYS
|
|
The function is not provided.
|
|
(For example because of former USA export restrictions.)
|
|
.SH ATTRIBUTES
|
|
For an explanation of the terms used in this section, see
|
|
.BR attributes (7).
|
|
.TS
|
|
allbox;
|
|
lbw23 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
|
|
.SH CONFORMING TO
|
|
.BR encrypt (),
|
|
.BR setkey ():
|
|
POSIX.1-2001, POSIX.1-2008, SUS, SVr4.
|
|
|
|
The functions
|
|
.BR encrypt_r ()
|
|
and
|
|
.BR setkey_r ()
|
|
are GNU extensions.
|
|
.SH NOTES
|
|
In glibc 2.2, these functions use the DES algorithm.
|
|
.SH EXAMPLE
|
|
.nf
|
|
#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];
|
|
int i, j;
|
|
|
|
for (i = 0; i < 64; i++) {
|
|
key[i] = rand() & 1;
|
|
}
|
|
|
|
for (i = 0; i < 8; i++) {
|
|
for (j = 0; j < 8; j++) {
|
|
buf[i * 8 + j] = orig[i] >> j & 1;
|
|
}
|
|
setkey(key);
|
|
}
|
|
printf("Before encrypting: %s\\n", orig);
|
|
|
|
encrypt(buf, 0);
|
|
for (i = 0; i < 8; i++) {
|
|
for (j = 0, txt[i] = \(aq\\0\(aq; j < 8; j++) {
|
|
txt[i] |= buf[i * 8 + j] << j;
|
|
}
|
|
txt[8] = \(aq\\0\(aq;
|
|
}
|
|
printf("After encrypting: %s\\n", txt);
|
|
|
|
encrypt(buf, 1);
|
|
for (i = 0; i < 8; i++) {
|
|
for (j = 0, txt[i] = \(aq\\0\(aq; j < 8; j++) {
|
|
txt[i] |= buf[i * 8 + j] << j;
|
|
}
|
|
txt[8] = \(aq\\0\(aq;
|
|
}
|
|
printf("After decrypting: %s\\n", txt);
|
|
exit(EXIT_SUCCESS);
|
|
}
|
|
.fi
|
|
.SH SEE ALSO
|
|
.BR cbc_crypt (3),
|
|
.BR crypt (3),
|
|
.BR ecb_crypt (3),
|
|
.\" .BR fcrypt (3)
|