[BACK]Return to des3.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / ox_ntl / crypt / des

File: [local] / OpenXM / src / ox_ntl / crypt / des / des3.c (download)

Revision 1.3, Fri Jul 15 16:41:31 2005 UTC (18 years, 10 months ago) by iwane
Branch: MAIN
CVS Tags: R_1_3_1-2, RELEASE_1_3_1_13b, RELEASE_1_2_3_12, KNOPPIX_2006, HEAD, DEB_REL_1_2_3-9
Changes since 1.2: +4 -3 lines

fixed a bug at des3_dec_c()

/* $OpenXM: OpenXM/src/ox_ntl/crypt/des/des3.c,v 1.3 2005/07/15 16:41:31 iwane Exp $ */
/*
 * Triple-DES
 *   see des.c
 */

#include <stdio.h>

#include "des3.h"
#include "block.h"

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#define BLOCK 8

#define PRT(x) printf("%5s: %02x%02x%02x%02x %02x%02x%02x%02x\n", #x, x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7])

/*===========================================================*
 * KEY STRUCT
 *===========================================================*/

int
des3_keychk(des3_key *key)
{
	int ret = 1;
	int i;

	for (i = 0; i < 3; i++) {
		ret = (ret && des_keychk(key->key + i));
	}

	return (ret);
}

void
des3_keyset(const unsigned char *key, des3_key *dkey)
{
	int i;

	for (i = 0; i < 3; i++) {
		des_keyset(key + 8 * i, dkey->key + i);
	}
}




/*===========================================================*
 * BASE CRYPTO
 *===========================================================*/
/**
 * input: data: 8 byte
 */
int
des3_enc_c(const des3_key *key, const unsigned char *data, unsigned char *enc)
{
	unsigned char b1[8];
	unsigned char b2[8];

	des_enc_c(key->key + 0, data, b1);
	des_dec_c(key->key + 1, b1, b2);
	des_enc_c(key->key + 2, b2, enc);

	return (0);
}


/**
 * input: data: 8 byte
 */
int
des3_dec_c(const des3_key *key, const unsigned char *enc, unsigned char *data)
{
	unsigned char b1[8];
	unsigned char b2[8];

	des_dec_c(key->key + 2, enc, b1);
	des_enc_c(key->key + 1, b1, b2);
	des_dec_c(key->key + 0, b2, data);

	return (0);
}

/*===========================================================*
 * CRYPTO: length of input data is "64 * n" byte
 *===========================================================*/
int
des3_enc_ecb(const des3_key *key, int len, const unsigned char *data, unsigned char *buf)
{
	int ret;

	ret = crypt_ecb((void *)key, BLOCK, len, data, buf, (void *)des3_enc_c);

	return (ret);
}


int
des3_dec_ecb(const des3_key *key, int len, const unsigned char *enc, unsigned char *data)
{
	int ret;

	ret = crypt_ecb((void *)key, BLOCK, len, enc, data, (void *)des3_dec_c);

	return (ret);
}



int
des3_enc_cbc(const des3_key *key, unsigned char *iv, int len,
    const unsigned char *data, unsigned char *buf)
{
	int ret;

	ret = crypt_enc_cbc((void *)key, BLOCK, iv, len, data, buf, (void *)des3_enc_c);

	return (ret);
}


int
des3_dec_cbc(const des3_key *key, unsigned char *iv, int len,
    const unsigned char *data, unsigned char *buf)
{
	int ret;

	ret = crypt_dec_cbc((void *)key, BLOCK, iv, len, data, buf, (void *)des3_dec_c);

	return (ret);
}


int
des3_enc_cfb(const des3_key *key, int bit,
    const unsigned char *iv, int len,
    const unsigned char *data, unsigned char *buf)
{
	int ret;

	ret = crypt_cfb((void *)key, 0, bit, BLOCK, iv, len, data, buf, (void *)des3_enc_c);

	return (ret);
}

int
des3_dec_cfb(const des3_key *key, int bit,
    const unsigned char *iv, int len,
    const unsigned char *data, unsigned char *buf)
{
	int ret;

	ret = crypt_cfb((void *)key, 1, bit, BLOCK, iv, len, data, buf, (void *)des3_enc_c);

	return (ret);
}


int
des3_ofb(const des3_key *key, int bit,
    const unsigned char *iv, int len,
    const unsigned char *data,
    unsigned char *buf)
{
	int ret;
	ret = crypt_ofb((void *)key, bit, BLOCK, iv, len, data, buf, (void *)des3_enc_c);

	return (ret);
}