xref: /freebsd/lib/libcrypt/crypt.3 (revision fbbd9655e5107c68e4e0146ff22b73d7350475bc)
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.
14*fbbd9655SWarner Losh.\" 3. 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.\"
325f521d7bSEd Schouten.Dd August 10, 2016
33e9a56ad5SMark Murray.Dt CRYPT 3
34a307d598SRuslan Ermilov.Os
35e9a56ad5SMark Murray.Sh NAME
36e9a56ad5SMark Murray.Nm crypt
37e9a56ad5SMark Murray.Nd Trapdoor encryption
38f45f23ddSAlexey Zelkin.Sh LIBRARY
39f45f23ddSAlexey Zelkin.Lb libcrypt
40e9a56ad5SMark Murray.Sh SYNOPSIS
4132eef9aeSRuslan Ermilov.In unistd.h
42d3f0d184SBruce Evans.Ft char *
43d3f0d184SBruce Evans.Fn crypt "const char *key" "const char *salt"
445f521d7bSEd Schouten.Ft char *
455f521d7bSEd Schouten.Fn crypt_r "const char *key" "const char *salt" "struct crypt_data *data"
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
6841f55496SJohn-Mark Gurney.Pq compatible with Microsoft's NT scheme
69f32b1300SKris Kennawayand
705c129616SMark Murray.Tn Blowfish .
7141f55496SJohn-Mark GurneyThe algorithm used will depend upon the format of the Salt
7241f55496SJohn-Mark Gurney.Po
7341f55496SJohn-Mark Gurneyfollowing
7441f55496SJohn-Mark Gurneythe Modular Crypt Format
7541f55496SJohn-Mark Gurney.Pq MCF
7641f55496SJohn-Mark Gurney.Pc ,
7741f55496SJohn-Mark Gurneyif
78f45f23ddSAlexey Zelkin.Tn DES
795c129616SMark Murrayand/or
805c129616SMark Murray.Tn Blowfish
8104c9749fSBrian Feldmanis installed or not, and whether
8204c9749fSBrian Feldman.Fn crypt_set_format
8304c9749fSBrian Feldmanhas been called to change the default.
84e9a56ad5SMark Murray.Pp
85e9a56ad5SMark MurrayThe first argument to
86f45f23ddSAlexey Zelkin.Nm
8741f55496SJohn-Mark Gurneyis the data to hash
8841f55496SJohn-Mark Gurney.Pq usually a password ,
8941f55496SJohn-Mark Gurneyin a
9041f55496SJohn-Mark Gurney.Dv NUL Ns -terminated
91e9a56ad5SMark Murraystring.
92e9a56ad5SMark MurrayThe second is the salt, in one of three forms:
93e9a56ad5SMark Murray.Pp
94e9a56ad5SMark Murray.Bl -tag -width Traditional -compact -offset indent
95e9a56ad5SMark Murray.It Extended
96f45f23ddSAlexey ZelkinIf it begins with an underscore
97f45f23ddSAlexey Zelkin.Pq Dq _
98f45f23ddSAlexey Zelkinthen the
99f45f23ddSAlexey Zelkin.Tn DES
100f45f23ddSAlexey ZelkinExtended Format
101a910f192SDima Dorfmanis used in interpreting both the key and the salt, as outlined below.
102e9a56ad5SMark Murray.It Modular
103f45f23ddSAlexey ZelkinIf it begins with the string
104f45f23ddSAlexey Zelkin.Dq $digit$
105f45f23ddSAlexey Zelkinthen the Modular Crypt Format is used, as outlined below.
106e9a56ad5SMark Murray.It Traditional
107e9a56ad5SMark MurrayIf neither of the above is true, it assumes the Traditional Format,
10841f55496SJohn-Mark Gurneyusing the entire string as the salt
10941f55496SJohn-Mark Gurney.Pq or the first portion .
110e9a56ad5SMark Murray.El
111e9a56ad5SMark Murray.Pp
1121a0a9345SRuslan ErmilovAll routines are designed to be time-consuming.
113e9a56ad5SMark Murray.Ss DES Extended Format:
114e9a56ad5SMark MurrayThe
115e9a56ad5SMark Murray.Ar key
11641f55496SJohn-Mark Gurneyis divided into groups of 8 characters
11741f55496SJohn-Mark Gurney.Pq the last group is NUL-padded
11841f55496SJohn-Mark Gurneyand the low-order 7 bits of each character
11941f55496SJohn-Mark Gurney.Pq 56 bits per group
12041f55496SJohn-Mark Gurneyare used to form the
121f45f23ddSAlexey Zelkin.Tn DES
122f45f23ddSAlexey Zelkinkey as follows:
123f45f23ddSAlexey Zelkinthe first group of 56 bits becomes the initial
124f45f23ddSAlexey Zelkin.Tn DES
125f45f23ddSAlexey Zelkinkey.
126f45f23ddSAlexey ZelkinFor each additional group, the XOR of the encryption of the current
127f45f23ddSAlexey Zelkin.Tn DES
128f45f23ddSAlexey Zelkinkey with itself and the group bits becomes the next
129f45f23ddSAlexey Zelkin.Tn DES
130f45f23ddSAlexey Zelkinkey.
131e9a56ad5SMark Murray.Pp
132e9a56ad5SMark MurrayThe salt is a 9-character array consisting of an underscore followed
133e9a56ad5SMark Murrayby 4 bytes of iteration count and 4 bytes of salt.
134e9a56ad5SMark MurrayThese are encoded as printable characters, 6 bits per character,
135e9a56ad5SMark Murrayleast significant character first.
13641f55496SJohn-Mark GurneyThe values 0 to 63 are encoded as
13741f55496SJohn-Mark Gurney.Dq ./0-9A-Za-z .
138e9a56ad5SMark MurrayThis allows 24 bits for both
139e9a56ad5SMark Murray.Fa count
140e9a56ad5SMark Murrayand
141e9a56ad5SMark Murray.Fa salt .
142e9a56ad5SMark Murray.Pp
143e9a56ad5SMark MurrayThe
144e9a56ad5SMark Murray.Fa salt
145e9a56ad5SMark Murrayintroduces disorder in the
146e9a56ad5SMark Murray.Tn DES
147e9a56ad5SMark Murrayalgorithm in one of 16777216 or 4096 possible ways
14841f55496SJohn-Mark Gurney.Po
14941f55496SJohn-Mark Gurneyi.e., with 24 or 12 bits: if bit
150e9a56ad5SMark Murray.Em i
151e9a56ad5SMark Murrayof the
152e9a56ad5SMark Murray.Ar salt
153e9a56ad5SMark Murrayis set, then bits
154e9a56ad5SMark Murray.Em i
155e9a56ad5SMark Murrayand
156e9a56ad5SMark Murray.Em i+24
157e9a56ad5SMark Murrayare swapped in the
158e9a56ad5SMark Murray.Tn DES
15941f55496SJohn-Mark GurneyE-box output
16041f55496SJohn-Mark Gurney.Pc .
161e9a56ad5SMark Murray.Pp
162f45f23ddSAlexey ZelkinThe
163f45f23ddSAlexey Zelkin.Tn DES
164f45f23ddSAlexey Zelkinkey is used to encrypt a 64-bit constant using
165e9a56ad5SMark Murray.Ar count
166e9a56ad5SMark Murrayiterations of
167e9a56ad5SMark Murray.Tn DES .
168e9a56ad5SMark MurrayThe value returned is a
16941f55496SJohn-Mark Gurney.Dv NUL Ns -terminated
17041f55496SJohn-Mark Gurneystring, 20 or 13 bytes
17141f55496SJohn-Mark Gurney.Pq plus NUL
17241f55496SJohn-Mark Gurneyin length, consisting of the
173e9a56ad5SMark Murray.Ar salt
174e9a56ad5SMark Murrayfollowed by the encoded 64-bit encryption.
17541f55496SJohn-Mark Gurney.Ss Modular crypt:
176e9a56ad5SMark MurrayIf the salt begins with the string
177e9a56ad5SMark Murray.Fa $digit$
1781a0a9345SRuslan Ermilovthen the Modular Crypt Format is used.
1791a0a9345SRuslan ErmilovThe
180e9a56ad5SMark Murray.Fa digit
1811a0a9345SRuslan Ermilovrepresents which algorithm is used in encryption.
1821a0a9345SRuslan ErmilovFollowing the token is
1831a0a9345SRuslan Ermilovthe actual salt to use in the encryption.
18441f55496SJohn-Mark GurneyThe maximum length of the salt used depends upon the module.
18541f55496SJohn-Mark GurneyThe salt must be terminated with the end of the string character
18641f55496SJohn-Mark Gurney.Pq NUL
18741f55496SJohn-Mark Gurneyor a dollar sign.
1881a0a9345SRuslan ErmilovAny characters after the dollar sign are ignored.
189e9a56ad5SMark Murray.Pp
190e9a56ad5SMark MurrayCurrently supported algorithms are:
191e9a56ad5SMark Murray.Pp
19242635956SRuslan Ermilov.Bl -enum -compact -offset indent
193067f2c3fSRuslan Ermilov.It
194e9a56ad5SMark MurrayMD5
195067f2c3fSRuslan Ermilov.It
1965c129616SMark MurrayBlowfish
197bf513f69SMark Murray.It
198bf513f69SMark MurrayNT-Hash
199a5c28e29SMark Murray.It
200b54c79e1SEitan Adler(unused)
201b54c79e1SEitan Adler.It
202a5c28e29SMark MurraySHA-256
203a5c28e29SMark Murray.It
204a5c28e29SMark MurraySHA-512
205e9a56ad5SMark Murray.El
206e9a56ad5SMark Murray.Pp
2071a0a9345SRuslan ErmilovOther crypt formats may be easily added.
2081a0a9345SRuslan ErmilovAn example salt would be:
2099ee2158bSJoel Dahl.Bl -tag -width 6n -offset indent
210bf513f69SMark Murray.It Cm "$4$thesalt$rest"
211e9a56ad5SMark Murray.El
21241f55496SJohn-Mark Gurney.Ss Traditional crypt:
213f45f23ddSAlexey ZelkinThe algorithm used will depend upon whether
21404c9749fSBrian Feldman.Fn crypt_set_format
2159886bcdfSPeter Wemmhas been called and whether a global default format has been specified.
2169886bcdfSPeter WemmUnless a global default has been specified or
21704c9749fSBrian Feldman.Fn crypt_set_format
21888b471a1SPeter Wemmhas set the format to something else, the built-in default format is
21988b471a1SPeter Wemmused.
22088b471a1SPeter WemmThis is currently
221e9a56ad5SMark Murray.\"
222e9a56ad5SMark Murray.\" NOTICE: Also make sure to update this
223e9a56ad5SMark Murray.\"
22488b471a1SPeter WemmDES
22588b471a1SPeter Wemmif it is available, or MD5 if not.
226e9a56ad5SMark Murray.Pp
2271a0a9345SRuslan ErmilovHow the salt is used will depend upon the algorithm for the hash.
2281a0a9345SRuslan ErmilovFor
22941f55496SJohn-Mark Gurneybest results, specify at least eight characters of salt.
23004c9749fSBrian Feldman.Pp
23104c9749fSBrian FeldmanThe
23204c9749fSBrian Feldman.Fn crypt_get_format
23304c9749fSBrian Feldmanfunction returns a constant string that represents the name of the
23404c9749fSBrian Feldmanalgorithm currently used.
23504c9749fSBrian FeldmanValid values are
23604c9749fSBrian Feldman.\"
23704c9749fSBrian Feldman.\" NOTICE: Also make sure to update this, too, as well
23804c9749fSBrian Feldman.\"
2395c129616SMark Murray.Ql des ,
240bf513f69SMark Murray.Ql blf ,
241a5c28e29SMark Murray.Ql md5 ,
242a5c28e29SMark Murray.Ql sha256 ,
243a5c28e29SMark Murray.Ql sha512
24404c9749fSBrian Feldmanand
245bf513f69SMark Murray.Ql nth .
24604c9749fSBrian Feldman.Pp
24704c9749fSBrian FeldmanThe
24804c9749fSBrian Feldman.Fn crypt_set_format
24904c9749fSBrian Feldmanfunction sets the default encoding format according to the supplied
25004c9749fSBrian Feldman.Fa string .
2515f521d7bSEd Schouten.Pp
2525f521d7bSEd SchoutenThe
2535f521d7bSEd Schouten.Fn crypt_r
2545f521d7bSEd Schoutenfunction behaves identically to
2555f521d7bSEd Schouten.Fn crypt ,
2565f521d7bSEd Schoutenexcept that the resulting string is stored in
2575f521d7bSEd Schouten.Fa data ,
2585f521d7bSEd Schoutenmaking it thread-safe.
259e9a56ad5SMark Murray.Sh RETURN VALUES
260e4f2c10bSPhilippe CharnierThe
261e9a56ad5SMark Murray.Fn crypt
2625f521d7bSEd Schoutenand
2635f521d7bSEd Schouten.Fn crypt_r
2645f521d7bSEd Schoutenfunctions return a pointer to the encrypted value on success, and NULL on
265e4f2c10bSPhilippe Charnierfailure.
266e9a56ad5SMark MurrayNote: this is not a standard behaviour, AT&T
267e9a56ad5SMark Murray.Fn crypt
268e9a56ad5SMark Murraywill always return a pointer to a string.
26904c9749fSBrian Feldman.Pp
270e4f2c10bSPhilippe CharnierThe
27104c9749fSBrian Feldman.Fn crypt_set_format
272e4f2c10bSPhilippe Charnierfunction will return 1 if the supplied encoding format was valid.
27304c9749fSBrian FeldmanOtherwise, a value of 0 is returned.
274e9a56ad5SMark Murray.Sh SEE ALSO
275e9a56ad5SMark Murray.Xr login 1 ,
276e9a56ad5SMark Murray.Xr passwd 1 ,
277e9a56ad5SMark Murray.Xr getpass 3 ,
278eb894267SRuslan Ermilov.Xr passwd 5
279e9a56ad5SMark Murray.Sh HISTORY
280e9a56ad5SMark MurrayA rotor-based
281e9a56ad5SMark Murray.Fn crypt
282e9a56ad5SMark Murrayfunction appeared in
283e9a56ad5SMark Murray.At v6 .
284e9a56ad5SMark MurrayThe current style
285e9a56ad5SMark Murray.Fn crypt
286e9a56ad5SMark Murrayfirst appeared in
287e9a56ad5SMark Murray.At v7 .
288e9a56ad5SMark Murray.Pp
289f45f23ddSAlexey ZelkinThe
290f45f23ddSAlexey Zelkin.Tn DES
291f45f23ddSAlexey Zelkinsection of the code (FreeSec 1.0) was developed outside the United
292f45f23ddSAlexey ZelkinStates of America as an unencumbered replacement for the U.S.-only
293f45f23ddSAlexey Zelkin.Nx
294e9a56ad5SMark Murraylibcrypt encryption library.
2955f521d7bSEd Schouten.Pp
2965f521d7bSEd SchoutenThe
2975f521d7bSEd Schouten.Fn crypt_r
2985f521d7bSEd Schoutenfunction was added in
2995f521d7bSEd Schouten.Fx 12.0 .
300e9a56ad5SMark Murray.Sh AUTHORS
301725ab628SRuslan Ermilov.An -nosplit
302f45f23ddSAlexey ZelkinOriginally written by
3032b7af31cSBaptiste Daroussin.An David Burren Aq Mt davidb@werj.com.au ,
304f45f23ddSAlexey Zelkinlater additions and changes by
305725ab628SRuslan Ermilov.An Poul-Henning Kamp ,
30604c9749fSBrian Feldman.An Mark R V Murray ,
307bf513f69SMark Murray.An Michael Bretterklieber ,
3085c129616SMark Murray.An Kris Kennaway ,
3095c129616SMark Murray.An Brian Feldman ,
3105c129616SMark Murray.An Paul Herman
31104c9749fSBrian Feldmanand
3125c129616SMark Murray.An Niels Provos .
31324a0682cSRuslan Ermilov.Sh BUGS
31424a0682cSRuslan ErmilovThe
31524a0682cSRuslan Ermilov.Fn crypt
31624a0682cSRuslan Ermilovfunction returns a pointer to static data, and subsequent calls to
31724a0682cSRuslan Ermilov.Fn crypt
31824a0682cSRuslan Ermilovwill modify the same data.
31924a0682cSRuslan ErmilovLikewise,
32024a0682cSRuslan Ermilov.Fn crypt_set_format
32124a0682cSRuslan Ermilovmodifies static data.
32224a0682cSRuslan Ermilov.Pp
32324a0682cSRuslan ErmilovThe NT-hash scheme does not use a salt,
32424a0682cSRuslan Ermilovand is not hard
32524a0682cSRuslan Ermilovfor a competent attacker
32624a0682cSRuslan Ermilovto break.
32724a0682cSRuslan ErmilovIts use is not recommended.
328