new files
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@885 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
212
lib/otp/otp_md.c
Normal file
212
lib/otp/otp_md.c
Normal file
@@ -0,0 +1,212 @@
|
||||
#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));
|
||||
}
|
Reference in New Issue
Block a user