
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@885 ec53bebd-3082-4978-b11e-865c3cabbd6b
213 lines
4.2 KiB
C
213 lines
4.2 KiB
C
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
RCSID("$Id$");
|
|
#endif
|
|
#include "otp_locl.h"
|
|
|
|
#include "otp_md.h"
|
|
#include <md4.h>
|
|
#include <md5.h>
|
|
#include <sha.h>
|
|
|
|
/*
|
|
* Compress len bytes from md into key
|
|
*/
|
|
static void
|
|
compressmd (OtpKey key, unsigned char *md, size_t len)
|
|
{
|
|
u_char *p = key;
|
|
|
|
memset (p, 0, OTPKEYSIZE);
|
|
while(len) {
|
|
*p++ ^= *md++;
|
|
*p++ ^= *md++;
|
|
*p++ ^= *md++;
|
|
*p++ ^= *md++;
|
|
len -= 4;
|
|
if (p == key + OTPKEYSIZE)
|
|
p = key;
|
|
}
|
|
}
|
|
|
|
static int
|
|
otp_md_init (OtpKey key,
|
|
char *pwd,
|
|
char *seed,
|
|
void (*init)(void *),
|
|
void (*update)(void *, u_char *, size_t),
|
|
void (*finito)(void *, char *),
|
|
void *arg,
|
|
char *res,
|
|
size_t ressz)
|
|
{
|
|
char *p;
|
|
int len;
|
|
int i;
|
|
|
|
len = strlen(pwd) + strlen(seed);
|
|
p = malloc (len + 1);
|
|
if (p == NULL)
|
|
return -1;
|
|
strcpy (p, seed);
|
|
strcat (p, pwd);
|
|
(*init)(arg);
|
|
(*update)(arg, p, len);
|
|
(*finito)(arg, res);
|
|
free (p);
|
|
compressmd (key, res, ressz);
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
otp_md_next (OtpKey key,
|
|
void (*init)(void *),
|
|
void (*update)(void *, u_char *, size_t),
|
|
void (*finito)(void *, char *),
|
|
void *arg,
|
|
char *res,
|
|
size_t ressz)
|
|
{
|
|
(*init)(arg);
|
|
(*update)(arg, key, OTPKEYSIZE);
|
|
(*finito)(arg, res);
|
|
compressmd (key, res, ressz);
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
otp_md_hash (char *data,
|
|
size_t len,
|
|
void (*init)(void *),
|
|
void (*update)(void *, u_char *, size_t),
|
|
void (*finito)(void *, char *),
|
|
void *arg,
|
|
char *res,
|
|
size_t ressz)
|
|
{
|
|
(*init)(arg);
|
|
(*update)(arg, data, len);
|
|
(*finito)(arg, res);
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
otp_md4_init (OtpKey key, char *pwd, char *seed)
|
|
{
|
|
unsigned char res[16];
|
|
struct md4 md4;
|
|
|
|
return otp_md_init (key, pwd, seed,
|
|
(void (*)(void *))md4_init,
|
|
(void (*)(void *, u_char *, size_t))md4_update,
|
|
(void (*)(void *, char *))md4_finito,
|
|
&md4, res, sizeof(res));
|
|
}
|
|
|
|
int
|
|
otp_md4_hash (char *data,
|
|
size_t len,
|
|
char *res)
|
|
{
|
|
struct md4 md4;
|
|
|
|
return otp_md_hash (data, len,
|
|
(void (*)(void *))md4_init,
|
|
(void (*)(void *, u_char *, size_t))md4_update,
|
|
(void (*)(void *, char *))md4_finito,
|
|
&md4, res, 16);
|
|
}
|
|
|
|
int
|
|
otp_md4_next (OtpKey key)
|
|
{
|
|
unsigned char res[16];
|
|
struct md4 md4;
|
|
|
|
return otp_md_next (key,
|
|
(void (*)(void *))md4_init,
|
|
(void (*)(void *, u_char *, size_t))md4_update,
|
|
(void (*)(void *, char *))md4_finito,
|
|
&md4, res, sizeof(res));
|
|
}
|
|
|
|
|
|
int
|
|
otp_md5_init (OtpKey key, char *pwd, char *seed)
|
|
{
|
|
unsigned char res[16];
|
|
struct md5 md5;
|
|
|
|
return otp_md_init (key, pwd, seed,
|
|
(void (*)(void *))md5_init,
|
|
(void (*)(void *, u_char *, size_t))md5_update,
|
|
(void (*)(void *, char *))md5_finito,
|
|
&md5, res, sizeof(res));
|
|
}
|
|
|
|
int
|
|
otp_md5_hash (char *data,
|
|
size_t len,
|
|
char *res)
|
|
{
|
|
struct md5 md5;
|
|
|
|
return otp_md_hash (data, len,
|
|
(void (*)(void *))md5_init,
|
|
(void (*)(void *, u_char *, size_t))md5_update,
|
|
(void (*)(void *, char *))md5_finito,
|
|
&md5, res, 16);
|
|
}
|
|
|
|
int
|
|
otp_md5_next (OtpKey key)
|
|
{
|
|
unsigned char res[16];
|
|
struct md5 md5;
|
|
|
|
return otp_md_next (key,
|
|
(void (*)(void *))md5_init,
|
|
(void (*)(void *, u_char *, size_t))md5_update,
|
|
(void (*)(void *, char *))md5_finito,
|
|
&md5, res, sizeof(res));
|
|
}
|
|
|
|
int
|
|
otp_sha_init (OtpKey key, char *pwd, char *seed)
|
|
{
|
|
unsigned char res[20];
|
|
struct sha sha;
|
|
|
|
return otp_md_init (key, pwd, seed,
|
|
(void (*)(void *))sha_init,
|
|
(void (*)(void *, u_char *, size_t))sha_update,
|
|
(void (*)(void *, char *))sha_finito,
|
|
&sha, res, sizeof(res));
|
|
}
|
|
|
|
int
|
|
otp_sha_hash (char *data,
|
|
size_t len,
|
|
char *res)
|
|
{
|
|
struct sha sha;
|
|
|
|
return otp_md_hash (data, len,
|
|
(void (*)(void *))sha_init,
|
|
(void (*)(void *, u_char *, size_t))sha_update,
|
|
(void (*)(void *, char *))sha_finito,
|
|
&sha, res, 20);
|
|
}
|
|
|
|
int
|
|
otp_sha_next (OtpKey key)
|
|
{
|
|
unsigned char res[20];
|
|
struct sha sha;
|
|
|
|
return otp_md_next (key,
|
|
(void (*)(void *))sha_init,
|
|
(void (*)(void *, u_char *, size_t))sha_update,
|
|
(void (*)(void *, char *))sha_finito,
|
|
&sha, res, sizeof(res));
|
|
}
|