mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-30 10:45:40 +03:00 
			
		
		
		
	Update. 2004-05-15 Petter Reinholdtsen <pere@hungry.com> * locale/iso-3166.def: Remove YUGOSLAVIA and insert "SERBIA AND MONTENEGRO" which have taken over the code 819. Patch from Danilo Segan. [BZ #40] 2004-05-15 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h (SYSCALL_ERROR_HANDLER): Rename __sparc.get_pic.l7 to __sparc_get_pic_l7. 2004-05-15 Joseph S. Myers <jsm@polyomino.org.uk> * catgets/gencat.c: Update bug reporting instructions. * csu/version.c: Likewise. * debug/catchsegv.sh: Likewise. * debug/pcprofiledump.c: Likewise. * debug/xtrace.sh: Likewise. * elf/ldd.bash.in: Likewise. * iconv/iconv_prog.c: Likewise. * iconv/iconvconfig.c: Likewise. * locale/programs/locale.c: Likewise. * locale/programs/localedef.c: Likewise. * login/programs/pt_chown.c: Likewise. * malloc/memusage.sh: Likewise. * malloc/memusagestat.c: Likewise. * malloc/mtrace.pl: Likewise. * manual/crypt.texi: Likewise. * manual/install.texi: Likewise. * nss/makedb.c: Likewise. 2004-05-14 Jakub Jelinek <jakub@redhat.com> * sysdeps/sparc/sparc32/dl-machine.h (elf_machine_rela): Only CHECK_STATIC_TLS if sym != NULL. * sysdeps/sh/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/i386/dl-machine.h (elf_machine_rela): Likewise. 2004-05-12 Andreas Schwab <schwab@suse.de> * posix/regex_internal.c (build_wcs_buffer): Also set pstr->mbs when translating. 2004-05-13 H.J. Lu <hongjiu.lu@intel.com> * Rules (xtests): Depend on tests.
		
			
				
	
	
		
			393 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			393 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| @c This node must have no pointers.
 | |
| @node Cryptographic Functions
 | |
| @c @node Cryptographic Functions, Debugging Support, System Configuration, Top
 | |
| @chapter DES Encryption and Password Handling
 | |
| @c %MENU% DES encryption and password handling
 | |
| 
 | |
| On many systems, it is unnecessary to have any kind of user
 | |
| authentication; for instance, a workstation which is not connected to a
 | |
| network probably does not need any user authentication, because to use
 | |
| the machine an intruder must have physical access.
 | |
| 
 | |
| Sometimes, however, it is necessary to be sure that a user is authorized
 | |
| to use some service a machine provides---for instance, to log in as a
 | |
| particular user id (@pxref{Users and Groups}).  One traditional way of
 | |
| doing this is for each user to choose a secret @dfn{password}; then, the
 | |
| system can ask someone claiming to be a user what the user's password
 | |
| is, and if the person gives the correct password then the system can
 | |
| grant the appropriate privileges.
 | |
| 
 | |
| If all the passwords are just stored in a file somewhere, then this file
 | |
| has to be very carefully protected.  To avoid this, passwords are run
 | |
| through a @dfn{one-way function}, a function which makes it difficult to
 | |
| work out what its input was by looking at its output, before storing in
 | |
| the file.
 | |
| 
 | |
| The GNU C library provides a one-way function that is compatible with
 | |
| the behavior of the @code{crypt} function introduced in FreeBSD 2.0.
 | |
| It supports two one-way algorithms: one based on the MD5
 | |
| message-digest algorithm that is compatible with modern BSD systems,
 | |
| and the other based on the Data Encryption Standard (DES) that is
 | |
| compatible with Unix systems.
 | |
| 
 | |
| It also provides support for Secure RPC, and some library functions that
 | |
| can be used to perform normal DES encryption.
 | |
| 
 | |
| @menu
 | |
| * Legal Problems::              This software can get you locked up, or worse.
 | |
| * getpass::                     Prompting the user for a password.
 | |
| * crypt::                       A one-way function for passwords.
 | |
| * DES Encryption::              Routines for DES encryption.
 | |
| @end menu
 | |
| 
 | |
| @node Legal Problems
 | |
| @section Legal Problems
 | |
| 
 | |
| Because of the continuously changing state of the law, it's not possible
 | |
| to provide a definitive survey of the laws affecting cryptography.
 | |
| Instead, this section warns you of some of the known trouble spots; this
 | |
| may help you when you try to find out what the laws of your country are.
 | |
| 
 | |
| Some countries require that you have a licence to use, possess, or import
 | |
| cryptography.  These countries are believed to include Byelorussia,
 | |
| Burma, India, Indonesia, Israel, Kazakhstan, Pakistan, Russia, and Saudi
 | |
| Arabia.
 | |
| 
 | |
| Some countries restrict the transmission of encrypted messages by radio;
 | |
| some telecommunications carriers restrict the transmission of encrypted
 | |
| messages over their network.
 | |
| 
 | |
| Many countries have some form of export control for encryption software.
 | |
| The Wassenaar Arrangement is a multilateral agreement between 33
 | |
| countries (Argentina, Australia, Austria, Belgium, Bulgaria, Canada, the
 | |
| Czech Republic, Denmark, Finland, France, Germany, Greece, Hungary,
 | |
| Ireland, Italy, Japan, Luxembourg, the Netherlands, New Zealand, Norway,
 | |
| Poland, Portugal, the Republic of Korea, Romania, the Russian
 | |
| Federation, the Slovak Republic, Spain, Sweden, Switzerland, Turkey,
 | |
| Ukraine, the United Kingdom and the United States) which restricts some
 | |
| kinds of encryption exports.  Different countries apply the arrangement
 | |
| in different ways; some do not allow the exception for certain kinds of
 | |
| ``public domain'' software (which would include this library), some
 | |
| only restrict the export of software in tangible form, and others impose
 | |
| significant additional restrictions.
 | |
| 
 | |
| The United States has additional rules.  This software would generally
 | |
| be exportable under 15 CFR 740.13(e), which permits exports of
 | |
| ``encryption source code'' which is ``publicly available'' and which is
 | |
| ``not subject to an express agreement for the payment of a licensing fee or
 | |
| royalty for commercial production or sale of any product developed with
 | |
| the source code'' to most countries.
 | |
| 
 | |
| The rules in this area are continuously changing.  If you know of any
 | |
| information in this manual that is out-of-date, please report it to
 | |
| the bug database.  @xref{Reporting Bugs}.
 | |
| 
 | |
| @node getpass
 | |
| @section Reading Passwords
 | |
| 
 | |
| When reading in a password, it is desirable to avoid displaying it on
 | |
| the screen, to help keep it secret.  The following function handles this
 | |
| in a convenient way.
 | |
| 
 | |
| @comment unistd.h
 | |
| @comment BSD
 | |
| @deftypefun {char *} getpass (const char *@var{prompt})
 | |
| 
 | |
| @code{getpass} outputs @var{prompt}, then reads a string in from the
 | |
| terminal without echoing it.  It tries to connect to the real terminal,
 | |
| @file{/dev/tty}, if possible, to encourage users not to put plaintext
 | |
| passwords in files; otherwise, it uses @code{stdin} and @code{stderr}.
 | |
| @code{getpass} also disables the INTR, QUIT, and SUSP characters on the
 | |
| terminal using the @code{ISIG} terminal attribute (@pxref{Local Modes}).
 | |
| The terminal is flushed before and after @code{getpass}, so that
 | |
| characters of a mistyped password are not accidentally visible.
 | |
| 
 | |
| In other C libraries, @code{getpass} may only return the first
 | |
| @code{PASS_MAX} bytes of a password.  The GNU C library has no limit, so
 | |
| @code{PASS_MAX} is undefined.
 | |
| 
 | |
| The prototype for this function is in @file{unistd.h}.  @code{PASS_MAX}
 | |
| would be defined in @file{limits.h}.
 | |
| @end deftypefun
 | |
| 
 | |
| This precise set of operations may not suit all possible situations.  In
 | |
| this case, it is recommended that users write their own @code{getpass}
 | |
| substitute.  For instance, a very simple substitute is as follows:
 | |
| 
 | |
| @smallexample
 | |
| @include mygetpass.c.texi
 | |
| @end smallexample
 | |
| 
 | |
| The substitute takes the same parameters as @code{getline}
 | |
| (@pxref{Line Input}); the user must print any prompt desired.
 | |
| 
 | |
| @node crypt
 | |
| @section Encrypting Passwords
 | |
| 
 | |
| @comment crypt.h
 | |
| @comment BSD, SVID
 | |
| @deftypefun {char *} crypt (const char *@var{key}, const char *@var{salt})
 | |
| 
 | |
| The @code{crypt} function takes a password, @var{key}, as a string, and
 | |
| a @var{salt} character array which is described below, and returns a
 | |
| printable ASCII string which starts with another salt.  It is believed
 | |
| that, given the output of the function, the best way to find a @var{key}
 | |
| that will produce that output is to guess values of @var{key} until the
 | |
| original value of @var{key} is found.
 | |
| 
 | |
| The @var{salt} parameter does two things.  Firstly, it selects which
 | |
| algorithm is used, the MD5-based one or the DES-based one.  Secondly, it
 | |
| makes life harder for someone trying to guess passwords against a file
 | |
| containing many passwords; without a @var{salt}, an intruder can make a
 | |
| guess, run @code{crypt} on it once, and compare the result with all the
 | |
| passwords.  With a @var{salt}, the intruder must run @code{crypt} once
 | |
| for each different salt.
 | |
| 
 | |
| For the MD5-based algorithm, the @var{salt} should consist of the string
 | |
| @code{$1$}, followed by up to 8 characters, terminated by either
 | |
| another @code{$} or the end of the string.  The result of @code{crypt}
 | |
| will be the @var{salt}, followed by a @code{$} if the salt didn't end
 | |
| with one, followed by 22 characters from the alphabet
 | |
| @code{./0-9A-Za-z}, up to 34 characters total.  Every character in the
 | |
| @var{key} is significant.
 | |
| 
 | |
| For the DES-based algorithm, the @var{salt} should consist of two
 | |
| characters from the alphabet @code{./0-9A-Za-z}, and the result of
 | |
| @code{crypt} will be those two characters followed by 11 more from the
 | |
| same alphabet, 13 in total.  Only the first 8 characters in the
 | |
| @var{key} are significant.
 | |
| 
 | |
| The MD5-based algorithm has no limit on the useful length of the
 | |
| password used, and is slightly more secure.  It is therefore preferred
 | |
| over the DES-based algorithm.
 | |
| 
 | |
| When the user enters their password for the first time, the @var{salt}
 | |
| should be set to a new string which is reasonably random.  To verify a
 | |
| password against the result of a previous call to @code{crypt}, pass
 | |
| the result of the previous call as the @var{salt}.
 | |
| @end deftypefun
 | |
| 
 | |
| The following short program is an example of how to use @code{crypt} the
 | |
| first time a password is entered.  Note that the @var{salt} generation
 | |
| is just barely acceptable; in particular, it is not unique between
 | |
| machines, and in many applications it would not be acceptable to let an
 | |
| attacker know what time the user's password was last set.
 | |
| 
 | |
| @smallexample
 | |
| @include genpass.c.texi
 | |
| @end smallexample
 | |
| 
 | |
| The next program shows how to verify a password.  It prompts the user
 | |
| for a password and prints ``Access granted.'' if the user types
 | |
| @code{GNU libc manual}.
 | |
| 
 | |
| @smallexample
 | |
| @include testpass.c.texi
 | |
| @end smallexample
 | |
| 
 | |
| @comment crypt.h
 | |
| @comment GNU
 | |
| @deftypefun {char *} crypt_r (const char *@var{key}, const char *@var{salt}, {struct crypt_data *} @var{data})
 | |
| 
 | |
| The @code{crypt_r} function does the same thing as @code{crypt}, but
 | |
| takes an extra parameter which includes space for its result (among
 | |
| other things), so it can be reentrant.  @code{data@w{->}initialized} must be
 | |
| cleared to zero before the first time @code{crypt_r} is called.
 | |
| 
 | |
| The @code{crypt_r} function is a GNU extension.
 | |
| @end deftypefun
 | |
| 
 | |
| The @code{crypt} and @code{crypt_r} functions are prototyped in the
 | |
| header @file{crypt.h}.
 | |
| 
 | |
| @node DES Encryption
 | |
| @section DES Encryption
 | |
| 
 | |
| The Data Encryption Standard is described in the US Government Federal
 | |
| Information Processing Standards (FIPS) 46-3 published by the National
 | |
| Institute of Standards and Technology.  The DES has been very thoroughly
 | |
| analyzed since it was developed in the late 1970s, and no new
 | |
| significant flaws have been found.
 | |
| 
 | |
| However, the DES uses only a 56-bit key (plus 8 parity bits), and a
 | |
| machine has been built in 1998 which can search through all possible
 | |
| keys in about 6 days, which cost about US$200000; faster searches would
 | |
| be possible with more money.  This makes simple DES insecure for most
 | |
| purposes, and NIST no longer permits new US government systems
 | |
| to use simple DES.
 | |
| 
 | |
| For serious encryption functionality, it is recommended that one of the
 | |
| many free encryption libraries be used instead of these routines.
 | |
| 
 | |
| The DES is a reversible operation which takes a 64-bit block and a
 | |
| 64-bit key, and produces another 64-bit block.  Usually the bits are
 | |
| numbered so that the most-significant bit, the first bit, of each block
 | |
| is numbered 1.
 | |
| 
 | |
| Under that numbering, every 8th bit of the key (the 8th, 16th, and so
 | |
| on) is not used by the encryption algorithm itself.  But the key must
 | |
| have odd parity; that is, out of bits 1 through 8, and 9 through 16, and
 | |
| so on, there must be an odd number of `1' bits, and this completely
 | |
| specifies the unused bits.
 | |
| 
 | |
| @comment crypt.h
 | |
| @comment BSD, SVID
 | |
| @deftypefun void setkey (const char *@var{key})
 | |
| 
 | |
| The @code{setkey} function sets an internal data structure to be an
 | |
| expanded form of @var{key}.  @var{key} is specified as an array of 64
 | |
| bits each stored in a @code{char}, the first bit is @code{key[0]} and
 | |
| the 64th bit is @code{key[63]}.  The @var{key} should have the correct
 | |
| parity.
 | |
| @end deftypefun
 | |
| 
 | |
| @comment crypt.h
 | |
| @comment BSD, SVID
 | |
| @deftypefun void encrypt (char *@var{block}, int @var{edflag})
 | |
| 
 | |
| The @code{encrypt} function encrypts @var{block} if
 | |
| @var{edflag} is 0, otherwise it decrypts @var{block}, using a key
 | |
| previously set by @code{setkey}.  The result is
 | |
| placed in @var{block}.
 | |
| 
 | |
| Like @code{setkey}, @var{block} is specified as an array of 64 bits each
 | |
| stored in a @code{char}, but there are no parity bits in @var{block}.
 | |
| @end deftypefun
 | |
| 
 | |
| @comment crypt.h
 | |
| @comment GNU
 | |
| @deftypefun void setkey_r (const char *@var{key}, {struct crypt_data *} @var{data})
 | |
| @comment crypt.h
 | |
| @comment GNU
 | |
| @deftypefunx void encrypt_r (char *@var{block}, int @var{edflag}, {struct crypt_data *} @var{data})
 | |
| 
 | |
| These are reentrant versions of @code{setkey} and @code{encrypt}.  The
 | |
| only difference is the extra parameter, which stores the expanded
 | |
| version of @var{key}.  Before calling @code{setkey_r} the first time,
 | |
| @code{data->initialized} must be cleared to zero.
 | |
| @end deftypefun
 | |
| 
 | |
| The @code{setkey_r} and @code{encrypt_r} functions are GNU extensions.
 | |
| @code{setkey}, @code{encrypt}, @code{setkey_r}, and @code{encrypt_r} are
 | |
| defined in @file{crypt.h}.
 | |
| 
 | |
| @comment rpc/des_crypt.h
 | |
| @comment SUNRPC
 | |
| @deftypefun int ecb_crypt (char *@var{key}, char *@var{blocks}, unsigned @var{len}, unsigned @var{mode})
 | |
| 
 | |
| The function @code{ecb_crypt} encrypts or decrypts one or more blocks
 | |
| using DES.  Each block is encrypted independently.
 | |
| 
 | |
| The @var{blocks} and the @var{key} are stored packed in 8-bit bytes, so
 | |
| that the first bit of the key is the most-significant bit of
 | |
| @code{key[0]} and the 63rd bit of the key is stored as the
 | |
| least-significant bit of @code{key[7]}.  The @var{key} should have the
 | |
| correct parity.
 | |
| 
 | |
| @var{len} is the number of bytes in @var{blocks}.  It should be a
 | |
| multiple of 8 (so that there is a whole number of blocks to encrypt).
 | |
| @var{len} is limited to a maximum of @code{DES_MAXDATA} bytes.
 | |
| 
 | |
| The result of the encryption replaces the input in @var{blocks}.
 | |
| 
 | |
| The @var{mode} parameter is the bitwise OR of two of the following:
 | |
| 
 | |
| @vtable @code
 | |
| @comment rpc/des_crypt.h
 | |
| @comment SUNRPC
 | |
| @item DES_ENCRYPT
 | |
| This constant, used in the @var{mode} parameter, specifies that
 | |
| @var{blocks} is to be encrypted.
 | |
| 
 | |
| @comment rpc/des_crypt.h
 | |
| @comment SUNRPC
 | |
| @item DES_DECRYPT
 | |
| This constant, used in the @var{mode} parameter, specifies that
 | |
| @var{blocks} is to be decrypted.
 | |
| 
 | |
| @comment rpc/des_crypt.h
 | |
| @comment SUNRPC
 | |
| @item DES_HW
 | |
| This constant, used in the @var{mode} parameter, asks to use a hardware
 | |
| device.  If no hardware device is available, encryption happens anyway,
 | |
| but in software.
 | |
| 
 | |
| @comment rpc/des_crypt.h
 | |
| @comment SUNRPC
 | |
| @item DES_SW
 | |
| This constant, used in the @var{mode} parameter, specifies that no
 | |
| hardware device is to be used.
 | |
| @end vtable
 | |
| 
 | |
| The result of the function will be one of these values:
 | |
| 
 | |
| @vtable @code
 | |
| @comment rpc/des_crypt.h
 | |
| @comment SUNRPC
 | |
| @item DESERR_NONE
 | |
| The encryption succeeded.
 | |
| 
 | |
| @comment rpc/des_crypt.h
 | |
| @comment SUNRPC
 | |
| @item DESERR_NOHWDEVICE
 | |
| The encryption succeeded, but there was no hardware device available.
 | |
| 
 | |
| @comment rpc/des_crypt.h
 | |
| @comment SUNRPC
 | |
| @item DESERR_HWERROR
 | |
| The encryption failed because of a hardware problem.
 | |
| 
 | |
| @comment rpc/des_crypt.h
 | |
| @comment SUNRPC
 | |
| @item DESERR_BADPARAM
 | |
| The encryption failed because of a bad parameter, for instance @var{len}
 | |
| is not a multiple of 8 or @var{len} is larger than @code{DES_MAXDATA}.
 | |
| @end vtable
 | |
| @end deftypefun
 | |
| 
 | |
| @comment rpc/des_crypt.h
 | |
| @comment SUNRPC
 | |
| @deftypefun int DES_FAILED (int @var{err})
 | |
| This macro returns 1 if @var{err} is a `success' result code from
 | |
| @code{ecb_crypt} or @code{cbc_crypt}, and 0 otherwise.
 | |
| @end deftypefun
 | |
| 
 | |
| @comment rpc/des_crypt.h
 | |
| @comment SUNRPC
 | |
| @deftypefun int cbc_crypt (char *@var{key}, char *@var{blocks}, unsigned @var{len}, unsigned @var{mode}, char *@var{ivec})
 | |
| 
 | |
| The function @code{cbc_crypt} encrypts or decrypts one or more blocks
 | |
| using DES in Cipher Block Chaining mode.
 | |
| 
 | |
| For encryption in CBC mode, each block is exclusive-ored with @var{ivec}
 | |
| before being encrypted, then @var{ivec} is replaced with the result of
 | |
| the encryption, then the next block is processed.  Decryption is the
 | |
| reverse of this process.
 | |
| 
 | |
| This has the advantage that blocks which are the same before being
 | |
| encrypted are very unlikely to be the same after being encrypted, making
 | |
| it much harder to detect patterns in the data.
 | |
| 
 | |
| Usually, @var{ivec} is set to 8 random bytes before encryption starts.
 | |
| Then the 8 random bytes are transmitted along with the encrypted data
 | |
| (without themselves being encrypted), and passed back in as @var{ivec}
 | |
| for decryption.  Another possibility is to set @var{ivec} to 8 zeroes
 | |
| initially, and have the first the block encrypted consist of 8 random
 | |
| bytes.
 | |
| 
 | |
| Otherwise, all the parameters are similar to those for @code{ecb_crypt}.
 | |
| @end deftypefun
 | |
| 
 | |
| @comment rpc/des_crypt.h
 | |
| @comment SUNRPC
 | |
| @deftypefun void des_setparity (char *@var{key})
 | |
| 
 | |
| The function @code{des_setparity} changes the 64-bit @var{key}, stored
 | |
| packed in 8-bit bytes, to have odd parity by altering the low bits of
 | |
| each byte.
 | |
| @end deftypefun
 | |
| 
 | |
| The @code{ecb_crypt}, @code{cbc_crypt}, and @code{des_setparity}
 | |
| functions and their accompanying macros are all defined in the header
 | |
| @file{rpc/des_crypt.h}.
 |