passwd.c revision 1.1.1.1.2.2 1 1.1.1.1.2.2 yamt /* $OpenLDAP: pkg/ldap/libraries/liblutil/passwd.c,v 1.104.2.4 2008/02/11 23:26:42 kurt Exp $ */
2 1.1.1.1.2.2 yamt /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
3 1.1.1.1.2.2 yamt *
4 1.1.1.1.2.2 yamt * Copyright 1998-2008 The OpenLDAP Foundation.
5 1.1.1.1.2.2 yamt * All rights reserved.
6 1.1.1.1.2.2 yamt *
7 1.1.1.1.2.2 yamt * Redistribution and use in source and binary forms, with or without
8 1.1.1.1.2.2 yamt * modification, are permitted only as authorized by the OpenLDAP
9 1.1.1.1.2.2 yamt * Public License.
10 1.1.1.1.2.2 yamt *
11 1.1.1.1.2.2 yamt * A copy of this license is available in the file LICENSE in the
12 1.1.1.1.2.2 yamt * top-level directory of the distribution or, alternatively, at
13 1.1.1.1.2.2 yamt * <http://www.OpenLDAP.org/license.html>.
14 1.1.1.1.2.2 yamt */
15 1.1.1.1.2.2 yamt
16 1.1.1.1.2.2 yamt /*
17 1.1.1.1.2.2 yamt * int lutil_passwd(
18 1.1.1.1.2.2 yamt * const struct berval *passwd,
19 1.1.1.1.2.2 yamt * const struct berval *cred,
20 1.1.1.1.2.2 yamt * const char **schemes )
21 1.1.1.1.2.2 yamt *
22 1.1.1.1.2.2 yamt * Returns true if user supplied credentials (cred) matches
23 1.1.1.1.2.2 yamt * the stored password (passwd).
24 1.1.1.1.2.2 yamt *
25 1.1.1.1.2.2 yamt * Due to the use of the crypt(3) function
26 1.1.1.1.2.2 yamt * this routine is NOT thread-safe.
27 1.1.1.1.2.2 yamt */
28 1.1.1.1.2.2 yamt
29 1.1.1.1.2.2 yamt #include "portable.h"
30 1.1.1.1.2.2 yamt
31 1.1.1.1.2.2 yamt #include <stdio.h>
32 1.1.1.1.2.2 yamt #include <ac/stdlib.h>
33 1.1.1.1.2.2 yamt #include <ac/string.h>
34 1.1.1.1.2.2 yamt #include <ac/unistd.h>
35 1.1.1.1.2.2 yamt
36 1.1.1.1.2.2 yamt #if defined(SLAPD_LMHASH)
37 1.1.1.1.2.2 yamt # include <openssl/des.h>
38 1.1.1.1.2.2 yamt #endif /* SLAPD_LMHASH */
39 1.1.1.1.2.2 yamt
40 1.1.1.1.2.2 yamt #include <ac/param.h>
41 1.1.1.1.2.2 yamt
42 1.1.1.1.2.2 yamt #ifdef SLAPD_CRYPT
43 1.1.1.1.2.2 yamt # include <ac/crypt.h>
44 1.1.1.1.2.2 yamt
45 1.1.1.1.2.2 yamt # if defined( HAVE_GETPWNAM ) && defined( HAVE_STRUCT_PASSWD_PW_PASSWD )
46 1.1.1.1.2.2 yamt # ifdef HAVE_SHADOW_H
47 1.1.1.1.2.2 yamt # include <shadow.h>
48 1.1.1.1.2.2 yamt # endif
49 1.1.1.1.2.2 yamt # ifdef HAVE_PWD_H
50 1.1.1.1.2.2 yamt # include <pwd.h>
51 1.1.1.1.2.2 yamt # endif
52 1.1.1.1.2.2 yamt # ifdef HAVE_AIX_SECURITY
53 1.1.1.1.2.2 yamt # include <userpw.h>
54 1.1.1.1.2.2 yamt # endif
55 1.1.1.1.2.2 yamt # endif
56 1.1.1.1.2.2 yamt #endif
57 1.1.1.1.2.2 yamt
58 1.1.1.1.2.2 yamt #include <lber.h>
59 1.1.1.1.2.2 yamt
60 1.1.1.1.2.2 yamt #include "ldap_pvt.h"
61 1.1.1.1.2.2 yamt #include "lber_pvt.h"
62 1.1.1.1.2.2 yamt
63 1.1.1.1.2.2 yamt #include "lutil_md5.h"
64 1.1.1.1.2.2 yamt #include "lutil_sha1.h"
65 1.1.1.1.2.2 yamt #include "lutil.h"
66 1.1.1.1.2.2 yamt
67 1.1.1.1.2.2 yamt static const unsigned char crypt64[] =
68 1.1.1.1.2.2 yamt "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890./";
69 1.1.1.1.2.2 yamt
70 1.1.1.1.2.2 yamt #ifdef SLAPD_CRYPT
71 1.1.1.1.2.2 yamt static char *salt_format = NULL;
72 1.1.1.1.2.2 yamt static lutil_cryptfunc lutil_crypt;
73 1.1.1.1.2.2 yamt lutil_cryptfunc *lutil_cryptptr = lutil_crypt;
74 1.1.1.1.2.2 yamt #endif
75 1.1.1.1.2.2 yamt
76 1.1.1.1.2.2 yamt /* KLUDGE:
77 1.1.1.1.2.2 yamt * chk_fn is NULL iff name is {CLEARTEXT}
78 1.1.1.1.2.2 yamt * otherwise, things will break
79 1.1.1.1.2.2 yamt */
80 1.1.1.1.2.2 yamt struct pw_scheme {
81 1.1.1.1.2.2 yamt struct berval name;
82 1.1.1.1.2.2 yamt LUTIL_PASSWD_CHK_FUNC *chk_fn;
83 1.1.1.1.2.2 yamt LUTIL_PASSWD_HASH_FUNC *hash_fn;
84 1.1.1.1.2.2 yamt };
85 1.1.1.1.2.2 yamt
86 1.1.1.1.2.2 yamt struct pw_slist {
87 1.1.1.1.2.2 yamt struct pw_slist *next;
88 1.1.1.1.2.2 yamt struct pw_scheme s;
89 1.1.1.1.2.2 yamt };
90 1.1.1.1.2.2 yamt
91 1.1.1.1.2.2 yamt /* password check routines */
92 1.1.1.1.2.2 yamt
93 1.1.1.1.2.2 yamt #define SALT_SIZE 4
94 1.1.1.1.2.2 yamt
95 1.1.1.1.2.2 yamt static LUTIL_PASSWD_CHK_FUNC chk_md5;
96 1.1.1.1.2.2 yamt static LUTIL_PASSWD_CHK_FUNC chk_smd5;
97 1.1.1.1.2.2 yamt static LUTIL_PASSWD_HASH_FUNC hash_smd5;
98 1.1.1.1.2.2 yamt static LUTIL_PASSWD_HASH_FUNC hash_md5;
99 1.1.1.1.2.2 yamt
100 1.1.1.1.2.2 yamt
101 1.1.1.1.2.2 yamt #ifdef LUTIL_SHA1_BYTES
102 1.1.1.1.2.2 yamt static LUTIL_PASSWD_CHK_FUNC chk_ssha1;
103 1.1.1.1.2.2 yamt static LUTIL_PASSWD_CHK_FUNC chk_sha1;
104 1.1.1.1.2.2 yamt static LUTIL_PASSWD_HASH_FUNC hash_sha1;
105 1.1.1.1.2.2 yamt static LUTIL_PASSWD_HASH_FUNC hash_ssha1;
106 1.1.1.1.2.2 yamt #endif
107 1.1.1.1.2.2 yamt
108 1.1.1.1.2.2 yamt #ifdef SLAPD_LMHASH
109 1.1.1.1.2.2 yamt static LUTIL_PASSWD_CHK_FUNC chk_lanman;
110 1.1.1.1.2.2 yamt static LUTIL_PASSWD_HASH_FUNC hash_lanman;
111 1.1.1.1.2.2 yamt #endif
112 1.1.1.1.2.2 yamt
113 1.1.1.1.2.2 yamt #ifdef SLAPD_CRYPT
114 1.1.1.1.2.2 yamt static LUTIL_PASSWD_CHK_FUNC chk_crypt;
115 1.1.1.1.2.2 yamt static LUTIL_PASSWD_HASH_FUNC hash_crypt;
116 1.1.1.1.2.2 yamt
117 1.1.1.1.2.2 yamt #if defined( HAVE_GETPWNAM ) && defined( HAVE_STRUCT_PASSWD_PW_PASSWD )
118 1.1.1.1.2.2 yamt static LUTIL_PASSWD_CHK_FUNC chk_unix;
119 1.1.1.1.2.2 yamt #endif
120 1.1.1.1.2.2 yamt #endif
121 1.1.1.1.2.2 yamt
122 1.1.1.1.2.2 yamt /* password hash routines */
123 1.1.1.1.2.2 yamt
124 1.1.1.1.2.2 yamt #ifdef SLAPD_CLEARTEXT
125 1.1.1.1.2.2 yamt static LUTIL_PASSWD_HASH_FUNC hash_clear;
126 1.1.1.1.2.2 yamt #endif
127 1.1.1.1.2.2 yamt
128 1.1.1.1.2.2 yamt static struct pw_slist *pw_schemes;
129 1.1.1.1.2.2 yamt static int pw_inited;
130 1.1.1.1.2.2 yamt
131 1.1.1.1.2.2 yamt static const struct pw_scheme pw_schemes_default[] =
132 1.1.1.1.2.2 yamt {
133 1.1.1.1.2.2 yamt #ifdef LUTIL_SHA1_BYTES
134 1.1.1.1.2.2 yamt { BER_BVC("{SSHA}"), chk_ssha1, hash_ssha1 },
135 1.1.1.1.2.2 yamt { BER_BVC("{SHA}"), chk_sha1, hash_sha1 },
136 1.1.1.1.2.2 yamt #endif
137 1.1.1.1.2.2 yamt
138 1.1.1.1.2.2 yamt { BER_BVC("{SMD5}"), chk_smd5, hash_smd5 },
139 1.1.1.1.2.2 yamt { BER_BVC("{MD5}"), chk_md5, hash_md5 },
140 1.1.1.1.2.2 yamt
141 1.1.1.1.2.2 yamt #ifdef SLAPD_LMHASH
142 1.1.1.1.2.2 yamt { BER_BVC("{LANMAN}"), chk_lanman, hash_lanman },
143 1.1.1.1.2.2 yamt #endif /* SLAPD_LMHASH */
144 1.1.1.1.2.2 yamt
145 1.1.1.1.2.2 yamt #ifdef SLAPD_CRYPT
146 1.1.1.1.2.2 yamt { BER_BVC("{CRYPT}"), chk_crypt, hash_crypt },
147 1.1.1.1.2.2 yamt # if defined( HAVE_GETPWNAM ) && defined( HAVE_STRUCT_PASSWD_PW_PASSWD )
148 1.1.1.1.2.2 yamt { BER_BVC("{UNIX}"), chk_unix, NULL },
149 1.1.1.1.2.2 yamt # endif
150 1.1.1.1.2.2 yamt #endif
151 1.1.1.1.2.2 yamt
152 1.1.1.1.2.2 yamt #ifdef SLAPD_CLEARTEXT
153 1.1.1.1.2.2 yamt /* pseudo scheme */
154 1.1.1.1.2.2 yamt { BER_BVC("{CLEARTEXT}"), NULL, hash_clear },
155 1.1.1.1.2.2 yamt #endif
156 1.1.1.1.2.2 yamt
157 1.1.1.1.2.2 yamt { BER_BVNULL, NULL, NULL }
158 1.1.1.1.2.2 yamt };
159 1.1.1.1.2.2 yamt
160 1.1.1.1.2.2 yamt int lutil_passwd_add(
161 1.1.1.1.2.2 yamt struct berval *scheme,
162 1.1.1.1.2.2 yamt LUTIL_PASSWD_CHK_FUNC *chk,
163 1.1.1.1.2.2 yamt LUTIL_PASSWD_HASH_FUNC *hash )
164 1.1.1.1.2.2 yamt {
165 1.1.1.1.2.2 yamt struct pw_slist *ptr;
166 1.1.1.1.2.2 yamt
167 1.1.1.1.2.2 yamt if (!pw_inited) lutil_passwd_init();
168 1.1.1.1.2.2 yamt
169 1.1.1.1.2.2 yamt ptr = ber_memalloc( sizeof( struct pw_slist ));
170 1.1.1.1.2.2 yamt if (!ptr) return -1;
171 1.1.1.1.2.2 yamt ptr->next = pw_schemes;
172 1.1.1.1.2.2 yamt ptr->s.name = *scheme;
173 1.1.1.1.2.2 yamt ptr->s.chk_fn = chk;
174 1.1.1.1.2.2 yamt ptr->s.hash_fn = hash;
175 1.1.1.1.2.2 yamt pw_schemes = ptr;
176 1.1.1.1.2.2 yamt return 0;
177 1.1.1.1.2.2 yamt }
178 1.1.1.1.2.2 yamt
179 1.1.1.1.2.2 yamt void lutil_passwd_init()
180 1.1.1.1.2.2 yamt {
181 1.1.1.1.2.2 yamt struct pw_scheme *s;
182 1.1.1.1.2.2 yamt
183 1.1.1.1.2.2 yamt pw_inited = 1;
184 1.1.1.1.2.2 yamt
185 1.1.1.1.2.2 yamt for( s=(struct pw_scheme *)pw_schemes_default; s->name.bv_val; s++) {
186 1.1.1.1.2.2 yamt if ( lutil_passwd_add( &s->name, s->chk_fn, s->hash_fn ) ) break;
187 1.1.1.1.2.2 yamt }
188 1.1.1.1.2.2 yamt }
189 1.1.1.1.2.2 yamt
190 1.1.1.1.2.2 yamt void lutil_passwd_destroy()
191 1.1.1.1.2.2 yamt {
192 1.1.1.1.2.2 yamt struct pw_slist *ptr, *next;
193 1.1.1.1.2.2 yamt
194 1.1.1.1.2.2 yamt for( ptr=pw_schemes; ptr; ptr=next ) {
195 1.1.1.1.2.2 yamt next = ptr->next;
196 1.1.1.1.2.2 yamt ber_memfree( ptr );
197 1.1.1.1.2.2 yamt }
198 1.1.1.1.2.2 yamt }
199 1.1.1.1.2.2 yamt
200 1.1.1.1.2.2 yamt static const struct pw_scheme *get_scheme(
201 1.1.1.1.2.2 yamt const char* scheme )
202 1.1.1.1.2.2 yamt {
203 1.1.1.1.2.2 yamt struct pw_slist *pws;
204 1.1.1.1.2.2 yamt struct berval bv;
205 1.1.1.1.2.2 yamt
206 1.1.1.1.2.2 yamt if (!pw_inited) lutil_passwd_init();
207 1.1.1.1.2.2 yamt
208 1.1.1.1.2.2 yamt bv.bv_val = strchr( scheme, '}' );
209 1.1.1.1.2.2 yamt if ( !bv.bv_val )
210 1.1.1.1.2.2 yamt return NULL;
211 1.1.1.1.2.2 yamt
212 1.1.1.1.2.2 yamt bv.bv_len = bv.bv_val - scheme + 1;
213 1.1.1.1.2.2 yamt bv.bv_val = (char *) scheme;
214 1.1.1.1.2.2 yamt
215 1.1.1.1.2.2 yamt for( pws=pw_schemes; pws; pws=pws->next ) {
216 1.1.1.1.2.2 yamt if ( ber_bvstrcasecmp(&bv, &pws->s.name ) == 0 ) {
217 1.1.1.1.2.2 yamt return &(pws->s);
218 1.1.1.1.2.2 yamt }
219 1.1.1.1.2.2 yamt }
220 1.1.1.1.2.2 yamt
221 1.1.1.1.2.2 yamt return NULL;
222 1.1.1.1.2.2 yamt }
223 1.1.1.1.2.2 yamt
224 1.1.1.1.2.2 yamt int lutil_passwd_scheme(
225 1.1.1.1.2.2 yamt const char* scheme )
226 1.1.1.1.2.2 yamt {
227 1.1.1.1.2.2 yamt if( scheme == NULL ) {
228 1.1.1.1.2.2 yamt return 0;
229 1.1.1.1.2.2 yamt }
230 1.1.1.1.2.2 yamt
231 1.1.1.1.2.2 yamt return get_scheme(scheme) != NULL;
232 1.1.1.1.2.2 yamt }
233 1.1.1.1.2.2 yamt
234 1.1.1.1.2.2 yamt
235 1.1.1.1.2.2 yamt static int is_allowed_scheme(
236 1.1.1.1.2.2 yamt const char* scheme,
237 1.1.1.1.2.2 yamt const char** schemes )
238 1.1.1.1.2.2 yamt {
239 1.1.1.1.2.2 yamt int i;
240 1.1.1.1.2.2 yamt
241 1.1.1.1.2.2 yamt if( schemes == NULL ) return 1;
242 1.1.1.1.2.2 yamt
243 1.1.1.1.2.2 yamt for( i=0; schemes[i] != NULL; i++ ) {
244 1.1.1.1.2.2 yamt if( strcasecmp( scheme, schemes[i] ) == 0 ) {
245 1.1.1.1.2.2 yamt return 1;
246 1.1.1.1.2.2 yamt }
247 1.1.1.1.2.2 yamt }
248 1.1.1.1.2.2 yamt return 0;
249 1.1.1.1.2.2 yamt }
250 1.1.1.1.2.2 yamt
251 1.1.1.1.2.2 yamt static struct berval *passwd_scheme(
252 1.1.1.1.2.2 yamt const struct pw_scheme *scheme,
253 1.1.1.1.2.2 yamt const struct berval * passwd,
254 1.1.1.1.2.2 yamt struct berval *bv,
255 1.1.1.1.2.2 yamt const char** allowed )
256 1.1.1.1.2.2 yamt {
257 1.1.1.1.2.2 yamt if( !is_allowed_scheme( scheme->name.bv_val, allowed ) ) {
258 1.1.1.1.2.2 yamt return NULL;
259 1.1.1.1.2.2 yamt }
260 1.1.1.1.2.2 yamt
261 1.1.1.1.2.2 yamt if( passwd->bv_len >= scheme->name.bv_len ) {
262 1.1.1.1.2.2 yamt if( strncasecmp( passwd->bv_val, scheme->name.bv_val, scheme->name.bv_len ) == 0 ) {
263 1.1.1.1.2.2 yamt bv->bv_val = &passwd->bv_val[scheme->name.bv_len];
264 1.1.1.1.2.2 yamt bv->bv_len = passwd->bv_len - scheme->name.bv_len;
265 1.1.1.1.2.2 yamt
266 1.1.1.1.2.2 yamt return bv;
267 1.1.1.1.2.2 yamt }
268 1.1.1.1.2.2 yamt }
269 1.1.1.1.2.2 yamt
270 1.1.1.1.2.2 yamt return NULL;
271 1.1.1.1.2.2 yamt }
272 1.1.1.1.2.2 yamt
273 1.1.1.1.2.2 yamt /*
274 1.1.1.1.2.2 yamt * Return 0 if creds are good.
275 1.1.1.1.2.2 yamt */
276 1.1.1.1.2.2 yamt int
277 1.1.1.1.2.2 yamt lutil_passwd(
278 1.1.1.1.2.2 yamt const struct berval *passwd, /* stored passwd */
279 1.1.1.1.2.2 yamt const struct berval *cred, /* user cred */
280 1.1.1.1.2.2 yamt const char **schemes,
281 1.1.1.1.2.2 yamt const char **text )
282 1.1.1.1.2.2 yamt {
283 1.1.1.1.2.2 yamt struct pw_slist *pws;
284 1.1.1.1.2.2 yamt
285 1.1.1.1.2.2 yamt if ( text ) *text = NULL;
286 1.1.1.1.2.2 yamt
287 1.1.1.1.2.2 yamt if (cred == NULL || cred->bv_len == 0 ||
288 1.1.1.1.2.2 yamt passwd == NULL || passwd->bv_len == 0 )
289 1.1.1.1.2.2 yamt {
290 1.1.1.1.2.2 yamt return -1;
291 1.1.1.1.2.2 yamt }
292 1.1.1.1.2.2 yamt
293 1.1.1.1.2.2 yamt if (!pw_inited) lutil_passwd_init();
294 1.1.1.1.2.2 yamt
295 1.1.1.1.2.2 yamt for( pws=pw_schemes; pws; pws=pws->next ) {
296 1.1.1.1.2.2 yamt if( pws->s.chk_fn ) {
297 1.1.1.1.2.2 yamt struct berval x;
298 1.1.1.1.2.2 yamt struct berval *p = passwd_scheme( &(pws->s),
299 1.1.1.1.2.2 yamt passwd, &x, schemes );
300 1.1.1.1.2.2 yamt
301 1.1.1.1.2.2 yamt if( p != NULL ) {
302 1.1.1.1.2.2 yamt return (pws->s.chk_fn)( &(pws->s.name), p, cred, text );
303 1.1.1.1.2.2 yamt }
304 1.1.1.1.2.2 yamt }
305 1.1.1.1.2.2 yamt }
306 1.1.1.1.2.2 yamt
307 1.1.1.1.2.2 yamt #ifdef SLAPD_CLEARTEXT
308 1.1.1.1.2.2 yamt /* Do we think there is a scheme specifier here that we
309 1.1.1.1.2.2 yamt * didn't recognize? Assume a scheme name is at least 1 character.
310 1.1.1.1.2.2 yamt */
311 1.1.1.1.2.2 yamt if (( passwd->bv_val[0] == '{' ) &&
312 1.1.1.1.2.2 yamt ( ber_bvchr( passwd, '}' ) > passwd->bv_val+1 ))
313 1.1.1.1.2.2 yamt {
314 1.1.1.1.2.2 yamt return 1;
315 1.1.1.1.2.2 yamt }
316 1.1.1.1.2.2 yamt if( is_allowed_scheme("{CLEARTEXT}", schemes ) ) {
317 1.1.1.1.2.2 yamt return ( passwd->bv_len == cred->bv_len ) ?
318 1.1.1.1.2.2 yamt memcmp( passwd->bv_val, cred->bv_val, passwd->bv_len )
319 1.1.1.1.2.2 yamt : 1;
320 1.1.1.1.2.2 yamt }
321 1.1.1.1.2.2 yamt #endif
322 1.1.1.1.2.2 yamt return 1;
323 1.1.1.1.2.2 yamt }
324 1.1.1.1.2.2 yamt
325 1.1.1.1.2.2 yamt int lutil_passwd_generate( struct berval *pw, ber_len_t len )
326 1.1.1.1.2.2 yamt {
327 1.1.1.1.2.2 yamt
328 1.1.1.1.2.2 yamt if( len < 1 ) return -1;
329 1.1.1.1.2.2 yamt
330 1.1.1.1.2.2 yamt pw->bv_len = len;
331 1.1.1.1.2.2 yamt pw->bv_val = ber_memalloc( len + 1 );
332 1.1.1.1.2.2 yamt
333 1.1.1.1.2.2 yamt if( pw->bv_val == NULL ) {
334 1.1.1.1.2.2 yamt return -1;
335 1.1.1.1.2.2 yamt }
336 1.1.1.1.2.2 yamt
337 1.1.1.1.2.2 yamt if( lutil_entropy( (unsigned char *) pw->bv_val, pw->bv_len) < 0 ) {
338 1.1.1.1.2.2 yamt return -1;
339 1.1.1.1.2.2 yamt }
340 1.1.1.1.2.2 yamt
341 1.1.1.1.2.2 yamt for( len = 0; len < pw->bv_len; len++ ) {
342 1.1.1.1.2.2 yamt pw->bv_val[len] = crypt64[
343 1.1.1.1.2.2 yamt pw->bv_val[len] % (sizeof(crypt64)-1) ];
344 1.1.1.1.2.2 yamt }
345 1.1.1.1.2.2 yamt
346 1.1.1.1.2.2 yamt pw->bv_val[len] = '\0';
347 1.1.1.1.2.2 yamt
348 1.1.1.1.2.2 yamt return 0;
349 1.1.1.1.2.2 yamt }
350 1.1.1.1.2.2 yamt
351 1.1.1.1.2.2 yamt int lutil_passwd_hash(
352 1.1.1.1.2.2 yamt const struct berval * passwd,
353 1.1.1.1.2.2 yamt const char * method,
354 1.1.1.1.2.2 yamt struct berval *hash,
355 1.1.1.1.2.2 yamt const char **text )
356 1.1.1.1.2.2 yamt {
357 1.1.1.1.2.2 yamt const struct pw_scheme *sc = get_scheme( method );
358 1.1.1.1.2.2 yamt
359 1.1.1.1.2.2 yamt hash->bv_val = NULL;
360 1.1.1.1.2.2 yamt hash->bv_len = 0;
361 1.1.1.1.2.2 yamt
362 1.1.1.1.2.2 yamt if( sc == NULL ) {
363 1.1.1.1.2.2 yamt if( text ) *text = "scheme not recognized";
364 1.1.1.1.2.2 yamt return -1;
365 1.1.1.1.2.2 yamt }
366 1.1.1.1.2.2 yamt
367 1.1.1.1.2.2 yamt if( ! sc->hash_fn ) {
368 1.1.1.1.2.2 yamt if( text ) *text = "scheme provided no hash function";
369 1.1.1.1.2.2 yamt return -1;
370 1.1.1.1.2.2 yamt }
371 1.1.1.1.2.2 yamt
372 1.1.1.1.2.2 yamt if( text ) *text = NULL;
373 1.1.1.1.2.2 yamt
374 1.1.1.1.2.2 yamt return (sc->hash_fn)( &sc->name, passwd, hash, text );
375 1.1.1.1.2.2 yamt }
376 1.1.1.1.2.2 yamt
377 1.1.1.1.2.2 yamt /* pw_string is only called when SLAPD_LMHASH or SLAPD_CRYPT is defined */
378 1.1.1.1.2.2 yamt #if defined(SLAPD_LMHASH) || defined(SLAPD_CRYPT)
379 1.1.1.1.2.2 yamt static int pw_string(
380 1.1.1.1.2.2 yamt const struct berval *sc,
381 1.1.1.1.2.2 yamt struct berval *passwd )
382 1.1.1.1.2.2 yamt {
383 1.1.1.1.2.2 yamt struct berval pw;
384 1.1.1.1.2.2 yamt
385 1.1.1.1.2.2 yamt pw.bv_len = sc->bv_len + passwd->bv_len;
386 1.1.1.1.2.2 yamt pw.bv_val = ber_memalloc( pw.bv_len + 1 );
387 1.1.1.1.2.2 yamt
388 1.1.1.1.2.2 yamt if( pw.bv_val == NULL ) {
389 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR;
390 1.1.1.1.2.2 yamt }
391 1.1.1.1.2.2 yamt
392 1.1.1.1.2.2 yamt AC_MEMCPY( pw.bv_val, sc->bv_val, sc->bv_len );
393 1.1.1.1.2.2 yamt AC_MEMCPY( &pw.bv_val[sc->bv_len], passwd->bv_val, passwd->bv_len );
394 1.1.1.1.2.2 yamt
395 1.1.1.1.2.2 yamt pw.bv_val[pw.bv_len] = '\0';
396 1.1.1.1.2.2 yamt *passwd = pw;
397 1.1.1.1.2.2 yamt
398 1.1.1.1.2.2 yamt return LUTIL_PASSWD_OK;
399 1.1.1.1.2.2 yamt }
400 1.1.1.1.2.2 yamt #endif /* SLAPD_LMHASH || SLAPD_CRYPT */
401 1.1.1.1.2.2 yamt
402 1.1.1.1.2.2 yamt static int pw_string64(
403 1.1.1.1.2.2 yamt const struct berval *sc,
404 1.1.1.1.2.2 yamt const struct berval *hash,
405 1.1.1.1.2.2 yamt struct berval *b64,
406 1.1.1.1.2.2 yamt const struct berval *salt )
407 1.1.1.1.2.2 yamt {
408 1.1.1.1.2.2 yamt int rc;
409 1.1.1.1.2.2 yamt struct berval string;
410 1.1.1.1.2.2 yamt size_t b64len;
411 1.1.1.1.2.2 yamt
412 1.1.1.1.2.2 yamt if( salt ) {
413 1.1.1.1.2.2 yamt /* need to base64 combined string */
414 1.1.1.1.2.2 yamt string.bv_len = hash->bv_len + salt->bv_len;
415 1.1.1.1.2.2 yamt string.bv_val = ber_memalloc( string.bv_len + 1 );
416 1.1.1.1.2.2 yamt
417 1.1.1.1.2.2 yamt if( string.bv_val == NULL ) {
418 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR;
419 1.1.1.1.2.2 yamt }
420 1.1.1.1.2.2 yamt
421 1.1.1.1.2.2 yamt AC_MEMCPY( string.bv_val, hash->bv_val,
422 1.1.1.1.2.2 yamt hash->bv_len );
423 1.1.1.1.2.2 yamt AC_MEMCPY( &string.bv_val[hash->bv_len], salt->bv_val,
424 1.1.1.1.2.2 yamt salt->bv_len );
425 1.1.1.1.2.2 yamt string.bv_val[string.bv_len] = '\0';
426 1.1.1.1.2.2 yamt
427 1.1.1.1.2.2 yamt } else {
428 1.1.1.1.2.2 yamt string = *hash;
429 1.1.1.1.2.2 yamt }
430 1.1.1.1.2.2 yamt
431 1.1.1.1.2.2 yamt b64len = LUTIL_BASE64_ENCODE_LEN( string.bv_len ) + 1;
432 1.1.1.1.2.2 yamt b64->bv_len = b64len + sc->bv_len;
433 1.1.1.1.2.2 yamt b64->bv_val = ber_memalloc( b64->bv_len + 1 );
434 1.1.1.1.2.2 yamt
435 1.1.1.1.2.2 yamt if( b64->bv_val == NULL ) {
436 1.1.1.1.2.2 yamt if( salt ) ber_memfree( string.bv_val );
437 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR;
438 1.1.1.1.2.2 yamt }
439 1.1.1.1.2.2 yamt
440 1.1.1.1.2.2 yamt AC_MEMCPY(b64->bv_val, sc->bv_val, sc->bv_len);
441 1.1.1.1.2.2 yamt
442 1.1.1.1.2.2 yamt rc = lutil_b64_ntop(
443 1.1.1.1.2.2 yamt (unsigned char *) string.bv_val, string.bv_len,
444 1.1.1.1.2.2 yamt &b64->bv_val[sc->bv_len], b64len );
445 1.1.1.1.2.2 yamt
446 1.1.1.1.2.2 yamt if( salt ) ber_memfree( string.bv_val );
447 1.1.1.1.2.2 yamt
448 1.1.1.1.2.2 yamt if( rc < 0 ) {
449 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR;
450 1.1.1.1.2.2 yamt }
451 1.1.1.1.2.2 yamt
452 1.1.1.1.2.2 yamt /* recompute length */
453 1.1.1.1.2.2 yamt b64->bv_len = sc->bv_len + rc;
454 1.1.1.1.2.2 yamt assert( strlen(b64->bv_val) == b64->bv_len );
455 1.1.1.1.2.2 yamt return LUTIL_PASSWD_OK;
456 1.1.1.1.2.2 yamt }
457 1.1.1.1.2.2 yamt
458 1.1.1.1.2.2 yamt /* PASSWORD CHECK ROUTINES */
459 1.1.1.1.2.2 yamt
460 1.1.1.1.2.2 yamt #ifdef LUTIL_SHA1_BYTES
461 1.1.1.1.2.2 yamt static int chk_ssha1(
462 1.1.1.1.2.2 yamt const struct berval *sc,
463 1.1.1.1.2.2 yamt const struct berval * passwd,
464 1.1.1.1.2.2 yamt const struct berval * cred,
465 1.1.1.1.2.2 yamt const char **text )
466 1.1.1.1.2.2 yamt {
467 1.1.1.1.2.2 yamt lutil_SHA1_CTX SHA1context;
468 1.1.1.1.2.2 yamt unsigned char SHA1digest[LUTIL_SHA1_BYTES];
469 1.1.1.1.2.2 yamt int rc;
470 1.1.1.1.2.2 yamt unsigned char *orig_pass = NULL;
471 1.1.1.1.2.2 yamt
472 1.1.1.1.2.2 yamt /* safety check -- must have some salt */
473 1.1.1.1.2.2 yamt if (LUTIL_BASE64_DECODE_LEN(passwd->bv_len) <= sizeof(SHA1digest)) {
474 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR;
475 1.1.1.1.2.2 yamt }
476 1.1.1.1.2.2 yamt
477 1.1.1.1.2.2 yamt /* decode base64 password */
478 1.1.1.1.2.2 yamt orig_pass = (unsigned char *) ber_memalloc( (size_t) (
479 1.1.1.1.2.2 yamt LUTIL_BASE64_DECODE_LEN(passwd->bv_len) + 1) );
480 1.1.1.1.2.2 yamt
481 1.1.1.1.2.2 yamt if( orig_pass == NULL ) return LUTIL_PASSWD_ERR;
482 1.1.1.1.2.2 yamt
483 1.1.1.1.2.2 yamt rc = lutil_b64_pton(passwd->bv_val, orig_pass, passwd->bv_len);
484 1.1.1.1.2.2 yamt
485 1.1.1.1.2.2 yamt /* safety check -- must have some salt */
486 1.1.1.1.2.2 yamt if (rc <= (int)(sizeof(SHA1digest))) {
487 1.1.1.1.2.2 yamt ber_memfree(orig_pass);
488 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR;
489 1.1.1.1.2.2 yamt }
490 1.1.1.1.2.2 yamt
491 1.1.1.1.2.2 yamt /* hash credentials with salt */
492 1.1.1.1.2.2 yamt lutil_SHA1Init(&SHA1context);
493 1.1.1.1.2.2 yamt lutil_SHA1Update(&SHA1context,
494 1.1.1.1.2.2 yamt (const unsigned char *) cred->bv_val, cred->bv_len);
495 1.1.1.1.2.2 yamt lutil_SHA1Update(&SHA1context,
496 1.1.1.1.2.2 yamt (const unsigned char *) &orig_pass[sizeof(SHA1digest)],
497 1.1.1.1.2.2 yamt rc - sizeof(SHA1digest));
498 1.1.1.1.2.2 yamt lutil_SHA1Final(SHA1digest, &SHA1context);
499 1.1.1.1.2.2 yamt
500 1.1.1.1.2.2 yamt /* compare */
501 1.1.1.1.2.2 yamt rc = memcmp((char *)orig_pass, (char *)SHA1digest, sizeof(SHA1digest));
502 1.1.1.1.2.2 yamt ber_memfree(orig_pass);
503 1.1.1.1.2.2 yamt return rc ? LUTIL_PASSWD_ERR : LUTIL_PASSWD_OK;
504 1.1.1.1.2.2 yamt }
505 1.1.1.1.2.2 yamt
506 1.1.1.1.2.2 yamt static int chk_sha1(
507 1.1.1.1.2.2 yamt const struct berval *sc,
508 1.1.1.1.2.2 yamt const struct berval * passwd,
509 1.1.1.1.2.2 yamt const struct berval * cred,
510 1.1.1.1.2.2 yamt const char **text )
511 1.1.1.1.2.2 yamt {
512 1.1.1.1.2.2 yamt lutil_SHA1_CTX SHA1context;
513 1.1.1.1.2.2 yamt unsigned char SHA1digest[LUTIL_SHA1_BYTES];
514 1.1.1.1.2.2 yamt int rc;
515 1.1.1.1.2.2 yamt unsigned char *orig_pass = NULL;
516 1.1.1.1.2.2 yamt
517 1.1.1.1.2.2 yamt /* safety check */
518 1.1.1.1.2.2 yamt if (LUTIL_BASE64_DECODE_LEN(passwd->bv_len) < sizeof(SHA1digest)) {
519 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR;
520 1.1.1.1.2.2 yamt }
521 1.1.1.1.2.2 yamt
522 1.1.1.1.2.2 yamt /* base64 un-encode password */
523 1.1.1.1.2.2 yamt orig_pass = (unsigned char *) ber_memalloc( (size_t) (
524 1.1.1.1.2.2 yamt LUTIL_BASE64_DECODE_LEN(passwd->bv_len) + 1) );
525 1.1.1.1.2.2 yamt
526 1.1.1.1.2.2 yamt if( orig_pass == NULL ) return LUTIL_PASSWD_ERR;
527 1.1.1.1.2.2 yamt
528 1.1.1.1.2.2 yamt rc = lutil_b64_pton(passwd->bv_val, orig_pass, passwd->bv_len);
529 1.1.1.1.2.2 yamt
530 1.1.1.1.2.2 yamt if( rc != sizeof(SHA1digest) ) {
531 1.1.1.1.2.2 yamt ber_memfree(orig_pass);
532 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR;
533 1.1.1.1.2.2 yamt }
534 1.1.1.1.2.2 yamt
535 1.1.1.1.2.2 yamt /* hash credentials with salt */
536 1.1.1.1.2.2 yamt lutil_SHA1Init(&SHA1context);
537 1.1.1.1.2.2 yamt lutil_SHA1Update(&SHA1context,
538 1.1.1.1.2.2 yamt (const unsigned char *) cred->bv_val, cred->bv_len);
539 1.1.1.1.2.2 yamt lutil_SHA1Final(SHA1digest, &SHA1context);
540 1.1.1.1.2.2 yamt
541 1.1.1.1.2.2 yamt /* compare */
542 1.1.1.1.2.2 yamt rc = memcmp((char *)orig_pass, (char *)SHA1digest, sizeof(SHA1digest));
543 1.1.1.1.2.2 yamt ber_memfree(orig_pass);
544 1.1.1.1.2.2 yamt return rc ? LUTIL_PASSWD_ERR : LUTIL_PASSWD_OK;
545 1.1.1.1.2.2 yamt }
546 1.1.1.1.2.2 yamt #endif
547 1.1.1.1.2.2 yamt
548 1.1.1.1.2.2 yamt static int chk_smd5(
549 1.1.1.1.2.2 yamt const struct berval *sc,
550 1.1.1.1.2.2 yamt const struct berval * passwd,
551 1.1.1.1.2.2 yamt const struct berval * cred,
552 1.1.1.1.2.2 yamt const char **text )
553 1.1.1.1.2.2 yamt {
554 1.1.1.1.2.2 yamt lutil_MD5_CTX MD5context;
555 1.1.1.1.2.2 yamt unsigned char MD5digest[LUTIL_MD5_BYTES];
556 1.1.1.1.2.2 yamt int rc;
557 1.1.1.1.2.2 yamt unsigned char *orig_pass = NULL;
558 1.1.1.1.2.2 yamt
559 1.1.1.1.2.2 yamt /* safety check */
560 1.1.1.1.2.2 yamt if (LUTIL_BASE64_DECODE_LEN(passwd->bv_len) <= sizeof(MD5digest)) {
561 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR;
562 1.1.1.1.2.2 yamt }
563 1.1.1.1.2.2 yamt
564 1.1.1.1.2.2 yamt /* base64 un-encode password */
565 1.1.1.1.2.2 yamt orig_pass = (unsigned char *) ber_memalloc( (size_t) (
566 1.1.1.1.2.2 yamt LUTIL_BASE64_DECODE_LEN(passwd->bv_len) + 1) );
567 1.1.1.1.2.2 yamt
568 1.1.1.1.2.2 yamt if( orig_pass == NULL ) return LUTIL_PASSWD_ERR;
569 1.1.1.1.2.2 yamt
570 1.1.1.1.2.2 yamt rc = lutil_b64_pton(passwd->bv_val, orig_pass, passwd->bv_len);
571 1.1.1.1.2.2 yamt
572 1.1.1.1.2.2 yamt if (rc <= (int)(sizeof(MD5digest))) {
573 1.1.1.1.2.2 yamt ber_memfree(orig_pass);
574 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR;
575 1.1.1.1.2.2 yamt }
576 1.1.1.1.2.2 yamt
577 1.1.1.1.2.2 yamt /* hash credentials with salt */
578 1.1.1.1.2.2 yamt lutil_MD5Init(&MD5context);
579 1.1.1.1.2.2 yamt lutil_MD5Update(&MD5context,
580 1.1.1.1.2.2 yamt (const unsigned char *) cred->bv_val,
581 1.1.1.1.2.2 yamt cred->bv_len );
582 1.1.1.1.2.2 yamt lutil_MD5Update(&MD5context,
583 1.1.1.1.2.2 yamt &orig_pass[sizeof(MD5digest)],
584 1.1.1.1.2.2 yamt rc - sizeof(MD5digest));
585 1.1.1.1.2.2 yamt lutil_MD5Final(MD5digest, &MD5context);
586 1.1.1.1.2.2 yamt
587 1.1.1.1.2.2 yamt /* compare */
588 1.1.1.1.2.2 yamt rc = memcmp((char *)orig_pass, (char *)MD5digest, sizeof(MD5digest));
589 1.1.1.1.2.2 yamt ber_memfree(orig_pass);
590 1.1.1.1.2.2 yamt return rc ? LUTIL_PASSWD_ERR : LUTIL_PASSWD_OK;
591 1.1.1.1.2.2 yamt }
592 1.1.1.1.2.2 yamt
593 1.1.1.1.2.2 yamt static int chk_md5(
594 1.1.1.1.2.2 yamt const struct berval *sc,
595 1.1.1.1.2.2 yamt const struct berval * passwd,
596 1.1.1.1.2.2 yamt const struct berval * cred,
597 1.1.1.1.2.2 yamt const char **text )
598 1.1.1.1.2.2 yamt {
599 1.1.1.1.2.2 yamt lutil_MD5_CTX MD5context;
600 1.1.1.1.2.2 yamt unsigned char MD5digest[LUTIL_MD5_BYTES];
601 1.1.1.1.2.2 yamt int rc;
602 1.1.1.1.2.2 yamt unsigned char *orig_pass = NULL;
603 1.1.1.1.2.2 yamt
604 1.1.1.1.2.2 yamt /* safety check */
605 1.1.1.1.2.2 yamt if (LUTIL_BASE64_DECODE_LEN(passwd->bv_len) < sizeof(MD5digest)) {
606 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR;
607 1.1.1.1.2.2 yamt }
608 1.1.1.1.2.2 yamt
609 1.1.1.1.2.2 yamt /* base64 un-encode password */
610 1.1.1.1.2.2 yamt orig_pass = (unsigned char *) ber_memalloc( (size_t) (
611 1.1.1.1.2.2 yamt LUTIL_BASE64_DECODE_LEN(passwd->bv_len) + 1) );
612 1.1.1.1.2.2 yamt
613 1.1.1.1.2.2 yamt if( orig_pass == NULL ) return LUTIL_PASSWD_ERR;
614 1.1.1.1.2.2 yamt
615 1.1.1.1.2.2 yamt rc = lutil_b64_pton(passwd->bv_val, orig_pass, passwd->bv_len);
616 1.1.1.1.2.2 yamt if ( rc != sizeof(MD5digest) ) {
617 1.1.1.1.2.2 yamt ber_memfree(orig_pass);
618 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR;
619 1.1.1.1.2.2 yamt }
620 1.1.1.1.2.2 yamt
621 1.1.1.1.2.2 yamt /* hash credentials with salt */
622 1.1.1.1.2.2 yamt lutil_MD5Init(&MD5context);
623 1.1.1.1.2.2 yamt lutil_MD5Update(&MD5context,
624 1.1.1.1.2.2 yamt (const unsigned char *) cred->bv_val,
625 1.1.1.1.2.2 yamt cred->bv_len );
626 1.1.1.1.2.2 yamt lutil_MD5Final(MD5digest, &MD5context);
627 1.1.1.1.2.2 yamt
628 1.1.1.1.2.2 yamt /* compare */
629 1.1.1.1.2.2 yamt rc = memcmp((char *)orig_pass, (char *)MD5digest, sizeof(MD5digest));
630 1.1.1.1.2.2 yamt ber_memfree(orig_pass);
631 1.1.1.1.2.2 yamt return rc ? LUTIL_PASSWD_ERR : LUTIL_PASSWD_OK;
632 1.1.1.1.2.2 yamt }
633 1.1.1.1.2.2 yamt
634 1.1.1.1.2.2 yamt #ifdef SLAPD_LMHASH
635 1.1.1.1.2.2 yamt /* pseudocode from RFC2433
636 1.1.1.1.2.2 yamt * A.2 LmPasswordHash()
637 1.1.1.1.2.2 yamt *
638 1.1.1.1.2.2 yamt * LmPasswordHash(
639 1.1.1.1.2.2 yamt * IN 0-to-14-oem-char Password,
640 1.1.1.1.2.2 yamt * OUT 16-octet PasswordHash )
641 1.1.1.1.2.2 yamt * {
642 1.1.1.1.2.2 yamt * Set UcasePassword to the uppercased Password
643 1.1.1.1.2.2 yamt * Zero pad UcasePassword to 14 characters
644 1.1.1.1.2.2 yamt *
645 1.1.1.1.2.2 yamt * DesHash( 1st 7-octets of UcasePassword,
646 1.1.1.1.2.2 yamt * giving 1st 8-octets of PasswordHash )
647 1.1.1.1.2.2 yamt *
648 1.1.1.1.2.2 yamt * DesHash( 2nd 7-octets of UcasePassword,
649 1.1.1.1.2.2 yamt * giving 2nd 8-octets of PasswordHash )
650 1.1.1.1.2.2 yamt * }
651 1.1.1.1.2.2 yamt *
652 1.1.1.1.2.2 yamt *
653 1.1.1.1.2.2 yamt * A.3 DesHash()
654 1.1.1.1.2.2 yamt *
655 1.1.1.1.2.2 yamt * DesHash(
656 1.1.1.1.2.2 yamt * IN 7-octet Clear,
657 1.1.1.1.2.2 yamt * OUT 8-octet Cypher )
658 1.1.1.1.2.2 yamt * {
659 1.1.1.1.2.2 yamt * *
660 1.1.1.1.2.2 yamt * * Make Cypher an irreversibly encrypted form of Clear by
661 1.1.1.1.2.2 yamt * * encrypting known text using Clear as the secret key.
662 1.1.1.1.2.2 yamt * * The known text consists of the string
663 1.1.1.1.2.2 yamt * *
664 1.1.1.1.2.2 yamt * * KGS!@#$%
665 1.1.1.1.2.2 yamt * *
666 1.1.1.1.2.2 yamt *
667 1.1.1.1.2.2 yamt * Set StdText to "KGS!@#$%"
668 1.1.1.1.2.2 yamt * DesEncrypt( StdText, Clear, giving Cypher )
669 1.1.1.1.2.2 yamt * }
670 1.1.1.1.2.2 yamt *
671 1.1.1.1.2.2 yamt *
672 1.1.1.1.2.2 yamt * A.4 DesEncrypt()
673 1.1.1.1.2.2 yamt *
674 1.1.1.1.2.2 yamt * DesEncrypt(
675 1.1.1.1.2.2 yamt * IN 8-octet Clear,
676 1.1.1.1.2.2 yamt * IN 7-octet Key,
677 1.1.1.1.2.2 yamt * OUT 8-octet Cypher )
678 1.1.1.1.2.2 yamt * {
679 1.1.1.1.2.2 yamt * *
680 1.1.1.1.2.2 yamt * * Use the DES encryption algorithm [4] in ECB mode [9]
681 1.1.1.1.2.2 yamt * * to encrypt Clear into Cypher such that Cypher can
682 1.1.1.1.2.2 yamt * * only be decrypted back to Clear by providing Key.
683 1.1.1.1.2.2 yamt * * Note that the DES algorithm takes as input a 64-bit
684 1.1.1.1.2.2 yamt * * stream where the 8th, 16th, 24th, etc. bits are
685 1.1.1.1.2.2 yamt * * parity bits ignored by the encrypting algorithm.
686 1.1.1.1.2.2 yamt * * Unless you write your own DES to accept 56-bit input
687 1.1.1.1.2.2 yamt * * without parity, you will need to insert the parity bits
688 1.1.1.1.2.2 yamt * * yourself.
689 1.1.1.1.2.2 yamt * *
690 1.1.1.1.2.2 yamt * }
691 1.1.1.1.2.2 yamt */
692 1.1.1.1.2.2 yamt
693 1.1.1.1.2.2 yamt static void lmPasswd_to_key(
694 1.1.1.1.2.2 yamt const char *lmPasswd,
695 1.1.1.1.2.2 yamt des_cblock *key)
696 1.1.1.1.2.2 yamt {
697 1.1.1.1.2.2 yamt const unsigned char *lpw = (const unsigned char *) lmPasswd;
698 1.1.1.1.2.2 yamt unsigned char *k = (unsigned char *) key;
699 1.1.1.1.2.2 yamt
700 1.1.1.1.2.2 yamt /* make room for parity bits */
701 1.1.1.1.2.2 yamt k[0] = lpw[0];
702 1.1.1.1.2.2 yamt k[1] = ((lpw[0] & 0x01) << 7) | (lpw[1] >> 1);
703 1.1.1.1.2.2 yamt k[2] = ((lpw[1] & 0x03) << 6) | (lpw[2] >> 2);
704 1.1.1.1.2.2 yamt k[3] = ((lpw[2] & 0x07) << 5) | (lpw[3] >> 3);
705 1.1.1.1.2.2 yamt k[4] = ((lpw[3] & 0x0F) << 4) | (lpw[4] >> 4);
706 1.1.1.1.2.2 yamt k[5] = ((lpw[4] & 0x1F) << 3) | (lpw[5] >> 5);
707 1.1.1.1.2.2 yamt k[6] = ((lpw[5] & 0x3F) << 2) | (lpw[6] >> 6);
708 1.1.1.1.2.2 yamt k[7] = ((lpw[6] & 0x7F) << 1);
709 1.1.1.1.2.2 yamt
710 1.1.1.1.2.2 yamt des_set_odd_parity( key );
711 1.1.1.1.2.2 yamt }
712 1.1.1.1.2.2 yamt
713 1.1.1.1.2.2 yamt static int chk_lanman(
714 1.1.1.1.2.2 yamt const struct berval *scheme,
715 1.1.1.1.2.2 yamt const struct berval *passwd,
716 1.1.1.1.2.2 yamt const struct berval *cred,
717 1.1.1.1.2.2 yamt const char **text )
718 1.1.1.1.2.2 yamt {
719 1.1.1.1.2.2 yamt int i;
720 1.1.1.1.2.2 yamt char UcasePassword[15];
721 1.1.1.1.2.2 yamt des_cblock key;
722 1.1.1.1.2.2 yamt des_key_schedule schedule;
723 1.1.1.1.2.2 yamt des_cblock StdText = "KGS!@#$%";
724 1.1.1.1.2.2 yamt des_cblock PasswordHash1, PasswordHash2;
725 1.1.1.1.2.2 yamt char PasswordHash[33], storedPasswordHash[33];
726 1.1.1.1.2.2 yamt
727 1.1.1.1.2.2 yamt for( i=0; i<cred->bv_len; i++) {
728 1.1.1.1.2.2 yamt if(cred->bv_val[i] == '\0') {
729 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR; /* NUL character in password */
730 1.1.1.1.2.2 yamt }
731 1.1.1.1.2.2 yamt }
732 1.1.1.1.2.2 yamt
733 1.1.1.1.2.2 yamt if( cred->bv_val[i] != '\0' ) {
734 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR; /* passwd must behave like a string */
735 1.1.1.1.2.2 yamt }
736 1.1.1.1.2.2 yamt
737 1.1.1.1.2.2 yamt strncpy( UcasePassword, cred->bv_val, 14 );
738 1.1.1.1.2.2 yamt UcasePassword[14] = '\0';
739 1.1.1.1.2.2 yamt ldap_pvt_str2upper( UcasePassword );
740 1.1.1.1.2.2 yamt
741 1.1.1.1.2.2 yamt lmPasswd_to_key( UcasePassword, &key );
742 1.1.1.1.2.2 yamt des_set_key_unchecked( &key, schedule );
743 1.1.1.1.2.2 yamt des_ecb_encrypt( &StdText, &PasswordHash1, schedule , DES_ENCRYPT );
744 1.1.1.1.2.2 yamt
745 1.1.1.1.2.2 yamt lmPasswd_to_key( &UcasePassword[7], &key );
746 1.1.1.1.2.2 yamt des_set_key_unchecked( &key, schedule );
747 1.1.1.1.2.2 yamt des_ecb_encrypt( &StdText, &PasswordHash2, schedule , DES_ENCRYPT );
748 1.1.1.1.2.2 yamt
749 1.1.1.1.2.2 yamt sprintf( PasswordHash, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
750 1.1.1.1.2.2 yamt PasswordHash1[0],PasswordHash1[1],PasswordHash1[2],PasswordHash1[3],
751 1.1.1.1.2.2 yamt PasswordHash1[4],PasswordHash1[5],PasswordHash1[6],PasswordHash1[7],
752 1.1.1.1.2.2 yamt PasswordHash2[0],PasswordHash2[1],PasswordHash2[2],PasswordHash2[3],
753 1.1.1.1.2.2 yamt PasswordHash2[4],PasswordHash2[5],PasswordHash2[6],PasswordHash2[7] );
754 1.1.1.1.2.2 yamt
755 1.1.1.1.2.2 yamt /* as a precaution convert stored password hash to lower case */
756 1.1.1.1.2.2 yamt strncpy( storedPasswordHash, passwd->bv_val, 32 );
757 1.1.1.1.2.2 yamt storedPasswordHash[32] = '\0';
758 1.1.1.1.2.2 yamt ldap_pvt_str2lower( storedPasswordHash );
759 1.1.1.1.2.2 yamt
760 1.1.1.1.2.2 yamt return memcmp( PasswordHash, storedPasswordHash, 32) ? LUTIL_PASSWD_ERR : LUTIL_PASSWD_OK;
761 1.1.1.1.2.2 yamt }
762 1.1.1.1.2.2 yamt #endif /* SLAPD_LMHASH */
763 1.1.1.1.2.2 yamt
764 1.1.1.1.2.2 yamt #ifdef SLAPD_CRYPT
765 1.1.1.1.2.2 yamt static int lutil_crypt(
766 1.1.1.1.2.2 yamt const char *key,
767 1.1.1.1.2.2 yamt const char *salt,
768 1.1.1.1.2.2 yamt char **hash )
769 1.1.1.1.2.2 yamt {
770 1.1.1.1.2.2 yamt char *cr = crypt( key, salt );
771 1.1.1.1.2.2 yamt int rc;
772 1.1.1.1.2.2 yamt
773 1.1.1.1.2.2 yamt if( cr == NULL || cr[0] == '\0' ) {
774 1.1.1.1.2.2 yamt /* salt must have been invalid */
775 1.1.1.1.2.2 yamt rc = LUTIL_PASSWD_ERR;
776 1.1.1.1.2.2 yamt } else {
777 1.1.1.1.2.2 yamt if ( hash ) {
778 1.1.1.1.2.2 yamt *hash = ber_strdup( cr );
779 1.1.1.1.2.2 yamt rc = LUTIL_PASSWD_OK;
780 1.1.1.1.2.2 yamt } else {
781 1.1.1.1.2.2 yamt rc = strcmp( salt, cr ) ? LUTIL_PASSWD_ERR : LUTIL_PASSWD_OK;
782 1.1.1.1.2.2 yamt }
783 1.1.1.1.2.2 yamt }
784 1.1.1.1.2.2 yamt return rc;
785 1.1.1.1.2.2 yamt }
786 1.1.1.1.2.2 yamt
787 1.1.1.1.2.2 yamt static int chk_crypt(
788 1.1.1.1.2.2 yamt const struct berval *sc,
789 1.1.1.1.2.2 yamt const struct berval * passwd,
790 1.1.1.1.2.2 yamt const struct berval * cred,
791 1.1.1.1.2.2 yamt const char **text )
792 1.1.1.1.2.2 yamt {
793 1.1.1.1.2.2 yamt unsigned int i;
794 1.1.1.1.2.2 yamt
795 1.1.1.1.2.2 yamt for( i=0; i<cred->bv_len; i++) {
796 1.1.1.1.2.2 yamt if(cred->bv_val[i] == '\0') {
797 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR; /* NUL character in password */
798 1.1.1.1.2.2 yamt }
799 1.1.1.1.2.2 yamt }
800 1.1.1.1.2.2 yamt
801 1.1.1.1.2.2 yamt if( cred->bv_val[i] != '\0' ) {
802 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR; /* cred must behave like a string */
803 1.1.1.1.2.2 yamt }
804 1.1.1.1.2.2 yamt
805 1.1.1.1.2.2 yamt if( passwd->bv_len < 2 ) {
806 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR; /* passwd must be at least two characters long */
807 1.1.1.1.2.2 yamt }
808 1.1.1.1.2.2 yamt
809 1.1.1.1.2.2 yamt for( i=0; i<passwd->bv_len; i++) {
810 1.1.1.1.2.2 yamt if(passwd->bv_val[i] == '\0') {
811 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR; /* NUL character in password */
812 1.1.1.1.2.2 yamt }
813 1.1.1.1.2.2 yamt }
814 1.1.1.1.2.2 yamt
815 1.1.1.1.2.2 yamt if( passwd->bv_val[i] != '\0' ) {
816 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR; /* passwd must behave like a string */
817 1.1.1.1.2.2 yamt }
818 1.1.1.1.2.2 yamt
819 1.1.1.1.2.2 yamt return lutil_cryptptr( cred->bv_val, passwd->bv_val, NULL );
820 1.1.1.1.2.2 yamt }
821 1.1.1.1.2.2 yamt
822 1.1.1.1.2.2 yamt # if defined( HAVE_GETPWNAM ) && defined( HAVE_STRUCT_PASSWD_PW_PASSWD )
823 1.1.1.1.2.2 yamt static int chk_unix(
824 1.1.1.1.2.2 yamt const struct berval *sc,
825 1.1.1.1.2.2 yamt const struct berval * passwd,
826 1.1.1.1.2.2 yamt const struct berval * cred,
827 1.1.1.1.2.2 yamt const char **text )
828 1.1.1.1.2.2 yamt {
829 1.1.1.1.2.2 yamt unsigned int i;
830 1.1.1.1.2.2 yamt char *pw;
831 1.1.1.1.2.2 yamt
832 1.1.1.1.2.2 yamt for( i=0; i<cred->bv_len; i++) {
833 1.1.1.1.2.2 yamt if(cred->bv_val[i] == '\0') {
834 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR; /* NUL character in password */
835 1.1.1.1.2.2 yamt }
836 1.1.1.1.2.2 yamt }
837 1.1.1.1.2.2 yamt if( cred->bv_val[i] != '\0' ) {
838 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR; /* cred must behave like a string */
839 1.1.1.1.2.2 yamt }
840 1.1.1.1.2.2 yamt
841 1.1.1.1.2.2 yamt for( i=0; i<passwd->bv_len; i++) {
842 1.1.1.1.2.2 yamt if(passwd->bv_val[i] == '\0') {
843 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR; /* NUL character in password */
844 1.1.1.1.2.2 yamt }
845 1.1.1.1.2.2 yamt }
846 1.1.1.1.2.2 yamt
847 1.1.1.1.2.2 yamt if( passwd->bv_val[i] != '\0' ) {
848 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR; /* passwd must behave like a string */
849 1.1.1.1.2.2 yamt }
850 1.1.1.1.2.2 yamt
851 1.1.1.1.2.2 yamt {
852 1.1.1.1.2.2 yamt struct passwd *pwd = getpwnam(passwd->bv_val);
853 1.1.1.1.2.2 yamt
854 1.1.1.1.2.2 yamt if(pwd == NULL) {
855 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR; /* not found */
856 1.1.1.1.2.2 yamt }
857 1.1.1.1.2.2 yamt
858 1.1.1.1.2.2 yamt pw = pwd->pw_passwd;
859 1.1.1.1.2.2 yamt }
860 1.1.1.1.2.2 yamt # ifdef HAVE_GETSPNAM
861 1.1.1.1.2.2 yamt {
862 1.1.1.1.2.2 yamt struct spwd *spwd = getspnam(passwd->bv_val);
863 1.1.1.1.2.2 yamt
864 1.1.1.1.2.2 yamt if(spwd != NULL) {
865 1.1.1.1.2.2 yamt pw = spwd->sp_pwdp;
866 1.1.1.1.2.2 yamt }
867 1.1.1.1.2.2 yamt }
868 1.1.1.1.2.2 yamt # endif
869 1.1.1.1.2.2 yamt # ifdef HAVE_AIX_SECURITY
870 1.1.1.1.2.2 yamt {
871 1.1.1.1.2.2 yamt struct userpw *upw = getuserpw(passwd->bv_val);
872 1.1.1.1.2.2 yamt
873 1.1.1.1.2.2 yamt if (upw != NULL) {
874 1.1.1.1.2.2 yamt pw = upw->upw_passwd;
875 1.1.1.1.2.2 yamt }
876 1.1.1.1.2.2 yamt }
877 1.1.1.1.2.2 yamt # endif
878 1.1.1.1.2.2 yamt
879 1.1.1.1.2.2 yamt if( pw == NULL || pw[0] == '\0' || pw[1] == '\0' ) {
880 1.1.1.1.2.2 yamt /* password must must be at least two characters long */
881 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR;
882 1.1.1.1.2.2 yamt }
883 1.1.1.1.2.2 yamt
884 1.1.1.1.2.2 yamt return lutil_cryptptr( cred->bv_val, pw, NULL );
885 1.1.1.1.2.2 yamt }
886 1.1.1.1.2.2 yamt # endif
887 1.1.1.1.2.2 yamt #endif
888 1.1.1.1.2.2 yamt
889 1.1.1.1.2.2 yamt /* PASSWORD GENERATION ROUTINES */
890 1.1.1.1.2.2 yamt
891 1.1.1.1.2.2 yamt #ifdef LUTIL_SHA1_BYTES
892 1.1.1.1.2.2 yamt static int hash_ssha1(
893 1.1.1.1.2.2 yamt const struct berval *scheme,
894 1.1.1.1.2.2 yamt const struct berval *passwd,
895 1.1.1.1.2.2 yamt struct berval *hash,
896 1.1.1.1.2.2 yamt const char **text )
897 1.1.1.1.2.2 yamt {
898 1.1.1.1.2.2 yamt lutil_SHA1_CTX SHA1context;
899 1.1.1.1.2.2 yamt unsigned char SHA1digest[LUTIL_SHA1_BYTES];
900 1.1.1.1.2.2 yamt char saltdata[SALT_SIZE];
901 1.1.1.1.2.2 yamt struct berval digest;
902 1.1.1.1.2.2 yamt struct berval salt;
903 1.1.1.1.2.2 yamt
904 1.1.1.1.2.2 yamt digest.bv_val = (char *) SHA1digest;
905 1.1.1.1.2.2 yamt digest.bv_len = sizeof(SHA1digest);
906 1.1.1.1.2.2 yamt salt.bv_val = saltdata;
907 1.1.1.1.2.2 yamt salt.bv_len = sizeof(saltdata);
908 1.1.1.1.2.2 yamt
909 1.1.1.1.2.2 yamt if( lutil_entropy( (unsigned char *) salt.bv_val, salt.bv_len) < 0 ) {
910 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR;
911 1.1.1.1.2.2 yamt }
912 1.1.1.1.2.2 yamt
913 1.1.1.1.2.2 yamt lutil_SHA1Init( &SHA1context );
914 1.1.1.1.2.2 yamt lutil_SHA1Update( &SHA1context,
915 1.1.1.1.2.2 yamt (const unsigned char *)passwd->bv_val, passwd->bv_len );
916 1.1.1.1.2.2 yamt lutil_SHA1Update( &SHA1context,
917 1.1.1.1.2.2 yamt (const unsigned char *)salt.bv_val, salt.bv_len );
918 1.1.1.1.2.2 yamt lutil_SHA1Final( SHA1digest, &SHA1context );
919 1.1.1.1.2.2 yamt
920 1.1.1.1.2.2 yamt return pw_string64( scheme, &digest, hash, &salt);
921 1.1.1.1.2.2 yamt }
922 1.1.1.1.2.2 yamt
923 1.1.1.1.2.2 yamt static int hash_sha1(
924 1.1.1.1.2.2 yamt const struct berval *scheme,
925 1.1.1.1.2.2 yamt const struct berval *passwd,
926 1.1.1.1.2.2 yamt struct berval *hash,
927 1.1.1.1.2.2 yamt const char **text )
928 1.1.1.1.2.2 yamt {
929 1.1.1.1.2.2 yamt lutil_SHA1_CTX SHA1context;
930 1.1.1.1.2.2 yamt unsigned char SHA1digest[LUTIL_SHA1_BYTES];
931 1.1.1.1.2.2 yamt struct berval digest;
932 1.1.1.1.2.2 yamt digest.bv_val = (char *) SHA1digest;
933 1.1.1.1.2.2 yamt digest.bv_len = sizeof(SHA1digest);
934 1.1.1.1.2.2 yamt
935 1.1.1.1.2.2 yamt lutil_SHA1Init( &SHA1context );
936 1.1.1.1.2.2 yamt lutil_SHA1Update( &SHA1context,
937 1.1.1.1.2.2 yamt (const unsigned char *)passwd->bv_val, passwd->bv_len );
938 1.1.1.1.2.2 yamt lutil_SHA1Final( SHA1digest, &SHA1context );
939 1.1.1.1.2.2 yamt
940 1.1.1.1.2.2 yamt return pw_string64( scheme, &digest, hash, NULL);
941 1.1.1.1.2.2 yamt }
942 1.1.1.1.2.2 yamt #endif
943 1.1.1.1.2.2 yamt
944 1.1.1.1.2.2 yamt static int hash_smd5(
945 1.1.1.1.2.2 yamt const struct berval *scheme,
946 1.1.1.1.2.2 yamt const struct berval *passwd,
947 1.1.1.1.2.2 yamt struct berval *hash,
948 1.1.1.1.2.2 yamt const char **text )
949 1.1.1.1.2.2 yamt {
950 1.1.1.1.2.2 yamt lutil_MD5_CTX MD5context;
951 1.1.1.1.2.2 yamt unsigned char MD5digest[LUTIL_MD5_BYTES];
952 1.1.1.1.2.2 yamt char saltdata[SALT_SIZE];
953 1.1.1.1.2.2 yamt struct berval digest;
954 1.1.1.1.2.2 yamt struct berval salt;
955 1.1.1.1.2.2 yamt
956 1.1.1.1.2.2 yamt digest.bv_val = (char *) MD5digest;
957 1.1.1.1.2.2 yamt digest.bv_len = sizeof(MD5digest);
958 1.1.1.1.2.2 yamt salt.bv_val = saltdata;
959 1.1.1.1.2.2 yamt salt.bv_len = sizeof(saltdata);
960 1.1.1.1.2.2 yamt
961 1.1.1.1.2.2 yamt if( lutil_entropy( (unsigned char *) salt.bv_val, salt.bv_len) < 0 ) {
962 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR;
963 1.1.1.1.2.2 yamt }
964 1.1.1.1.2.2 yamt
965 1.1.1.1.2.2 yamt lutil_MD5Init( &MD5context );
966 1.1.1.1.2.2 yamt lutil_MD5Update( &MD5context,
967 1.1.1.1.2.2 yamt (const unsigned char *) passwd->bv_val, passwd->bv_len );
968 1.1.1.1.2.2 yamt lutil_MD5Update( &MD5context,
969 1.1.1.1.2.2 yamt (const unsigned char *) salt.bv_val, salt.bv_len );
970 1.1.1.1.2.2 yamt lutil_MD5Final( MD5digest, &MD5context );
971 1.1.1.1.2.2 yamt
972 1.1.1.1.2.2 yamt return pw_string64( scheme, &digest, hash, &salt );
973 1.1.1.1.2.2 yamt }
974 1.1.1.1.2.2 yamt
975 1.1.1.1.2.2 yamt static int hash_md5(
976 1.1.1.1.2.2 yamt const struct berval *scheme,
977 1.1.1.1.2.2 yamt const struct berval *passwd,
978 1.1.1.1.2.2 yamt struct berval *hash,
979 1.1.1.1.2.2 yamt const char **text )
980 1.1.1.1.2.2 yamt {
981 1.1.1.1.2.2 yamt lutil_MD5_CTX MD5context;
982 1.1.1.1.2.2 yamt unsigned char MD5digest[LUTIL_MD5_BYTES];
983 1.1.1.1.2.2 yamt
984 1.1.1.1.2.2 yamt struct berval digest;
985 1.1.1.1.2.2 yamt
986 1.1.1.1.2.2 yamt digest.bv_val = (char *) MD5digest;
987 1.1.1.1.2.2 yamt digest.bv_len = sizeof(MD5digest);
988 1.1.1.1.2.2 yamt
989 1.1.1.1.2.2 yamt lutil_MD5Init( &MD5context );
990 1.1.1.1.2.2 yamt lutil_MD5Update( &MD5context,
991 1.1.1.1.2.2 yamt (const unsigned char *) passwd->bv_val, passwd->bv_len );
992 1.1.1.1.2.2 yamt lutil_MD5Final( MD5digest, &MD5context );
993 1.1.1.1.2.2 yamt
994 1.1.1.1.2.2 yamt return pw_string64( scheme, &digest, hash, NULL );
995 1.1.1.1.2.2 yamt ;
996 1.1.1.1.2.2 yamt }
997 1.1.1.1.2.2 yamt
998 1.1.1.1.2.2 yamt #ifdef SLAPD_LMHASH
999 1.1.1.1.2.2 yamt static int hash_lanman(
1000 1.1.1.1.2.2 yamt const struct berval *scheme,
1001 1.1.1.1.2.2 yamt const struct berval *passwd,
1002 1.1.1.1.2.2 yamt struct berval *hash,
1003 1.1.1.1.2.2 yamt const char **text )
1004 1.1.1.1.2.2 yamt {
1005 1.1.1.1.2.2 yamt
1006 1.1.1.1.2.2 yamt int i;
1007 1.1.1.1.2.2 yamt char UcasePassword[15];
1008 1.1.1.1.2.2 yamt des_cblock key;
1009 1.1.1.1.2.2 yamt des_key_schedule schedule;
1010 1.1.1.1.2.2 yamt des_cblock StdText = "KGS!@#$%";
1011 1.1.1.1.2.2 yamt des_cblock PasswordHash1, PasswordHash2;
1012 1.1.1.1.2.2 yamt char PasswordHash[33];
1013 1.1.1.1.2.2 yamt
1014 1.1.1.1.2.2 yamt for( i=0; i<passwd->bv_len; i++) {
1015 1.1.1.1.2.2 yamt if(passwd->bv_val[i] == '\0') {
1016 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR; /* NUL character in password */
1017 1.1.1.1.2.2 yamt }
1018 1.1.1.1.2.2 yamt }
1019 1.1.1.1.2.2 yamt
1020 1.1.1.1.2.2 yamt if( passwd->bv_val[i] != '\0' ) {
1021 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR; /* passwd must behave like a string */
1022 1.1.1.1.2.2 yamt }
1023 1.1.1.1.2.2 yamt
1024 1.1.1.1.2.2 yamt strncpy( UcasePassword, passwd->bv_val, 14 );
1025 1.1.1.1.2.2 yamt UcasePassword[14] = '\0';
1026 1.1.1.1.2.2 yamt ldap_pvt_str2upper( UcasePassword );
1027 1.1.1.1.2.2 yamt
1028 1.1.1.1.2.2 yamt lmPasswd_to_key( UcasePassword, &key );
1029 1.1.1.1.2.2 yamt des_set_key_unchecked( &key, schedule );
1030 1.1.1.1.2.2 yamt des_ecb_encrypt( &StdText, &PasswordHash1, schedule , DES_ENCRYPT );
1031 1.1.1.1.2.2 yamt
1032 1.1.1.1.2.2 yamt lmPasswd_to_key( &UcasePassword[7], &key );
1033 1.1.1.1.2.2 yamt des_set_key_unchecked( &key, schedule );
1034 1.1.1.1.2.2 yamt des_ecb_encrypt( &StdText, &PasswordHash2, schedule , DES_ENCRYPT );
1035 1.1.1.1.2.2 yamt
1036 1.1.1.1.2.2 yamt sprintf( PasswordHash, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
1037 1.1.1.1.2.2 yamt PasswordHash1[0],PasswordHash1[1],PasswordHash1[2],PasswordHash1[3],
1038 1.1.1.1.2.2 yamt PasswordHash1[4],PasswordHash1[5],PasswordHash1[6],PasswordHash1[7],
1039 1.1.1.1.2.2 yamt PasswordHash2[0],PasswordHash2[1],PasswordHash2[2],PasswordHash2[3],
1040 1.1.1.1.2.2 yamt PasswordHash2[4],PasswordHash2[5],PasswordHash2[6],PasswordHash2[7] );
1041 1.1.1.1.2.2 yamt
1042 1.1.1.1.2.2 yamt hash->bv_val = PasswordHash;
1043 1.1.1.1.2.2 yamt hash->bv_len = 32;
1044 1.1.1.1.2.2 yamt
1045 1.1.1.1.2.2 yamt return pw_string( scheme, hash );
1046 1.1.1.1.2.2 yamt }
1047 1.1.1.1.2.2 yamt #endif /* SLAPD_LMHASH */
1048 1.1.1.1.2.2 yamt
1049 1.1.1.1.2.2 yamt #ifdef SLAPD_CRYPT
1050 1.1.1.1.2.2 yamt static int hash_crypt(
1051 1.1.1.1.2.2 yamt const struct berval *scheme,
1052 1.1.1.1.2.2 yamt const struct berval *passwd,
1053 1.1.1.1.2.2 yamt struct berval *hash,
1054 1.1.1.1.2.2 yamt const char **text )
1055 1.1.1.1.2.2 yamt {
1056 1.1.1.1.2.2 yamt unsigned char salt[32]; /* salt suitable for most anything */
1057 1.1.1.1.2.2 yamt unsigned int i;
1058 1.1.1.1.2.2 yamt char *save;
1059 1.1.1.1.2.2 yamt int rc;
1060 1.1.1.1.2.2 yamt
1061 1.1.1.1.2.2 yamt for( i=0; i<passwd->bv_len; i++) {
1062 1.1.1.1.2.2 yamt if(passwd->bv_val[i] == '\0') {
1063 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR; /* NUL character in password */
1064 1.1.1.1.2.2 yamt }
1065 1.1.1.1.2.2 yamt }
1066 1.1.1.1.2.2 yamt
1067 1.1.1.1.2.2 yamt if( passwd->bv_val[i] != '\0' ) {
1068 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR; /* passwd must behave like a string */
1069 1.1.1.1.2.2 yamt }
1070 1.1.1.1.2.2 yamt
1071 1.1.1.1.2.2 yamt if( lutil_entropy( salt, sizeof( salt ) ) < 0 ) {
1072 1.1.1.1.2.2 yamt return LUTIL_PASSWD_ERR;
1073 1.1.1.1.2.2 yamt }
1074 1.1.1.1.2.2 yamt
1075 1.1.1.1.2.2 yamt for( i=0; i< ( sizeof(salt) - 1 ); i++ ) {
1076 1.1.1.1.2.2 yamt salt[i] = crypt64[ salt[i] % (sizeof(crypt64)-1) ];
1077 1.1.1.1.2.2 yamt }
1078 1.1.1.1.2.2 yamt salt[sizeof( salt ) - 1 ] = '\0';
1079 1.1.1.1.2.2 yamt
1080 1.1.1.1.2.2 yamt if( salt_format != NULL ) {
1081 1.1.1.1.2.2 yamt /* copy the salt we made into entropy before snprintfing
1082 1.1.1.1.2.2 yamt it back into the salt */
1083 1.1.1.1.2.2 yamt char entropy[sizeof(salt)];
1084 1.1.1.1.2.2 yamt strcpy( entropy, (char *) salt );
1085 1.1.1.1.2.2 yamt snprintf( (char *) salt, sizeof(entropy), salt_format, entropy );
1086 1.1.1.1.2.2 yamt }
1087 1.1.1.1.2.2 yamt
1088 1.1.1.1.2.2 yamt rc = lutil_cryptptr( passwd->bv_val, (char *) salt, &hash->bv_val );
1089 1.1.1.1.2.2 yamt if ( rc != LUTIL_PASSWD_OK ) return rc;
1090 1.1.1.1.2.2 yamt
1091 1.1.1.1.2.2 yamt if( hash->bv_val == NULL ) return -1;
1092 1.1.1.1.2.2 yamt
1093 1.1.1.1.2.2 yamt hash->bv_len = strlen( hash->bv_val );
1094 1.1.1.1.2.2 yamt
1095 1.1.1.1.2.2 yamt save = hash->bv_val;
1096 1.1.1.1.2.2 yamt
1097 1.1.1.1.2.2 yamt if( hash->bv_len == 0 ) {
1098 1.1.1.1.2.2 yamt rc = LUTIL_PASSWD_ERR;
1099 1.1.1.1.2.2 yamt } else {
1100 1.1.1.1.2.2 yamt rc = pw_string( scheme, hash );
1101 1.1.1.1.2.2 yamt }
1102 1.1.1.1.2.2 yamt ber_memfree( save );
1103 1.1.1.1.2.2 yamt return rc;
1104 1.1.1.1.2.2 yamt }
1105 1.1.1.1.2.2 yamt #endif
1106 1.1.1.1.2.2 yamt
1107 1.1.1.1.2.2 yamt int lutil_salt_format(const char *format)
1108 1.1.1.1.2.2 yamt {
1109 1.1.1.1.2.2 yamt #ifdef SLAPD_CRYPT
1110 1.1.1.1.2.2 yamt free( salt_format );
1111 1.1.1.1.2.2 yamt
1112 1.1.1.1.2.2 yamt salt_format = format != NULL ? ber_strdup( format ) : NULL;
1113 1.1.1.1.2.2 yamt #endif
1114 1.1.1.1.2.2 yamt
1115 1.1.1.1.2.2 yamt return 0;
1116 1.1.1.1.2.2 yamt }
1117 1.1.1.1.2.2 yamt
1118 1.1.1.1.2.2 yamt #ifdef SLAPD_CLEARTEXT
1119 1.1.1.1.2.2 yamt static int hash_clear(
1120 1.1.1.1.2.2 yamt const struct berval *scheme,
1121 1.1.1.1.2.2 yamt const struct berval *passwd,
1122 1.1.1.1.2.2 yamt struct berval *hash,
1123 1.1.1.1.2.2 yamt const char **text )
1124 1.1.1.1.2.2 yamt {
1125 1.1.1.1.2.2 yamt ber_dupbv( hash, (struct berval *)passwd );
1126 1.1.1.1.2.2 yamt return LUTIL_PASSWD_OK;
1127 1.1.1.1.2.2 yamt }
1128 1.1.1.1.2.2 yamt #endif
1129 1.1.1.1.2.2 yamt
1130