#include "k5-int.h"
#include "yarrow.h"
#include "ycipher.h"
#include "enc_provider.h"
#include "assert.h"
int
krb5int_yarrow_cipher_init
(CIPHER_CTX *ctx,
unsigned const char * key)
{
size_t keybytes, keylength;
const struct krb5_enc_provider *enc = &yarrow_enc_provider;
krb5_error_code ret;
krb5_data randombits;
enc->keysize (&keybytes, &keylength);
assert (keybytes == CIPHER_KEY_SIZE);
if (ctx->key.contents) {
memset (ctx->key.contents, 0, ctx->key.length);
free (ctx->key.contents);
}
ctx->key.contents = (void *) malloc (keylength);
ctx->key.length = keylength;
if (ctx->key.contents == NULL)
return (YARROW_NOMEM);
randombits.data = (char *) key;
randombits.length = keybytes;
ret = enc->make_key (&randombits, &ctx->key);
if (ret) {
memset (ctx->key.contents, 0, ctx->key.length);
free(ctx->key.contents);
ctx->key.contents = NULL;
return (YARROW_FAIL);
}
return (YARROW_OK);
}
int krb5int_yarrow_cipher_encrypt_block
(CIPHER_CTX *ctx, const unsigned char *in,
unsigned char *out)
{
krb5_error_code ret;
krb5_data ind, outd;
const struct krb5_enc_provider *enc = &yarrow_enc_provider;
ind.data = (char *) in;
ind.length = CIPHER_BLOCK_SIZE;
outd.data = out;
outd.length = CIPHER_BLOCK_SIZE;
ret = enc->encrypt (&ctx->key, 0, &ind, &outd);
if (ret)
return YARROW_FAIL;
return YARROW_OK;
}