xref: /freebsd/lib/libcrypt/crypt.3 (revision 24a0682c6465290759ed0b09ea16e40e7cd47053)
1e9a56ad5SMark Murray.\" FreeSec: libcrypt for NetBSD
2e9a56ad5SMark Murray.\"
3e9a56ad5SMark Murray.\" Copyright (c) 1994 David Burren
4e9a56ad5SMark Murray.\" All rights reserved.
5e9a56ad5SMark Murray.\"
6e9a56ad5SMark Murray.\" Redistribution and use in source and binary forms, with or without
7e9a56ad5SMark Murray.\" modification, are permitted provided that the following conditions
8e9a56ad5SMark Murray.\" are met:
9e9a56ad5SMark Murray.\" 1. Redistributions of source code must retain the above copyright
10e9a56ad5SMark Murray.\"    notice, this list of conditions and the following disclaimer.
11e9a56ad5SMark Murray.\" 2. Redistributions in binary form must reproduce the above copyright
12e9a56ad5SMark Murray.\"    notice, this list of conditions and the following disclaimer in the
13e9a56ad5SMark Murray.\"    documentation and/or other materials provided with the distribution.
14e9a56ad5SMark Murray.\" 4. Neither the name of the author nor the names of other contributors
15e9a56ad5SMark Murray.\"    may be used to endorse or promote products derived from this software
16e9a56ad5SMark Murray.\"    without specific prior written permission.
17e9a56ad5SMark Murray.\"
18e9a56ad5SMark Murray.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19e9a56ad5SMark Murray.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20e9a56ad5SMark Murray.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21e9a56ad5SMark Murray.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22e9a56ad5SMark Murray.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23e9a56ad5SMark Murray.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24e9a56ad5SMark Murray.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25e9a56ad5SMark Murray.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26e9a56ad5SMark Murray.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27e9a56ad5SMark Murray.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28e9a56ad5SMark Murray.\" SUCH DAMAGE.
29e9a56ad5SMark Murray.\"
30e9a56ad5SMark Murray.\"	$FreeBSD$
31e9a56ad5SMark Murray.\"
32e9a56ad5SMark Murray.\" Manual page, using -mandoc macros
33e9a56ad5SMark Murray.\"
34e9a56ad5SMark Murray.Dd January 19, 1997
35e9a56ad5SMark Murray.Dt CRYPT 3
36a307d598SRuslan Ermilov.Os
37e9a56ad5SMark Murray.Sh NAME
38e9a56ad5SMark Murray.Nm crypt
39e9a56ad5SMark Murray.Nd Trapdoor encryption
40f45f23ddSAlexey Zelkin.Sh LIBRARY
41f45f23ddSAlexey Zelkin.Lb libcrypt
42e9a56ad5SMark Murray.Sh SYNOPSIS
4332eef9aeSRuslan Ermilov.In unistd.h
44d3f0d184SBruce Evans.Ft char *
45d3f0d184SBruce Evans.Fn crypt "const char *key" "const char *salt"
4604c9749fSBrian Feldman.Ft const char *
4704c9749fSBrian Feldman.Fn crypt_get_format "void"
4804c9749fSBrian Feldman.Ft int
4904c9749fSBrian Feldman.Fn crypt_set_format "const char *string"
50e9a56ad5SMark Murray.Sh DESCRIPTION
51e9a56ad5SMark MurrayThe
52e9a56ad5SMark Murray.Fn crypt
53e9a56ad5SMark Murrayfunction performs password hashing with additional code added to
541a0a9345SRuslan Ermilovdeter key search attempts.
551a0a9345SRuslan ErmilovDifferent algorithms can be used to
56e9a56ad5SMark Murrayin the hash.
57e9a56ad5SMark Murray.\"
58e9a56ad5SMark Murray.\" NOTICE:
59e9a56ad5SMark Murray.\" If you add more algorithms, make sure to update this list
60e9a56ad5SMark Murray.\" and the default used for the Traditional format, below.
61e9a56ad5SMark Murray.\"
62e9a56ad5SMark MurrayCurrently these include the
63e9a56ad5SMark Murray.Tn NBS
64f45f23ddSAlexey Zelkin.Tn Data Encryption Standard (DES) ,
655c129616SMark Murray.Tn MD5
66bf513f69SMark Murrayhash,
67bf513f69SMark Murray.Tn NT-Hash
68bf513f69SMark Murray(compatible with Microsoft's NT scheme)
69f32b1300SKris Kennawayand
705c129616SMark Murray.Tn Blowfish .
7104c9749fSBrian FeldmanThe algorithm used will depend upon the format of the Salt (following
7204c9749fSBrian Feldmanthe Modular Crypt Format (MCF)), if
73f45f23ddSAlexey Zelkin.Tn DES
745c129616SMark Murrayand/or
755c129616SMark Murray.Tn Blowfish
7604c9749fSBrian Feldmanis installed or not, and whether
7704c9749fSBrian Feldman.Fn crypt_set_format
7804c9749fSBrian Feldmanhas been called to change the default.
79e9a56ad5SMark Murray.Pp
80e9a56ad5SMark MurrayThe first argument to
81f45f23ddSAlexey Zelkin.Nm
82e9a56ad5SMark Murrayis the data to hash (usually a password), in a
83e9a56ad5SMark Murray.Dv null Ns -terminated
84e9a56ad5SMark Murraystring.
85e9a56ad5SMark MurrayThe second is the salt, in one of three forms:
86e9a56ad5SMark Murray.Pp
87e9a56ad5SMark Murray.Bl -tag -width Traditional -compact -offset indent
88e9a56ad5SMark Murray.It Extended
89f45f23ddSAlexey ZelkinIf it begins with an underscore
90f45f23ddSAlexey Zelkin.Pq Dq _
91f45f23ddSAlexey Zelkinthen the
92f45f23ddSAlexey Zelkin.Tn DES
93f45f23ddSAlexey ZelkinExtended Format
94a910f192SDima Dorfmanis used in interpreting both the key and the salt, as outlined below.
95e9a56ad5SMark Murray.It Modular
96f45f23ddSAlexey ZelkinIf it begins with the string
97f45f23ddSAlexey Zelkin.Dq $digit$
98f45f23ddSAlexey Zelkinthen the Modular Crypt Format is used, as outlined below.
99e9a56ad5SMark Murray.It Traditional
100e9a56ad5SMark MurrayIf neither of the above is true, it assumes the Traditional Format,
101e9a56ad5SMark Murrayusing the entire string as the salt (or the first portion).
102e9a56ad5SMark Murray.El
103e9a56ad5SMark Murray.Pp
1041a0a9345SRuslan ErmilovAll routines are designed to be time-consuming.
1051a0a9345SRuslan ErmilovA brief test on a
106f45f23ddSAlexey Zelkin.Tn Pentium
107f45f23ddSAlexey Zelkin166/MMX shows the
108f45f23ddSAlexey Zelkin.Tn DES
109f45f23ddSAlexey Zelkincrypt to do approximately 2640 crypts
11000587201SMark Murraya CPU second and MD5 to do about 62 crypts a CPU second.
111e9a56ad5SMark Murray.Ss DES Extended Format:
112e9a56ad5SMark Murray.Pp
113e9a56ad5SMark MurrayThe
114e9a56ad5SMark Murray.Ar key
115e9a56ad5SMark Murrayis divided into groups of 8 characters (the last group is null-padded)
116a910f192SDima Dorfmanand the low-order 7 bits of each character (56 bits per group) are
117f45f23ddSAlexey Zelkinused to form the
118f45f23ddSAlexey Zelkin.Tn DES
119f45f23ddSAlexey Zelkinkey as follows:
120f45f23ddSAlexey Zelkinthe first group of 56 bits becomes the initial
121f45f23ddSAlexey Zelkin.Tn DES
122f45f23ddSAlexey Zelkinkey.
123f45f23ddSAlexey ZelkinFor each additional group, the XOR of the encryption of the current
124f45f23ddSAlexey Zelkin.Tn DES
125f45f23ddSAlexey Zelkinkey with itself and the group bits becomes the next
126f45f23ddSAlexey Zelkin.Tn DES
127f45f23ddSAlexey Zelkinkey.
128e9a56ad5SMark Murray.Pp
129e9a56ad5SMark MurrayThe salt is a 9-character array consisting of an underscore followed
130e9a56ad5SMark Murrayby 4 bytes of iteration count and 4 bytes of salt.
131e9a56ad5SMark MurrayThese are encoded as printable characters, 6 bits per character,
132e9a56ad5SMark Murrayleast significant character first.
133e9a56ad5SMark MurrayThe values 0 to 63 are encoded as ``./0-9A-Za-z''.
134e9a56ad5SMark MurrayThis allows 24 bits for both
135e9a56ad5SMark Murray.Fa count
136e9a56ad5SMark Murrayand
137e9a56ad5SMark Murray.Fa salt .
138e9a56ad5SMark Murray.Pp
139e9a56ad5SMark MurrayThe
140e9a56ad5SMark Murray.Fa salt
141e9a56ad5SMark Murrayintroduces disorder in the
142e9a56ad5SMark Murray.Tn DES
143e9a56ad5SMark Murrayalgorithm in one of 16777216 or 4096 possible ways
1441a0a9345SRuslan Ermilov(i.e., with 24 or 12 bits: if bit
145e9a56ad5SMark Murray.Em i
146e9a56ad5SMark Murrayof the
147e9a56ad5SMark Murray.Ar salt
148e9a56ad5SMark Murrayis set, then bits
149e9a56ad5SMark Murray.Em i
150e9a56ad5SMark Murrayand
151e9a56ad5SMark Murray.Em i+24
152e9a56ad5SMark Murrayare swapped in the
153e9a56ad5SMark Murray.Tn DES
154e9a56ad5SMark MurrayE-box output).
155e9a56ad5SMark Murray.Pp
156f45f23ddSAlexey ZelkinThe
157f45f23ddSAlexey Zelkin.Tn DES
158f45f23ddSAlexey Zelkinkey is used to encrypt a 64-bit constant using
159e9a56ad5SMark Murray.Ar count
160e9a56ad5SMark Murrayiterations of
161e9a56ad5SMark Murray.Tn DES .
162e9a56ad5SMark MurrayThe value returned is a
163e9a56ad5SMark Murray.Dv null Ns -terminated
164e9a56ad5SMark Murraystring, 20 or 13 bytes (plus null) in length, consisting of the
165e9a56ad5SMark Murray.Ar salt
166e9a56ad5SMark Murrayfollowed by the encoded 64-bit encryption.
167e9a56ad5SMark Murray.Ss "Modular" crypt:
168e9a56ad5SMark Murray.Pp
169e9a56ad5SMark MurrayIf the salt begins with the string
170e9a56ad5SMark Murray.Fa $digit$
1711a0a9345SRuslan Ermilovthen the Modular Crypt Format is used.
1721a0a9345SRuslan ErmilovThe
173e9a56ad5SMark Murray.Fa digit
1741a0a9345SRuslan Ermilovrepresents which algorithm is used in encryption.
1751a0a9345SRuslan ErmilovFollowing the token is
1761a0a9345SRuslan Ermilovthe actual salt to use in the encryption.
1771a0a9345SRuslan ErmilovThe length of the salt is limited
17896f68db5STom Rhodesto 8 characters--because the length of the returned output is also limited
1791a0a9345SRuslan Ermilov(_PASSWORD_LEN).
1801a0a9345SRuslan ErmilovThe salt must be terminated with the end of the string
1811a0a9345SRuslan Ermilov(NULL) or a dollar sign.
1821a0a9345SRuslan ErmilovAny characters after the dollar sign are ignored.
183e9a56ad5SMark Murray.Pp
184e9a56ad5SMark MurrayCurrently supported algorithms are:
185e9a56ad5SMark Murray.Pp
18642635956SRuslan Ermilov.Bl -enum -compact -offset indent
187067f2c3fSRuslan Ermilov.It
188e9a56ad5SMark MurrayMD5
189067f2c3fSRuslan Ermilov.It
1905c129616SMark MurrayBlowfish
191bf513f69SMark Murray.It
192bf513f69SMark MurrayNT-Hash
193e9a56ad5SMark Murray.El
194e9a56ad5SMark Murray.Pp
1951a0a9345SRuslan ErmilovOther crypt formats may be easily added.
1961a0a9345SRuslan ErmilovAn example salt would be:
197e9a56ad5SMark Murray.Bl -tag -offset indent
198bf513f69SMark Murray.It Cm "$4$thesalt$rest"
199e9a56ad5SMark Murray.El
200e9a56ad5SMark Murray.Pp
201e9a56ad5SMark Murray.Ss "Traditional" crypt:
202e9a56ad5SMark Murray.Pp
203f45f23ddSAlexey ZelkinThe algorithm used will depend upon whether
20404c9749fSBrian Feldman.Fn crypt_set_format
2059886bcdfSPeter Wemmhas been called and whether a global default format has been specified.
2069886bcdfSPeter WemmUnless a global default has been specified or
20704c9749fSBrian Feldman.Fn crypt_set_format
20888b471a1SPeter Wemmhas set the format to something else, the built-in default format is
20988b471a1SPeter Wemmused.
21088b471a1SPeter WemmThis is currently
211e9a56ad5SMark Murray.\"
212e9a56ad5SMark Murray.\" NOTICE: Also make sure to update this
213e9a56ad5SMark Murray.\"
21488b471a1SPeter WemmDES
21588b471a1SPeter Wemmif it is available, or MD5 if not.
216e9a56ad5SMark Murray.Pp
2171a0a9345SRuslan ErmilovHow the salt is used will depend upon the algorithm for the hash.
2181a0a9345SRuslan ErmilovFor
219e9a56ad5SMark Murraybest results, specify at least two characters of salt.
22004c9749fSBrian Feldman.Pp
22104c9749fSBrian FeldmanThe
22204c9749fSBrian Feldman.Fn crypt_get_format
22304c9749fSBrian Feldmanfunction returns a constant string that represents the name of the
22404c9749fSBrian Feldmanalgorithm currently used.
22504c9749fSBrian FeldmanValid values are
22604c9749fSBrian Feldman.\"
22704c9749fSBrian Feldman.\" NOTICE: Also make sure to update this, too, as well
22804c9749fSBrian Feldman.\"
2295c129616SMark Murray.Ql des ,
230bf513f69SMark Murray.Ql blf ,
231bf513f69SMark Murray.Ql md5
23204c9749fSBrian Feldmanand
233bf513f69SMark Murray.Ql nth .
23404c9749fSBrian Feldman.Pp
23504c9749fSBrian FeldmanThe
23604c9749fSBrian Feldman.Fn crypt_set_format
23704c9749fSBrian Feldmanfunction sets the default encoding format according to the supplied
23804c9749fSBrian Feldman.Fa string .
2399886bcdfSPeter Wemm.Pp
2409886bcdfSPeter WemmThe global default format can be set using the
2419886bcdfSPeter Wemm.Pa /etc/auth.conf
2429886bcdfSPeter Wemmfile using the
2433ea75eb1SRuslan Ermilov.Va crypt_default
2449886bcdfSPeter Wemmproperty.
245e9a56ad5SMark Murray.Sh RETURN VALUES
246e4f2c10bSPhilippe CharnierThe
247e9a56ad5SMark Murray.Fn crypt
248e4f2c10bSPhilippe Charnierfunction returns a pointer to the encrypted value on success, and NULL on
249e4f2c10bSPhilippe Charnierfailure.
250e9a56ad5SMark MurrayNote: this is not a standard behaviour, AT&T
251e9a56ad5SMark Murray.Fn crypt
252e9a56ad5SMark Murraywill always return a pointer to a string.
25304c9749fSBrian Feldman.Pp
254e4f2c10bSPhilippe CharnierThe
25504c9749fSBrian Feldman.Fn crypt_set_format
256e4f2c10bSPhilippe Charnierfunction will return 1 if the supplied encoding format was valid.
25704c9749fSBrian FeldmanOtherwise, a value of 0 is returned.
258e9a56ad5SMark Murray.Sh SEE ALSO
259e9a56ad5SMark Murray.Xr login 1 ,
260e9a56ad5SMark Murray.Xr passwd 1 ,
2619886bcdfSPeter Wemm.Xr auth_getval 3 ,
26200587201SMark Murray.Xr cipher 3 ,
263e9a56ad5SMark Murray.Xr getpass 3 ,
2649886bcdfSPeter Wemm.Xr auth.conf 5 ,
265eb894267SRuslan Ermilov.Xr passwd 5
266e9a56ad5SMark Murray.Sh HISTORY
267e9a56ad5SMark MurrayA rotor-based
268e9a56ad5SMark Murray.Fn crypt
269e9a56ad5SMark Murrayfunction appeared in
270e9a56ad5SMark Murray.At v6 .
271e9a56ad5SMark MurrayThe current style
272e9a56ad5SMark Murray.Fn crypt
273e9a56ad5SMark Murrayfirst appeared in
274e9a56ad5SMark Murray.At v7 .
275e9a56ad5SMark Murray.Pp
276f45f23ddSAlexey ZelkinThe
277f45f23ddSAlexey Zelkin.Tn DES
278f45f23ddSAlexey Zelkinsection of the code (FreeSec 1.0) was developed outside the United
279f45f23ddSAlexey ZelkinStates of America as an unencumbered replacement for the U.S.-only
280f45f23ddSAlexey Zelkin.Nx
281e9a56ad5SMark Murraylibcrypt encryption library.
282e9a56ad5SMark Murray.Sh AUTHORS
283725ab628SRuslan Ermilov.An -nosplit
284f45f23ddSAlexey ZelkinOriginally written by
285f45f23ddSAlexey Zelkin.An David Burren Aq davidb@werj.com.au ,
286f45f23ddSAlexey Zelkinlater additions and changes by
287725ab628SRuslan Ermilov.An Poul-Henning Kamp ,
28804c9749fSBrian Feldman.An Mark R V Murray ,
289bf513f69SMark Murray.An Michael Bretterklieber ,
2905c129616SMark Murray.An Kris Kennaway ,
2915c129616SMark Murray.An Brian Feldman ,
2925c129616SMark Murray.An Paul Herman
29304c9749fSBrian Feldmanand
2945c129616SMark Murray.An Niels Provos .
29524a0682cSRuslan Ermilov.Sh BUGS
29624a0682cSRuslan ErmilovThe
29724a0682cSRuslan Ermilov.Fn crypt
29824a0682cSRuslan Ermilovfunction returns a pointer to static data, and subsequent calls to
29924a0682cSRuslan Ermilov.Fn crypt
30024a0682cSRuslan Ermilovwill modify the same data.
30124a0682cSRuslan ErmilovLikewise,
30224a0682cSRuslan Ermilov.Fn crypt_set_format
30324a0682cSRuslan Ermilovmodifies static data.
30424a0682cSRuslan Ermilov.Pp
30524a0682cSRuslan ErmilovThe NT-hash scheme does not use a salt,
30624a0682cSRuslan Ermilovand is not hard
30724a0682cSRuslan Ermilovfor a competent attacker
30824a0682cSRuslan Ermilovto break.
30924a0682cSRuslan ErmilovIts use is not recommended.
310