always downcase the seed
byte-swap the SHA result git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@1502 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -50,6 +50,7 @@ RCSID("$Id$");
|
|||||||
/*
|
/*
|
||||||
* Compress len bytes from md into key
|
* Compress len bytes from md into key
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
compressmd (OtpKey key, unsigned char *md, size_t len)
|
compressmd (OtpKey key, unsigned char *md, size_t len)
|
||||||
{
|
{
|
||||||
@@ -86,6 +87,7 @@ otp_md_init (OtpKey key,
|
|||||||
if (p == NULL)
|
if (p == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
strcpy (p, seed);
|
strcpy (p, seed);
|
||||||
|
strlwr (p);
|
||||||
strcat (p, pwd);
|
strcat (p, pwd);
|
||||||
(*init)(arg);
|
(*init)(arg);
|
||||||
(*update)(arg, p, len);
|
(*update)(arg, p, len);
|
||||||
@@ -208,6 +210,28 @@ otp_md5_next (OtpKey key)
|
|||||||
&md5, res, sizeof(res));
|
&md5, res, sizeof(res));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For histerical reasons, in the OTP definition it's said that the
|
||||||
|
* result from SHA must be stored in little-endian order. See
|
||||||
|
* draft-ietf-otp-01.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
sha_finito_little_endian (struct sha *m, void *res)
|
||||||
|
{
|
||||||
|
u_int32_t tmp[20];
|
||||||
|
unsigned char *p = res;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
sha_finito (m, tmp);
|
||||||
|
for (i = 0, j = 0; j < 20; i++, j += 4) {
|
||||||
|
p[j] = (unsigned char)(tmp[i] & 0xff);
|
||||||
|
p[j+1] = (unsigned char)((tmp[i] >> 8) & 0xff);
|
||||||
|
p[j+2] = (unsigned char)((tmp[i] >> 16) & 0xff);
|
||||||
|
p[j+3] = (unsigned char)((tmp[i] >> 24) & 0xff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
otp_sha_init (OtpKey key, char *pwd, char *seed)
|
otp_sha_init (OtpKey key, char *pwd, char *seed)
|
||||||
{
|
{
|
||||||
@@ -217,7 +241,7 @@ otp_sha_init (OtpKey key, char *pwd, char *seed)
|
|||||||
return otp_md_init (key, pwd, seed,
|
return otp_md_init (key, pwd, seed,
|
||||||
(void (*)(void *))sha_init,
|
(void (*)(void *))sha_init,
|
||||||
(void (*)(void *, void *, size_t))sha_update,
|
(void (*)(void *, void *, size_t))sha_update,
|
||||||
(void (*)(void *, void *))sha_finito,
|
(void (*)(void *, void *))sha_finito_little_endian,
|
||||||
&sha, res, sizeof(res));
|
&sha, res, sizeof(res));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -231,7 +255,7 @@ otp_sha_hash (char *data,
|
|||||||
return otp_md_hash (data, len,
|
return otp_md_hash (data, len,
|
||||||
(void (*)(void *))sha_init,
|
(void (*)(void *))sha_init,
|
||||||
(void (*)(void *, void *, size_t))sha_update,
|
(void (*)(void *, void *, size_t))sha_update,
|
||||||
(void (*)(void *, void *))sha_finito,
|
(void (*)(void *, void *))sha_finito_little_endian,
|
||||||
&sha, res, 20);
|
&sha, res, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -244,6 +268,6 @@ otp_sha_next (OtpKey key)
|
|||||||
return otp_md_next (key,
|
return otp_md_next (key,
|
||||||
(void (*)(void *))sha_init,
|
(void (*)(void *))sha_init,
|
||||||
(void (*)(void *, void *, size_t))sha_update,
|
(void (*)(void *, void *, size_t))sha_update,
|
||||||
(void (*)(void *, void *))sha_finito,
|
(void (*)(void *, void *))sha_finito_little_endian,
|
||||||
&sha, res, sizeof(res));
|
&sha, res, sizeof(res));
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user