|
Packit |
fd8b60 |
/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
Packit |
fd8b60 |
/*
|
|
Packit |
fd8b60 |
* Copyright (C) 1998 by the FundsXpress, INC.
|
|
Packit |
fd8b60 |
*
|
|
Packit |
fd8b60 |
* All rights reserved.
|
|
Packit |
fd8b60 |
*
|
|
Packit |
fd8b60 |
* Export of this software from the United States of America may require
|
|
Packit |
fd8b60 |
* a specific license from the United States Government. It is the
|
|
Packit |
fd8b60 |
* responsibility of any person or organization contemplating export to
|
|
Packit |
fd8b60 |
* obtain such a license before exporting.
|
|
Packit |
fd8b60 |
*
|
|
Packit |
fd8b60 |
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
|
|
Packit |
fd8b60 |
* distribute this software and its documentation for any purpose and
|
|
Packit |
fd8b60 |
* without fee is hereby granted, provided that the above copyright
|
|
Packit |
fd8b60 |
* notice appear in all copies and that both that copyright notice and
|
|
Packit |
fd8b60 |
* this permission notice appear in supporting documentation, and that
|
|
Packit |
fd8b60 |
* the name of FundsXpress. not be used in advertising or publicity pertaining
|
|
Packit |
fd8b60 |
* to distribution of the software without specific, written prior
|
|
Packit |
fd8b60 |
* permission. FundsXpress makes no representations about the suitability of
|
|
Packit |
fd8b60 |
* this software for any purpose. It is provided "as is" without express
|
|
Packit |
fd8b60 |
* or implied warranty.
|
|
Packit |
fd8b60 |
*
|
|
Packit |
fd8b60 |
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
|
|
Packit |
fd8b60 |
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
|
Packit |
fd8b60 |
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
Packit |
fd8b60 |
*/
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
#include "crypto_int.h"
|
|
Packit |
fd8b60 |
#include "des_int.h"
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
static krb5_error_code
|
|
Packit |
fd8b60 |
validate_and_schedule(krb5_key key, const krb5_data *ivec,
|
|
Packit |
fd8b60 |
const krb5_crypto_iov *data, size_t num_data,
|
|
Packit |
fd8b60 |
mit_des3_key_schedule *schedule)
|
|
Packit |
fd8b60 |
{
|
|
Packit |
fd8b60 |
if (key->keyblock.length != 24)
|
|
Packit |
fd8b60 |
return(KRB5_BAD_KEYSIZE);
|
|
Packit |
fd8b60 |
if (iov_total_length(data, num_data, FALSE) % 8 != 0)
|
|
Packit |
fd8b60 |
return(KRB5_BAD_MSIZE);
|
|
Packit |
fd8b60 |
if (ivec && (ivec->length != 8))
|
|
Packit |
fd8b60 |
return(KRB5_BAD_MSIZE);
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
switch (mit_des3_key_sched(*(mit_des3_cblock *)key->keyblock.contents,
|
|
Packit |
fd8b60 |
*schedule)) {
|
|
Packit |
fd8b60 |
case -1:
|
|
Packit |
fd8b60 |
return(KRB5DES_BAD_KEYPAR);
|
|
Packit |
fd8b60 |
case -2:
|
|
Packit |
fd8b60 |
return(KRB5DES_WEAK_KEY);
|
|
Packit |
fd8b60 |
}
|
|
Packit |
fd8b60 |
return 0;
|
|
Packit |
fd8b60 |
}
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
static krb5_error_code
|
|
Packit |
fd8b60 |
k5_des3_encrypt(krb5_key key, const krb5_data *ivec, krb5_crypto_iov *data,
|
|
Packit |
fd8b60 |
size_t num_data)
|
|
Packit |
fd8b60 |
{
|
|
Packit |
fd8b60 |
mit_des3_key_schedule schedule;
|
|
Packit |
fd8b60 |
krb5_error_code err;
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
err = validate_and_schedule(key, ivec, data, num_data, &schedule);
|
|
Packit |
fd8b60 |
if (err)
|
|
Packit |
fd8b60 |
return err;
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
/* this has a return value, but the code always returns zero */
|
|
Packit |
fd8b60 |
krb5int_des3_cbc_encrypt(data, num_data,
|
|
Packit |
fd8b60 |
schedule[0], schedule[1], schedule[2],
|
|
Packit |
fd8b60 |
ivec != NULL ? (unsigned char *) ivec->data :
|
|
Packit |
fd8b60 |
NULL);
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
zap(schedule, sizeof(schedule));
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
return(0);
|
|
Packit |
fd8b60 |
}
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
static krb5_error_code
|
|
Packit |
fd8b60 |
k5_des3_decrypt(krb5_key key, const krb5_data *ivec, krb5_crypto_iov *data,
|
|
Packit |
fd8b60 |
size_t num_data)
|
|
Packit |
fd8b60 |
{
|
|
Packit |
fd8b60 |
mit_des3_key_schedule schedule;
|
|
Packit |
fd8b60 |
krb5_error_code err;
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
err = validate_and_schedule(key, ivec, data, num_data, &schedule);
|
|
Packit |
fd8b60 |
if (err)
|
|
Packit |
fd8b60 |
return err;
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
/* this has a return value, but the code always returns zero */
|
|
Packit |
fd8b60 |
krb5int_des3_cbc_decrypt(data, num_data,
|
|
Packit |
fd8b60 |
schedule[0], schedule[1], schedule[2],
|
|
Packit |
fd8b60 |
ivec != NULL ? (unsigned char *) ivec->data :
|
|
Packit |
fd8b60 |
NULL);
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
zap(schedule, sizeof(schedule));
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
return 0;
|
|
Packit |
fd8b60 |
}
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
const struct krb5_enc_provider krb5int_enc_des3 = {
|
|
Packit |
fd8b60 |
8,
|
|
Packit |
fd8b60 |
21, 24,
|
|
Packit |
fd8b60 |
k5_des3_encrypt,
|
|
Packit |
fd8b60 |
k5_des3_decrypt,
|
|
Packit |
fd8b60 |
NULL,
|
|
Packit |
fd8b60 |
krb5int_des_init_state,
|
|
Packit |
fd8b60 |
krb5int_default_free_state
|
|
Packit |
fd8b60 |
};
|