summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorTheodore Tso <tytso@mit.edu>1994-06-10 18:33:51 +0000
committerTheodore Tso <tytso@mit.edu>1994-06-10 18:33:51 +0000
commit62d4c19ae4464d001d5736b813d02286f2fe32ce (patch)
tree7a058f7c8ce7af22eac84e4b2eda1e0f3567460b /src/lib
parent117e602f95c0bf7c6b745888de2ed631ebce9a32 (diff)
downloadkrb5-62d4c19ae4464d001d5736b813d02286f2fe32ce.tar.gz
krb5-62d4c19ae4464d001d5736b813d02286f2fe32ce.tar.xz
krb5-62d4c19ae4464d001d5736b813d02286f2fe32ce.zip
Clean up memory handling, and improve the randomness of the sequence number
by encrypting the time and date, instead of all zeros. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@3703 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/krb5/krb/gen_seqnum.c50
1 files changed, 20 insertions, 30 deletions
diff --git a/src/lib/krb5/krb/gen_seqnum.c b/src/lib/krb5/krb/gen_seqnum.c
index d4ee4b826..4ab0e9c3e 100644
--- a/src/lib/krb5/krb/gen_seqnum.c
+++ b/src/lib/krb5/krb/gen_seqnum.c
@@ -47,15 +47,14 @@ krb5_int32 *seqno;
{
krb5_pointer random_state;
krb5_encrypt_block eblock;
- krb5_keyblock *subkey;
+ krb5_keyblock *subkey = 0;
krb5_error_code retval;
struct tval {
krb5_int32 seconds;
krb5_int32 microseconds;
} timenow;
- krb5_octet *intmp, *outtmp;
+ krb5_octet *intmp = 0, *outtmp = 0;
int esize;
- char *outseqno;
if (!valid_keytype(key->keytype))
return KRB5_PROG_KEYTYPE_NOSUPP;
@@ -78,19 +77,17 @@ krb5_int32 *seqno;
esize = krb5_encrypt_size(sizeof(timenow), eblock.crypto_entry);
intmp = (krb5_octet *)malloc(esize);
if (!intmp) {
- krb5_free_keyblock(subkey);
- return ENOMEM;
+ retval = ENOMEM;
+ goto cleanup;
}
outtmp = (krb5_octet *)malloc(esize);
if (!outtmp) {
- krb5_xfree(intmp);
- krb5_free_keyblock(subkey);
- return ENOMEM;
+ retval = ENOMEM;
+ goto cleanup;
}
if (retval = krb5_process_key(&eblock, subkey)) {
goto cleanup;
}
- outseqno = (char *)seqno;
if (retval = krb5_us_timeofday(&timenow.seconds,
&timenow.microseconds)) {
@@ -98,28 +95,21 @@ krb5_int32 *seqno;
}
memcpy((char *)intmp, (char *)&timenow, sizeof(timenow));
- while (outseqno < (char *)(seqno+1)) {
- memset((char *)intmp, 0, esize);
-
- if (retval = krb5_encrypt((krb5_pointer)intmp,
- (krb5_pointer)outtmp,
- sizeof(timenow),
- &eblock,
- 0)) {
- (void) krb5_finish_key(&eblock);
- goto cleanup;
- }
- memcpy(outseqno, (char *)outtmp, MIN((char *)(seqno+1)-outseqno,
- esize));
- outseqno += MIN((char *)(seqno+1)-outseqno, esize);
- /* chain along */
- memcpy((char *)intmp,(char *)outtmp,esize);
- }
+ retval = krb5_encrypt((krb5_pointer)intmp, (krb5_pointer)outtmp,
+ sizeof(timenow), &eblock, 0);
(void) krb5_finish_key(&eblock);
- cleanup:
- krb5_free_keyblock(subkey);
- krb5_xfree(intmp);
- krb5_xfree(outtmp);
+ if (retval)
+ goto cleanup;
+
+ memcpy((char *) seqno, (char *)outtmp, sizeof(krb5_int32));
+
+cleanup:
+ if (subkey)
+ krb5_free_keyblock(subkey);
+ if (intmp)
+ krb5_xfree(intmp);
+ if (outtmp)
+ krb5_xfree(outtmp);
return retval;
}