blob: ad7951b253968c63924fc59e77d35d9c0b9869e8 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
/*
* OTP password scheme.
*
* Copyright (c) 2006 Andrey Panin <pazke@donpac.ru>
*
* This software is released under the MIT license.
*/
#include "lib.h"
#include "hex-binary.h"
#include "password-scheme.h"
#include "randgen.h"
#include "otp.h"
int password_generate_otp(const char *pw, const char *state_data,
unsigned int algo, const char **result_r)
{
struct otp_state state;
if (state_data != NULL) {
if (otp_parse_dbentry(state_data, &state) != 0)
return -1;
} else {
/* Generate new OTP credentials from plaintext */
unsigned char random_data[OTP_MAX_SEED_LEN / 2];
const char *random_hex;
random_fill(random_data, sizeof(random_data));
random_hex = binary_to_hex(random_data, sizeof(random_data));
if (i_strocpy(state.seed, random_hex, sizeof(state.seed)) < 0)
i_unreached();
state.seq = 1024;
state.algo = algo;
}
otp_hash(state.algo, state.seed, pw, state.seq, state.hash);
*result_r = otp_print_dbentry(&state);
return 0;
}
|