]> git.sur5r.net Git - openldap/blob - contrib/slapd-modules/passwd/netscape.c
Sync with HEAD
[openldap] / contrib / slapd-modules / passwd / netscape.c
1 /* $OpenLDAP$ */
2 /*
3  * Copyright 1998-2005 The OpenLDAP Foundation.
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted only as authorized by the OpenLDAP
8  * Public License.
9  *
10  * A copy of this license is available in the file LICENSE in the
11  * top-level directory of the distribution or, alternatively, at
12  * <http://www.OpenLDAP.org/license.html>.
13  */
14
15 #include <unistd.h>
16
17 #include <lber.h>
18 #include <lber_pvt.h>
19 #include "lutil.h"
20 #include "lutil_md5.h"
21 #include <ac/string.h>
22
23 static LUTIL_PASSWD_CHK_FUNC chk_ns_mta_md5;
24 static const struct berval scheme = BER_BVC("{NS-MTA-MD5}");
25
26 #define NS_MTA_MD5_PASSLEN      64
27 static int chk_ns_mta_md5(
28         const struct berval *scheme,
29         const struct berval *passwd,
30         const struct berval *cred,
31         const char **text )
32 {
33         lutil_MD5_CTX MD5context;
34         unsigned char MD5digest[LUTIL_MD5_BYTES], c;
35         char buffer[LUTIL_MD5_BYTES*2];
36         int i;
37
38         if( passwd->bv_len != NS_MTA_MD5_PASSLEN ) {
39                 return LUTIL_PASSWD_ERR;
40         }
41
42         /* hash credentials with salt */
43         lutil_MD5Init(&MD5context);
44         lutil_MD5Update(&MD5context,
45                 (const unsigned char *) &passwd->bv_val[32],
46                 32 );
47
48         c = 0x59;
49         lutil_MD5Update(&MD5context,
50                 (const unsigned char *) &c,
51                 1 );
52
53         lutil_MD5Update(&MD5context,
54                 (const unsigned char *) cred->bv_val,
55                 cred->bv_len );
56
57         c = 0xF7;
58         lutil_MD5Update(&MD5context,
59                 (const unsigned char *) &c,
60                 1 );
61
62         lutil_MD5Update(&MD5context,
63                 (const unsigned char *) &passwd->bv_val[32],
64                 32 );
65
66         lutil_MD5Final(MD5digest, &MD5context);
67
68         for( i=0; i < sizeof( MD5digest ); i++ ) {
69                 buffer[i+i]   = "0123456789abcdef"[(MD5digest[i]>>4) & 0x0F]; 
70                 buffer[i+i+1] = "0123456789abcdef"[ MD5digest[i] & 0x0F]; 
71         }
72
73         /* compare */
74         return memcmp((char *)passwd->bv_val,
75                 (char *)buffer, sizeof(buffer)) ? LUTIL_PASSWD_ERR : LUTIL_PASSWD_OK;
76 }
77
78 int init_module(int argc, char *argv[]) {
79         return lutil_passwd_add( (struct berval *)&scheme, chk_ns_mta_md5, NULL );
80 }