1 /* $NetBSD: otp_db.c,v 1.1.1.2 2014/04/24 12:45:51 pettai Exp $ */
4 * Copyright (c) 1995, 1996, 1997, 1998 Kungliga Tekniska Högskolan
5 * (Royal Institute of Technology, Stockholm, Sweden).
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * 3. Neither the name of the Institute nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
43 #if !defined(HAVE_NDBM) && !defined(HAVE_DB_NDBM)
44 #include "ndbm_wrap.h"
56 for(i
= 0; i
< RETRIES
; ++i
) {
59 lock
= open (OTP_DB_LOCK
, O_WRONLY
| O_CREAT
| O_EXCL
, 0666);
64 if (stat (OTP_DB_LOCK
, &statbuf
) == 0) {
65 if (time(NULL
) - statbuf
.st_mtime
> OTP_DB_TIMEOUT
)
73 ret
= dbm_open (OTP_DB
, O_RDWR
| O_CREAT
, 0600);
80 otp_db_close (void *dbm
)
82 dbm_close ((DBM
*)dbm
);
87 * Remove this entry from the database.
92 otp_delete (void *v
, OtpContext
*ctx
)
97 key
.dsize
= strlen(ctx
->user
);
100 return dbm_delete(dbm
, key
);
104 * Read this entry from the database and lock it if lockp.
108 otp_get_internal (void *v
, OtpContext
*ctx
, int lockp
)
115 key
.dsize
= strlen(ctx
->user
);
116 key
.dptr
= ctx
->user
;
118 dat
= dbm_fetch (dbm
, key
);
119 if (dat
.dptr
== NULL
) {
120 ctx
->err
= "Entry not found";
125 memcpy (&then
, p
, sizeof(then
));
126 ctx
->lock_time
= then
;
129 if (then
&& now
- then
< OTP_USER_TIMEOUT
) {
130 ctx
->err
= "Entry locked";
133 memcpy (p
, &now
, sizeof(now
));
136 ctx
->alg
= otp_find_alg (p
);
137 if (ctx
->alg
== NULL
) {
138 ctx
->err
= "Bad algorithm";
143 unsigned char *up
= (unsigned char *)p
;
144 ctx
->n
= (up
[0] << 24) | (up
[1] << 16) | (up
[2] << 8) | up
[3];
147 memcpy (ctx
->key
, p
, OTPKEYSIZE
);
149 strlcpy (ctx
->seed
, p
, sizeof(ctx
->seed
));
151 return dbm_store (dbm
, key
, dat
, DBM_REPLACE
);
161 otp_get (void *v
, OtpContext
*ctx
)
163 return otp_get_internal (v
, ctx
, 1);
167 * Get and don't lock.
171 otp_simple_get (void *v
, OtpContext
*ctx
)
173 return otp_get_internal (v
, ctx
, 0);
177 * Write this entry to the database.
181 otp_put (void *v
, OtpContext
*ctx
)
189 key
.dsize
= strlen(ctx
->user
);
190 key
.dptr
= ctx
->user
;
195 if (rem
< sizeof(zero
))
197 memcpy (p
, &zero
, sizeof(zero
));
200 len
= strlen(ctx
->alg
->name
) + 1;
204 strlcpy (p
, ctx
->alg
->name
, rem
);
211 unsigned char *up
= (unsigned char *)p
;
212 *up
++ = (ctx
->n
>> 24) & 0xFF;
213 *up
++ = (ctx
->n
>> 16) & 0xFF;
214 *up
++ = (ctx
->n
>> 8) & 0xFF;
215 *up
++ = (ctx
->n
>> 0) & 0xFF;
220 if (rem
< OTPKEYSIZE
)
222 memcpy (p
, ctx
->key
, OTPKEYSIZE
);
226 len
= strlen(ctx
->seed
) + 1;
229 strlcpy (p
, ctx
->seed
, rem
);
234 return dbm_store (dbm
, key
, dat
, DBM_REPLACE
);