sync blowfish function prototype between i386 assembly and C.

From: YAMAMOTO Takashi <yamt@mwd.biglobe.ne.jp>
This commit is contained in:
itojun 2002-02-27 01:32:17 +00:00
parent 0357a44190
commit 2ff9b43758
4 changed files with 79 additions and 63 deletions

View File

@ -57,7 +57,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: bf_enc.c,v 1.5 2001/11/13 01:40:08 lukem Exp $");
__KERNEL_RCSID(0, "$NetBSD: bf_enc.c,v 1.6 2002/02/27 01:32:17 itojun Exp $");
#include <sys/types.h>
#include <crypto/blowfish/blowfish.h>
@ -75,10 +75,9 @@ to modify the code.
/* XXX "data" is host endian */
void
BF_encrypt(data, key, encrypt)
BF_encrypt(data, key)
BF_LONG *data;
BF_KEY *key;
int encrypt;
{
register BF_LONG l, r, *p, *s;
@ -87,57 +86,73 @@ BF_encrypt(data, key, encrypt)
l = data[0];
r = data[1];
if (encrypt) {
l^=p[0];
BF_ENC(r, l, s, p[ 1]);
BF_ENC(l, r, s, p[ 2]);
BF_ENC(r, l, s, p[ 3]);
BF_ENC(l, r, s, p[ 4]);
BF_ENC(r, l, s, p[ 5]);
BF_ENC(l, r, s, p[ 6]);
BF_ENC(r, l, s, p[ 7]);
BF_ENC(l, r, s, p[ 8]);
BF_ENC(r, l, s, p[ 9]);
BF_ENC(l, r, s, p[10]);
BF_ENC(r, l, s, p[11]);
BF_ENC(l, r, s, p[12]);
BF_ENC(r, l, s, p[13]);
BF_ENC(l, r, s, p[14]);
BF_ENC(r, l, s, p[15]);
BF_ENC(l, r, s, p[16]);
l^=p[0];
BF_ENC(r, l, s, p[ 1]);
BF_ENC(l, r, s, p[ 2]);
BF_ENC(r, l, s, p[ 3]);
BF_ENC(l, r, s, p[ 4]);
BF_ENC(r, l, s, p[ 5]);
BF_ENC(l, r, s, p[ 6]);
BF_ENC(r, l, s, p[ 7]);
BF_ENC(l, r, s, p[ 8]);
BF_ENC(r, l, s, p[ 9]);
BF_ENC(l, r, s, p[10]);
BF_ENC(r, l, s, p[11]);
BF_ENC(l, r, s, p[12]);
BF_ENC(r, l, s, p[13]);
BF_ENC(l, r, s, p[14]);
BF_ENC(r, l, s, p[15]);
BF_ENC(l, r, s, p[16]);
#if BF_ROUNDS == 20
BF_ENC(r, l, s, p[17]);
BF_ENC(l, r, s, p[18]);
BF_ENC(r, l, s, p[19]);
BF_ENC(l, r, s, p[20]);
BF_ENC(r, l, s, p[17]);
BF_ENC(l, r, s, p[18]);
BF_ENC(r, l, s, p[19]);
BF_ENC(l, r, s, p[20]);
#endif
r ^= p[BF_ROUNDS + 1];
} else {
l ^= p[BF_ROUNDS + 1];
#if BF_ROUNDS == 20
BF_ENC(r, l, s, p[20]);
BF_ENC(l, r, s, p[19]);
BF_ENC(r, l, s, p[18]);
BF_ENC(l, r, s, p[17]);
#endif
BF_ENC(r, l, s, p[16]);
BF_ENC(l, r, s, p[15]);
BF_ENC(r, l, s, p[14]);
BF_ENC(l, r, s, p[13]);
BF_ENC(r, l, s, p[12]);
BF_ENC(l, r, s, p[11]);
BF_ENC(r, l, s, p[10]);
BF_ENC(l, r, s, p[ 9]);
BF_ENC(r, l, s, p[ 8]);
BF_ENC(l, r, s, p[ 7]);
BF_ENC(r, l, s, p[ 6]);
BF_ENC(l, r, s, p[ 5]);
BF_ENC(r, l, s, p[ 4]);
BF_ENC(l, r, s, p[ 3]);
BF_ENC(r, l, s, p[ 2]);
BF_ENC(l, r, s, p[ 1]);
r ^= p[0];
}
r ^= p[BF_ROUNDS + 1];
data[1] = l & 0xffffffff;
data[0] = r & 0xffffffff;
}
/* XXX "data" is host endian */
void
BF_decrypt(data, key)
BF_LONG *data;
BF_KEY *key;
{
register BF_LONG l, r, *p, *s;
p = key->P;
s= &key->S[0];
l = data[0];
r = data[1];
l ^= p[BF_ROUNDS + 1];
#if BF_ROUNDS == 20
BF_ENC(r, l, s, p[20]);
BF_ENC(l, r, s, p[19]);
BF_ENC(r, l, s, p[18]);
BF_ENC(l, r, s, p[17]);
#endif
BF_ENC(r, l, s, p[16]);
BF_ENC(l, r, s, p[15]);
BF_ENC(r, l, s, p[14]);
BF_ENC(l, r, s, p[13]);
BF_ENC(r, l, s, p[12]);
BF_ENC(l, r, s, p[11]);
BF_ENC(r, l, s, p[10]);
BF_ENC(l, r, s, p[ 9]);
BF_ENC(r, l, s, p[ 8]);
BF_ENC(l, r, s, p[ 7]);
BF_ENC(r, l, s, p[ 6]);
BF_ENC(l, r, s, p[ 5]);
BF_ENC(r, l, s, p[ 4]);
BF_ENC(l, r, s, p[ 3]);
BF_ENC(r, l, s, p[ 2]);
BF_ENC(l, r, s, p[ 1]);
r ^= p[0];
data[1] = l & 0xffffffff;
data[0] = r & 0xffffffff;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: bf_skey.c,v 1.3 2001/11/13 01:40:08 lukem Exp $ */
/* $NetBSD: bf_skey.c,v 1.4 2002/02/27 01:32:17 itojun Exp $ */
/* $KAME: bf_skey.c,v 1.5 2000/11/06 13:58:08 itojun Exp $ */
/* crypto/bf/bf_skey.c */
@ -60,7 +60,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: bf_skey.c,v 1.3 2001/11/13 01:40:08 lukem Exp $");
__KERNEL_RCSID(0, "$NetBSD: bf_skey.c,v 1.4 2002/02/27 01:32:17 itojun Exp $");
#include <sys/types.h>
#include <sys/time.h>
@ -113,14 +113,14 @@ BF_set_key(key, len, data)
in[0] = 0L;
in[1] = 0L;
for (i = 0; i < BF_ROUNDS + 2; i += 2) {
BF_encrypt(in, key, BF_ENCRYPT);
BF_encrypt(in, key);
p[i ] = in[0];
p[i+1] = in[1];
}
p = key->S;
for (i = 0; i < 4 * 256; i += 2) {
BF_encrypt(in, key, BF_ENCRYPT);
BF_encrypt(in, key);
p[i ] = in[0];
p[i+1] = in[1];
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: blowfish.h,v 1.4 2001/09/09 11:01:01 tls Exp $ */
/* $NetBSD: blowfish.h,v 1.5 2002/02/27 01:32:17 itojun Exp $ */
/* $KAME: blowfish.h,v 1.10 2000/09/18 21:21:20 itojun Exp $ */
/* crypto/bf/blowfish.h */
@ -81,7 +81,8 @@ typedef struct bf_key_st {
} BF_KEY;
void BF_set_key __P((BF_KEY *, int, unsigned char *));
void BF_encrypt __P((BF_LONG *, BF_KEY *, int));
void BF_encrypt __P((BF_LONG *, BF_KEY *));
void BF_decrypt __P((BF_LONG *, BF_KEY *));
void BF_cbc_encrypt(const unsigned char *, unsigned char *, long,
const BF_KEY *, unsigned char *, int);

View File

@ -1,4 +1,4 @@
/* $NetBSD: esp_core.c,v 1.20 2001/12/21 08:54:52 itojun Exp $ */
/* $NetBSD: esp_core.c,v 1.21 2002/02/27 01:32:17 itojun Exp $ */
/* $KAME: esp_core.c,v 1.53 2001/11/27 09:47:30 sakane Exp $ */
/*
@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: esp_core.c,v 1.20 2001/12/21 08:54:52 itojun Exp $");
__KERNEL_RCSID(0, "$NetBSD: esp_core.c,v 1.21 2002/02/27 01:32:17 itojun Exp $");
#include "opt_inet.h"
@ -464,13 +464,13 @@ esp_blowfish_blockdecrypt(algo, sav, s, d)
u_int8_t *s;
u_int8_t *d;
{
/* HOLY COW! BF_encrypt() takes values in host byteorder */
/* HOLY COW! BF_decrypt() takes values in host byteorder */
BF_LONG t[2];
bcopy(s, t, sizeof(t));
t[0] = ntohl(t[0]);
t[1] = ntohl(t[1]);
BF_encrypt(t, (BF_KEY *)sav->sched, BF_DECRYPT);
BF_decrypt(t, (BF_KEY *)sav->sched);
t[0] = htonl(t[0]);
t[1] = htonl(t[1]);
bcopy(t, d, sizeof(t));
@ -490,7 +490,7 @@ esp_blowfish_blockencrypt(algo, sav, s, d)
bcopy(s, t, sizeof(t));
t[0] = ntohl(t[0]);
t[1] = ntohl(t[1]);
BF_encrypt(t, (BF_KEY *)sav->sched, BF_ENCRYPT);
BF_encrypt(t, (BF_KEY *)sav->sched);
t[0] = htonl(t[0]);
t[1] = htonl(t[1]);
bcopy(t, d, sizeof(t));