408 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			408 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
| .\"	$NetBSD: crypt.3,v 1.27 2012/03/23 18:08:35 njoly Exp $
 | |
| .\"
 | |
| .\" Copyright (c) 1989, 1991, 1993
 | |
| .\"	The Regents of the University of California.  All rights reserved.
 | |
| .\"
 | |
| .\" Redistribution and use in source and binary forms, with or without
 | |
| .\" modification, are permitted provided that the following conditions
 | |
| .\" are met:
 | |
| .\" 1. Redistributions of source code must retain the above copyright
 | |
| .\"    notice, this list of conditions and the following disclaimer.
 | |
| .\" 2. Redistributions in binary form must reproduce the above copyright
 | |
| .\"    notice, this list of conditions and the following disclaimer in the
 | |
| .\"    documentation and/or other materials provided with the distribution.
 | |
| .\" 3. Neither the name of the University nor the names of its contributors
 | |
| .\"    may be used to endorse or promote products derived from this software
 | |
| .\"    without specific prior written permission.
 | |
| .\"
 | |
| .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 | |
| .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | |
| .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | |
| .\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 | |
| .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | |
| .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | |
| .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | |
| .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | |
| .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | |
| .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | |
| .\" SUCH DAMAGE.
 | |
| .\"
 | |
| .\"     @(#)crypt.3	8.2 (Berkeley) 12/11/93
 | |
| .\"
 | |
| .Dd January 1, 2012
 | |
| .Dt CRYPT 3
 | |
| .Os
 | |
| .Sh NAME
 | |
| .Nm crypt ,
 | |
| .Nm setkey ,
 | |
| .Nm encrypt ,
 | |
| .Nm des_setkey ,
 | |
| .Nm des_cipher
 | |
| .Nd password encryption
 | |
| .Sh LIBRARY
 | |
| .Lb libcrypt
 | |
| .Sh SYNOPSIS
 | |
| .In unistd.h
 | |
| .Ft "char *"
 | |
| .Fn crypt "const char *key" "const char *setting"
 | |
| .Ft int
 | |
| .Fn encrypt "char *block" "int flag"
 | |
| .Ft int
 | |
| .Fn des_setkey "const char *key"
 | |
| .Ft int
 | |
| .Fn des_cipher "const char *in" "char *out" "long salt" "int count"
 | |
| .In stdlib.h
 | |
| .Ft int
 | |
| .Fn setkey "const char *key"
 | |
| .Sh DESCRIPTION
 | |
| The
 | |
| .Fn crypt
 | |
| function
 | |
| performs password encryption.
 | |
| The encryption scheme used by
 | |
| .Fn crypt
 | |
| is dependent upon the contents of the
 | |
| .Dv NUL Ns -terminated
 | |
| string
 | |
| .Ar setting .
 | |
| If it begins
 | |
| with a string character
 | |
| .Pq Ql $
 | |
| and a number then a different algorithm is used depending on the number.
 | |
| At the moment a
 | |
| .Ql $1
 | |
| chooses MD5 hashing and a
 | |
| .Ql $2
 | |
| chooses Blowfish hashing; see below for more information.
 | |
| If
 | |
| .Ar setting
 | |
| begins with the ``_'' character, DES encryption with a user specified number
 | |
| of perturbations is selected.
 | |
| If
 | |
| .Ar setting
 | |
| begins with any other character, DES encryption with a fixed number
 | |
| of perturbations is selected.
 | |
| .Ss DES encryption
 | |
| The DES encryption scheme is derived from the
 | |
| .Tn NBS
 | |
| Data Encryption Standard.
 | |
| Additional code has been added to deter key search attempts and to use
 | |
| stronger hashing algorithms.
 | |
| In the DES case, the second argument to
 | |
| .Fn crypt
 | |
| is a character array, 9 bytes in length, consisting of an underscore (``_'')
 | |
| followed by 4 bytes of iteration count and 4 bytes of salt.
 | |
| Both the iteration
 | |
| .Fa count
 | |
| and the
 | |
| .Fa salt
 | |
| are encoded with 6 bits per character, least significant bits first.
 | |
| The values 0 to 63 are encoded by the characters ``./0-9A-Za-z'',
 | |
| respectively.
 | |
| .Pp
 | |
| The
 | |
| .Fa salt
 | |
| is used to induce disorder in to the
 | |
| .Tn DES
 | |
| algorithm
 | |
| in one of 16777216
 | |
| possible ways
 | |
| (specifically, if bit
 | |
| .Em i
 | |
| of the
 | |
| .Ar salt
 | |
| is set then bits
 | |
| .Em i
 | |
| and
 | |
| .Em i+24
 | |
| are swapped in the
 | |
| .Tn DES
 | |
| ``E'' box output).
 | |
| The
 | |
| .Ar key
 | |
| is divided into groups of 8 characters (a short final group is null-padded)
 | |
| and the low-order 7 bits of each character (56 bits per group) are
 | |
| used to form the DES key as follows: the first group of 56 bits becomes the
 | |
| initial DES key.
 | |
| For each additional group, the XOR of the group bits and the encryption of
 | |
| the DES key with itself becomes the next DES key.
 | |
| Then the final DES key is used to perform
 | |
| .Ar count
 | |
| cumulative encryptions of a 64-bit constant.
 | |
| The value returned is a
 | |
| .Dv NUL Ns -terminated
 | |
| string, 20 bytes in length, consisting
 | |
| of the
 | |
| .Ar setting
 | |
| followed by the encoded 64-bit encryption.
 | |
| .Pp
 | |
| For compatibility with historical versions of
 | |
| .Fn crypt ,
 | |
| the
 | |
| .Ar setting
 | |
| may consist of 2 bytes of salt, encoded as above, in which case an
 | |
| iteration
 | |
| .Ar count
 | |
| of 25 is used, fewer perturbations of
 | |
| .Tn DES
 | |
| are available, at most 8
 | |
| characters of
 | |
| .Ar key
 | |
| are used, and the returned value is a
 | |
| .Dv NUL Ns -terminated
 | |
| string 13 bytes in length.
 | |
| .Pp
 | |
| The
 | |
| functions
 | |
| .Fn encrypt ,
 | |
| .Fn setkey ,
 | |
| .Fn des_setkey
 | |
| and
 | |
| .Fn des_cipher
 | |
| allow limited access to the
 | |
| .Tn DES
 | |
| algorithm itself.
 | |
| The
 | |
| .Ar key
 | |
| argument to
 | |
| .Fn setkey
 | |
| is a 64 character array of
 | |
| binary values (numeric 0 or 1).
 | |
| A 56-bit key is derived from this array by dividing the array
 | |
| into groups of 8 and ignoring the last bit in each group.
 | |
| .Pp
 | |
| The
 | |
| .Fn encrypt
 | |
| argument
 | |
| .Fa block
 | |
| is also a 64 character array of
 | |
| binary values.
 | |
| If the value of
 | |
| .Fa flag
 | |
| is 0,
 | |
| the argument
 | |
| .Fa block
 | |
| is encrypted, otherwise it
 | |
| is decrypted.
 | |
| The encryption or decryption is returned in the original
 | |
| array
 | |
| .Fa block
 | |
| after using the
 | |
| key specified
 | |
| by
 | |
| .Fn setkey
 | |
| to process it.
 | |
| .Pp
 | |
| The
 | |
| .Fn des_setkey
 | |
| and
 | |
| .Fn des_cipher
 | |
| functions are faster but less portable than
 | |
| .Fn setkey
 | |
| and
 | |
| .Fn encrypt .
 | |
| The argument to
 | |
| .Fn des_setkey
 | |
| is a character array of length 8.
 | |
| The
 | |
| .Em least
 | |
| significant bit in each character is ignored and the next 7 bits of each
 | |
| character are concatenated to yield a 56-bit key.
 | |
| The function
 | |
| .Fn des_cipher
 | |
| encrypts (or decrypts if
 | |
| .Fa count
 | |
| is negative) the 64-bits stored in the 8 characters at
 | |
| .Fa in
 | |
| using
 | |
| .Xr abs 3
 | |
| of
 | |
| .Fa count
 | |
| iterations of
 | |
| .Tn DES
 | |
| and stores the 64-bit result in the 8 characters at
 | |
| .Fa out .
 | |
| The
 | |
| .Fa salt
 | |
| specifies perturbations to
 | |
| .Tn DES
 | |
| as described above.
 | |
| .Ss MD5 encryption
 | |
| For the
 | |
| .Tn MD5
 | |
| encryption scheme, the version number (in this case ``1''),
 | |
| .Fa salt
 | |
| and the hashed password are separated
 | |
| by the ``$'' character.
 | |
| A valid password looks like this:
 | |
| .Pp
 | |
| ``$1$2qGr5PPQ$eT08WBFev3RPLNChixg0H.''.
 | |
| .Pp
 | |
| The entire password string is passed as
 | |
| .Fa setting
 | |
| for interpretation.
 | |
| .Ss "Blowfish" crypt
 | |
| The
 | |
| .Tn Blowfish
 | |
| version of
 | |
| .Fn crypt
 | |
| has 128 bits of
 | |
| .Fa salt
 | |
| in order to make building dictionaries of common passwords space consuming.
 | |
| The initial state of the
 | |
| .Tn Blowfish
 | |
| cipher is expanded using the
 | |
| .Fa salt
 | |
| and the
 | |
| .Fa password
 | |
| repeating the process a variable number of rounds, which is encoded in
 | |
| the password string.
 | |
| The maximum password length is 72.
 | |
| The final Blowfish password entry is created by encrypting the string
 | |
| .Pp
 | |
| .Dq OrpheanBeholderScryDoubt
 | |
| .Pp
 | |
| with the
 | |
| .Tn Blowfish
 | |
| state 64 times.
 | |
| .Pp
 | |
| The version number, the logarithm of the number of rounds and
 | |
| the concatenation of salt and hashed password are separated by the
 | |
| .Ql $
 | |
| character.
 | |
| An encoded
 | |
| .Sq 8
 | |
| would specify 256 rounds.
 | |
| A valid Blowfish password looks like this:
 | |
| .Pp
 | |
| .Dq $2a$12$eIAq8PR8sIUnJ1HaohxX2O9x9Qlm2vK97LJ5dsXdmB.eXF42qjchC .
 | |
| .Pp
 | |
| The whole Blowfish password string is passed as
 | |
| .Fa setting
 | |
| for interpretation.
 | |
| .Sh RETURN VALUES
 | |
| The function
 | |
| .Fn crypt
 | |
| returns a pointer to the encrypted value on success.
 | |
| .Pp
 | |
| The behavior of
 | |
| .Fn crypt
 | |
| on errors isn't well standardized.
 | |
| Some implementations simply can't fail (unless the process dies, in which
 | |
| case they obviously can't return), others return
 | |
| .Dv NULL
 | |
| or a fixed string.
 | |
| Most implementations don't set
 | |
| .Va errno ,
 | |
| but some do.
 | |
| .St -susv2
 | |
| specifies
 | |
| only returning
 | |
| .Dv NULL
 | |
| and setting
 | |
| .Va errno
 | |
| as a valid behavior, and defines
 | |
| only one possible error
 | |
| .Er ( ENOSYS ,
 | |
| .Dq "The functionality is not supported on this implementation." )
 | |
| Unfortunately, most existing applications aren't prepared to handle
 | |
| .Dv NULL
 | |
| returns from
 | |
| .Fn crypt .
 | |
| The description below corresponds to this implementation of
 | |
| .Fn crypt
 | |
| only.
 | |
| The behavior may change to match standards, other implementations or existing
 | |
| applications.
 | |
| .Pp
 | |
| .Fn crypt
 | |
| may only fail (and return) when passed an invalid or unsupported
 | |
| .Fa setting ,
 | |
| in which case it returns a pointer to a magic string that is shorter than 13
 | |
| characters and is guaranteed to differ from
 | |
| .Fa setting .
 | |
| This behavior is safe for older applications which assume that
 | |
| .Fn crypt
 | |
| can't fail, when both setting new passwords and authenticating against
 | |
| existing password hashes.
 | |
| .Pp
 | |
| The functions
 | |
| .Fn setkey ,
 | |
| .Fn encrypt ,
 | |
| .Fn des_setkey ,
 | |
| and
 | |
| .Fn des_cipher
 | |
| return 0 on success and 1 on failure.
 | |
| Historically, the functions
 | |
| .Fn setkey
 | |
| and
 | |
| .Fn encrypt
 | |
| did not return any value.
 | |
| They have been provided return values primarily to distinguish
 | |
| implementations where hardware support is provided but not
 | |
| available or where the DES encryption is not available due to the
 | |
| usual political silliness.
 | |
| .Sh SEE ALSO
 | |
| .Xr login 1 ,
 | |
| .Xr passwd 1 ,
 | |
| .Xr pwhash 1 ,
 | |
| .Xr getpass 3 ,
 | |
| .Xr md5 3 ,
 | |
| .Xr passwd 5 ,
 | |
| .Xr passwd.conf 5
 | |
| .Rs
 | |
| .%T "Mathematical Cryptology for Computer Scientists and Mathematicians"
 | |
| .%A Wayne Patterson
 | |
| .%D 1987
 | |
| .%N ISBN 0-8476-7438-X
 | |
| .Re
 | |
| .Rs
 | |
| .%T "Password Security: A Case History"
 | |
| .%A R. Morris
 | |
| .%A Ken Thompson
 | |
| .%J "Communications of the ACM"
 | |
| .%V vol. 22
 | |
| .%P pp. 594-597
 | |
| .%D Nov. 1979
 | |
| .Re
 | |
| .Rs
 | |
| .%T "DES will be Totally Insecure within Ten Years"
 | |
| .%A M.E. Hellman
 | |
| .%J "IEEE Spectrum"
 | |
| .%V vol. 16
 | |
| .%P pp. 32-39
 | |
| .%D July 1979
 | |
| .Re
 | |
| .Sh HISTORY
 | |
| A rotor-based
 | |
| .Fn crypt
 | |
| function appeared in
 | |
| .At v6 .
 | |
| The current style
 | |
| .Fn crypt
 | |
| first appeared in
 | |
| .At v7 .
 | |
| .Sh BUGS
 | |
| Dropping the
 | |
| .Em least
 | |
| significant bit in each character of the argument to
 | |
| .Fn des_setkey
 | |
| is ridiculous.
 | |
| .Pp
 | |
| The
 | |
| .Fn crypt
 | |
| function leaves its result in an internal static object and returns
 | |
| a pointer to that object.
 | |
| Subsequent calls to
 | |
| .Fn crypt
 | |
| will modify the same object.
 | |
| .Pp
 | |
| Before
 | |
| .Nx 6.0
 | |
| .Fn crypt
 | |
| returned either
 | |
| .Dv NULL
 | |
| or
 | |
| .Dv \&:
 | |
| on error.
 | 
