summaryrefslogtreecommitdiffstats
path: root/upstream/debian-unstable/man3/crypt.3
diff options
context:
space:
mode:
Diffstat (limited to 'upstream/debian-unstable/man3/crypt.3')
-rw-r--r--upstream/debian-unstable/man3/crypt.3474
1 files changed, 474 insertions, 0 deletions
diff --git a/upstream/debian-unstable/man3/crypt.3 b/upstream/debian-unstable/man3/crypt.3
new file mode 100644
index 00000000..1b00e4af
--- /dev/null
+++ b/upstream/debian-unstable/man3/crypt.3
@@ -0,0 +1,474 @@
+.\" Written and revised by Solar Designer <solar at openwall.com> in 2000-2011.
+.\" Revised by Zack Weinberg <zackw at panix.com> in 2017.
+.\" Converted to mdoc format by Zack Weinberg in 2018.
+.\"
+.\" No copyright is claimed, and this man page is hereby placed in the public
+.\" domain. In case this attempt to disclaim copyright and place the man page
+.\" in the public domain is deemed null and void, then the man page is
+.\" Copyright 2000-2011 Solar Designer, 2017, 2018 Zack Weinberg, and it is
+.\" hereby released to the general public under the following terms:
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted.
+.\"
+.\" There's ABSOLUTELY NO WARRANTY, express or implied.
+.\"
+.Dd October 11, 2017
+.Dt CRYPT 3
+.Os "Openwall Project"
+.Sh NAME
+.Nm crypt , crypt_r , crypt_rn , crypt_ra
+.Nd passphrase hashing
+.Sh LIBRARY
+.Lb libcrypt
+.Sh SYNOPSIS
+.In crypt.h
+.Ft "char *"
+.Fo crypt
+.Fa "const char *phrase"
+.Fa "const char *setting"
+.Fc
+.Ft "char *"
+.Fo crypt_r
+.Fa "const char *phrase"
+.Fa "const char *setting"
+.Fa "struct crypt_data *data"
+.Fc
+.Ft "char *"
+.Fo crypt_rn
+.Fa "const char *phrase"
+.Fa "const char *setting"
+.Fa "struct crypt_data *data"
+.Fa "int size"
+.Fc
+.Ft "char *"
+.Fo crypt_ra
+.Fa "const char *phrase"
+.Fa "const char *setting"
+.Fa "void **data"
+.Fa "int *size"
+.Fc
+.Sh DESCRIPTION
+The
+.Nm crypt ,
+.Nm crypt_r ,
+.Nm crypt_rn ,
+and
+.Nm crypt_ra
+functions irreversibly
+.Dq hash
+.Fa phrase
+for storage in the system password database
+.Pq Xr shadow 5
+using a cryptographic
+.Dq hashing method.
+The result of this operation is called a
+.Dq hashed passphrase
+or just a
+.Dq hash.
+Hashing methods are described in
+.Xr crypt 5 .
+.Pp
+.Fa setting
+controls which hashing method to use,
+and also supplies various parameters to the chosen method,
+most importantly a random
+.Dq salt
+which ensures that no two stored hashes are the same,
+even if the
+.Fa phrase
+strings are the same.
+.Pp
+The
+.Fa data
+argument to
+.Nm crypt_r
+is a structure of type
+.Vt "struct crypt_data" .
+It has at least these fields:
+.Bd -literal -offset indent
+struct crypt_data {
+ char output[CRYPT_OUTPUT_SIZE];
+ char setting[CRYPT_OUTPUT_SIZE];
+ char input[CRYPT_MAX_PASSPHRASE_SIZE];
+ char initialized;
+};
+.Ed
+.Pp
+Upon a successful return from
+.Nm crypt_r ,
+the hashed passphrase will be stored in
+.Fa output .
+Applications are encouraged, but not required, to use the
+.Fa input
+and
+.Fa setting
+fields to store the strings that they will pass as
+.Fa input phrase
+and
+.Fa setting
+to
+.Nm crypt_r .
+This will make it easier to erase all sensitive data
+after it is no longer needed.
+.Pp
+The
+.Fa initialized
+field must be set to zero before the first time a
+.Vt "struct crypt_data"
+object is first used in a call to
+.Fn crypt_r .
+We recommend zeroing the entire object,
+not just
+.Fa initialized
+and not just the documented fields,
+before the first use.
+(Of course, do this before storing anything in
+.Fa setting
+and
+.Fa input . )
+.Pp
+The
+.Fa data
+argument to
+.Nm crypt_rn
+should also point to a
+.Vt "struct crypt_data"
+object, and
+.Fa size
+should be the size of that object, cast to
+.Vt int .
+When used with
+.Nm crypt_rn ,
+the entire
+.Fa data
+object (except for the
+.Fa input
+and
+.Fa setting
+fields) must be zeroed before its first use;
+this is not just a recommendation, as it is for
+.Nm crypt_r .
+Otherwise, the fields of the object have the same uses that they do for
+.Nm crypt_r .
+.Pp
+On the first call to
+.Nm crypt_ra ,
+.Fa data
+should be the address of a
+.Vt "void *"
+variable set to NULL, and
+.Fa size
+should be the address of an
+.Vt int
+variable set to zero.
+.Nm crypt_ra
+will allocate and initialize a
+.Vt "struct crypt_data"
+object, using
+.Xr malloc 3 ,
+and write its address and size into the variables pointed to by
+.Fa data
+and
+.Fa size .
+These can be reused in subsequent calls.
+After the application is done hashing passphrases,
+it should deallocate the
+.Vt "struct crypt_data"
+object using
+.Xr free 3 .
+.Sh RETURN VALUES
+Upon successful completion,
+.Nm crypt ,
+.Nm crypt_r ,
+.Nm crypt_rn ,
+and
+.Nm crypt_ra
+return a pointer to a string which encodes both the hashed passphrase,
+and the settings that were used to encode it.
+This string is directly usable as
+.Fa setting
+in other calls to
+.Nm crypt ,
+.Nm crypt_r ,
+.Nm crypt_rn ,
+and
+.Nm crypt_ra ,
+and as
+.Fa prefix
+in calls to
+.Nm crypt_gensalt ,
+.Nm crypt_gensalt_rn ,
+and
+.Nm crypt_gensalt_ra .
+It will be entirely printable ASCII,
+and will not contain whitespace
+or the characters
+.Sq Li \&: ,
+.Sq Li \&; ,
+.Sq Li \&* ,
+.Sq Li \&! ,
+or
+.Sq Li \&\e .
+See
+.Xr crypt 5
+for more detail on the format of hashed passphrases.
+.Pp
+.Nm crypt
+places its result in a static storage area,
+which will be overwritten by subsequent calls to
+.Nm crypt .
+It is not safe to call
+.Nm crypt
+from multiple threads simultaneously.
+.Pp
+.Nm crypt_r ,
+.Nm crypt_rn ,
+and
+.Nm crypt_ra
+place their result in the
+.Fa output
+field of their
+.Fa data
+argument.
+It is safe to call them from multiple threads simultaneously,
+as long as a separate
+.Fa data
+object is used for each thread.
+.Pp
+Upon error,
+.Nm crypt_r ,
+.Nm crypt_rn ,
+and
+.Nm crypt_ra
+write an
+.Em invalid
+hashed passphrase to the
+.Fa output
+field of their
+.Fa data
+argument, and
+.Nm crypt
+writes an invalid hash to its static storage area.
+This string will be shorter than 13 characters,
+will begin with a
+.Sq Li \&* ,
+and will not compare equal to
+.Fa setting .
+.Pp
+Upon error,
+.Nm crypt_rn
+and
+.Nm crypt_ra
+return a null pointer.
+.Nm crypt_r
+and
+.Nm crypt
+may also return a null pointer,
+or they may return a pointer to the invalid hash,
+depending on how libcrypt was configured.
+(The option to return the invalid hash is for compatibility
+with old applications that assume that
+.Nm crypt
+cannot return a null pointer.
+See
+.Sx PORTABILITY NOTES
+below.)
+.Pp
+All four functions set
+.Va errno
+when they fail.
+.Sh ERRORS
+.Bl -tag -width Er
+.It Er EINVAL
+.Fa setting
+is invalid, or requests a hashing method that is not supported.
+.It Er ERANGE
+.Fa phrase
+is too long
+(more than
+.Dv CRYPT_MAX_PASSPHRASE_SIZE
+characters; some hashing methods may have lower limits).
+.br
+.Nm crypt_rn
+only:
+.Fa size
+is too small for the hashing method requested by
+.Fa setting .
+.It Er ENOMEM
+Failed to allocate internal scratch memory.
+.br
+.Nm crypt_ra
+only: failed to allocate memory for
+.Fa data .
+.It Er ENOSYS No or Er EOPNOTSUPP
+Hashing passphrases is not supported at all on this installation,
+or the hashing method requested by
+.Fa setting
+is not supported.
+These error codes are not used by this version of libcrypt,
+but may be encountered on other systems.
+.El
+.Sh PORTABILITY NOTES
+.Nm crypt
+is included in POSIX, but
+.Nm crypt_r ,
+.Nm crypt_rn ,
+and
+.Nm crypt_ra
+are not part of any standard.
+.Pp
+POSIX does not specify any hashing methods,
+and does not require hashed passphrases to be portable between systems.
+In practice, hashed passphrases are portable
+as long as both systems support the hashing method that was used.
+However, the set of supported hashing methods
+varies considerably from system to system.
+.Pp
+The behavior of
+.Nm crypt
+on errors isn't well standardized.
+Some implementations simply can't fail
+(except by crashing the program),
+others return a null pointer or a fixed string.
+Most implementations don't set
+.Va errno ,
+but some do.
+POSIX specifies returning a null pointer and setting
+.Va errno ,
+but it defines only one possible error,
+.Er ENOSYS ,
+in the case where
+.Nm crypt
+is not supported at all.
+Some older applications are not prepared to handle null pointers
+returned by
+.Nm crypt .
+The behavior described above for this implementation,
+setting
+.Va errno
+and returning an invalid hashed passphrase different from
+.Fa setting ,
+is chosen to make these applications fail closed when an error occurs.
+.Pp
+Due to historical restrictions
+on the export of cryptographic software from the USA,
+.Nm crypt
+is an optional POSIX component.
+Applications should therefore be prepared for
+.Nm crypt
+not to be available,
+or to always fail (setting
+.Va errno
+to
+.Er ENOSYS )
+at runtime.
+.Pp
+POSIX specifies that
+.Nm crypt
+is declared in
+.In unistd.h ,
+but only if the macro
+.Dv _XOPEN_CRYPT
+is defined and has a value greater than or equal to zero.
+Since libcrypt does not provide
+.In unistd.h ,
+it declares
+.Nm crypt ,
+.Nm crypt_r ,
+.Nm crypt_rn ,
+and
+.Nm crypt_ra
+in
+.In crypt.h
+instead.
+.Pp
+On a minority of systems (notably recent versions of Solaris),
+.Nm crypt
+uses a thread-specific static storage buffer,
+which makes it safe to call from multiple threads simultaneously,
+but does not prevent each call within a thread
+from overwriting the results of the previous one.
+.Sh BUGS
+Some implementations of
+.Nm crypt ,
+upon error,
+return an invalid hash that is stored in a read-only location
+or only initialized once,
+which means that it is only safe to erase the buffer pointed to by the
+.Nm crypt
+return value if an error did not occur.
+.Pp
+.Vt "struct crypt_data"
+may be quite large (32kB in this implementation of libcrypt;
+over 128kB in some other implementations).
+This is large enough that it may be unwise to allocate it on the stack.
+.Pp
+Some recently designed hashing methods need even more scratch memory,
+but the
+.Nm crypt_r
+interface makes it impossible to change the size of
+.Vt "struct crypt_data"
+without breaking binary compatibility.
+The
+.Nm crypt_rn
+interface could accommodate larger allocations for specific hashing methods,
+but the caller of
+.Nm crypt_rn
+has no way of knowing how much memory to allocate.
+.Nm crypt_ra
+does the allocation itself,
+but can only make a single call to
+.Xr malloc 3 .
+.Sh ATTRIBUTES
+For an explanation of the terms used in this section, see
+.Xr attributes 7 .
+.TS
+allbox;
+lb lb lb
+l l l.
+Interface Attribute Value
+T{
+.Nm crypt
+T} Thread safety MT-Unsafe race:crypt
+T{
+.Nm crypt_r ,
+.Nm crypt_rn ,
+.Nm crypt_ra
+T} Thread safety MT-Safe
+.TE
+.sp
+.Sh HISTORY
+A rotor-based
+.Nm crypt
+function appeared in
+.At v6 .
+The
+.Dq traditional
+DES-based
+.Nm crypt
+first appeared in
+.At v7 .
+.Pp
+.Nm crypt_r
+originates with the GNU C Library.
+There's also a
+.Nm crypt_r
+function on HP-UX and MKS Toolkit, but the prototypes and semantics
+differ.
+.Pp
+.Nm crypt_rn
+and
+.Nm crypt_ra
+originate with the Openwall project.
+.Sh SEE ALSO
+.Xr crypt_gensalt 3 ,
+.Xr getpass 3 ,
+.Xr getpwent 3 ,
+.Xr shadow 3 ,
+.Xr login 1 ,
+.Xr passwd 1 ,
+.Xr crypt 5 ,
+.Xr passwd 5 ,
+.Xr shadow 5 ,
+.Xr pam 8