k5_arcfour.c revision 505d05c73a6e56769f263d4803b22eddd168ee24
/*
* Copyright 2005 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
/*
ARCFOUR cipher (based on a cipher posted on the Usenet in Spring-95).
This cipher is widely believed and has been tested to be equivalent
with the RC4 cipher from RSA Data Security, Inc. (RC4 is a trademark
of RSA Data Security)
*/
#include <k5-int.h>
#include <arcfour.h>
/* salt string used for exportable ARCFOUR */
static const char *l40 = "fortybits";
void
const struct krb5_enc_provider *enc;
const struct krb5_hash_provider *hash;
{
/* checksum + (confounder + inputlen, in even blocksize) */
}
{
switch (usage) {
case 1: /* AS-REQ PA-ENC-TIMESTAMP padata timestamp, */
return 1;
case 2: /* ticket from kdc */
return 2;
case 3: /* as-rep encrypted part */
return 8;
case 4: /* tgs-req authz data */
return 4;
case 5: /* tgs-req authz data in subkey */
return 5;
case 6: /* tgs-req authenticator cksum */
return 6;
case 7: /* tgs-req authenticator */
return 7;
case 8:
return 8;
case 9: /* tgs-rep encrypted with subkey */
return 8;
case 10: /* ap-rep authentication cksum */
return 10; /* xxx Microsoft never uses this*/
case 11: /* app-req authenticator */
return 11;
case 12: /* app-rep encrypted part */
return 12;
case 23: /* sign wrap token*/
return 13;
default:
return usage;
}
}
const struct krb5_enc_provider *enc;
const struct krb5_hash_provider *hash;
const krb5_keyblock *key;
{
krb5_error_code ret = 0;
/*
* d1 is the contents buffer for key k1.
* k1 = HMAC(input_key, salt)
*/
return (ENOMEM);
/*
* d2 is the contents of key 'k2', which is used to generate the
* checksum field. 'd2' == 'd1' when not using the exportable
* enctype. This is only needed when using the exportable
* enctype.
*/
return (ENOMEM);
}
}
/*
* d3 will hold the contents of the final key used for the
* encryption step. 'k3' is the key structure that has 'd3'
* as its 'contents' field.
* k3 = HMAC(k1, checksum)
*/
return (ENOMEM);
}
return (ENOMEM);
}
/* is "input" already blocksize aligned? if it is, then we need this
step, otherwise we do not */
return(ENOMEM);
}
/* setup convienient pointers into the allocated data */
/* begin the encryption, computer K1 */
} else {
}
#ifdef _KERNEL
#else
#endif /* _KERNEL */
if (ret != 0)
goto cleanup;
} else {
}
/* create a confounder block */
if (ret)
goto cleanup;
/*
* Compute the HMAC checksum field.
* k2 used when key->enctype==ENCTYPE_ARCFOUR_HMAC_EXP
*/
#ifdef _KERNEL
#else
#endif /* _KERNEL */
if (ret)
goto cleanup;
/*
* The final encryption key is the HMAC of the checksum
* using k1
*
* k3 = HMAC(k1, checksum);
* == or (in other terms) ==
* k3 = HMAC((HMAC(input_key,salt), HMAC(k1, plaintext));
*/
#ifdef _KERNEL
#else
#endif /* _KERNEL */
if (ret)
goto cleanup;
}
return (ret);
}
/* This is the arcfour-hmac decryption routine */
const struct krb5_enc_provider *enc;
const struct krb5_hash_provider *hash;
const krb5_keyblock *key;
{
/*
* d1 is the contents buffer for key k1.
* k1 = HMAC(input_key, salt)
*/
return (ENOMEM);
/*
* d2 is the contents of key 'k2', which is used to generate the
* checksum field. 'd2' == 'd1' when not using the exportable
* enctype. This is only needed when using the exportable
* enctype.
*/
return (ENOMEM);
}
}
/*
* d3 will hold the contents of the final key used for the
* encryption step. 'k3' is the key structure that has 'd3'
* as its 'contents' field.
* k3 = HMAC(k1, checksum)
*/
return (ENOMEM);
}
return (ENOMEM);
}
return (ENOMEM);
}
/* compute the salt */
} else {
}
#ifdef _KERNEL
#else
#endif /* _KERNEL */
if (ret)
goto cleanup;
} else {
}
#ifdef _KERNEL
#else
#endif /* _KERNEL */
if (ret)
goto cleanup;
if (ret)
goto cleanup;
#ifdef _KERNEL
#else
#endif /* _KERNEL */
if (ret)
goto cleanup;
goto cleanup;
}
}
return (ret);
}