X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=ipif%2Fmech-blowfish.c;h=b1cb19222ef245780c81803aa841e984ff419529;hb=92bbf44b78dc7ad8a9372a27571e0cb9b7cf5ad3;hp=898abe67386e331ec020020cc187cf4ae2bc45bb;hpb=1fb3cba0b41ae774f83c11d2a9c23b12b2c87d1a;p=userv-utils.git diff --git a/ipif/mech-blowfish.c b/ipif/mech-blowfish.c index 898abe6..b1cb192 100644 --- a/ipif/mech-blowfish.c +++ b/ipif/mech-blowfish.c @@ -1,5 +1,5 @@ /* - * Blowfish + * Blowfish mechanism for udp tunnel * * arguments: key size in bits (must be multiple of 8) * @@ -8,33 +8,48 @@ * encoding: do CBC encryption overwriting message * encoding for MAC: do CBC and prepend last ciphertext block */ +/* + * Copyright (C) 2000 Ian Jackson + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with userv-utils; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ -#include "mech.h" +#include "forwarder.h" #include "blowfish.h" struct mechdata { + unsigned char iv[BLOWFISH_BLOCKBYTES]; struct blowfish_cbc_state cbc; }; static void mds_blowfish(struct mechdata **md_r) { struct mechdata *md; unsigned long keysize; - unsigned char iv[BLOWFISH_BLOCKBYTES]; unsigned char key[BLOWFISH_MAXKEYBYTES]; - md= xmalloc(sizeof(md)); + XMALLOC(md); keysize= getarg_ulong(); arg_assert(!(keysize & 7)); keysize >>= 3; arg_assert(keysize > 0 && keysize <= BLOWFISH_MAXKEYBYTES); - random_key(iv,sizeof(iv)); + random_key(md->iv,sizeof(md->iv)); random_key(key,keysize); blowfish_loadkey(&md->cbc.ek, key,keysize); - blowfish_cbc_setiv(&md->cbc, iv); - *md_r= md; } @@ -53,18 +68,21 @@ static void mes_bfmac(struct mechdata **md_r, int *maxprefix_io, int *maxsuffix_ #define MSGSIZE_OUT \ msgsize= buf->size; \ - arg_assert(!(msgsize & ~BLOWFISH_BLOCKBYTES)); + arg_assert(!(msgsize & (BLOWFISH_BLOCKBYTES-1))); #define MSGSIZE_IN \ msgsize= buf->size; \ - if (msgsize & ~BLOWFISH_BLOCKBYTES) return "not multiple of block size" + if (msgsize & (BLOWFISH_BLOCKBYTES-1)) return "not multiple of block size" #define FOREACH_BLOCK(func,inptr,outptr) \ { \ unsigned char *ptr; \ - ptr= buf->start; \ - while (ptr < buf->start + msgsize) \ + blowfish_cbc_setiv(&md->cbc, md->iv); \ + for (ptr= buf->start; \ + ptr < buf->start + msgsize; \ + ptr += BLOWFISH_BLOCKBYTES) { \ func(&md->cbc,inptr,outptr); \ + } \ } static void menc_blowfish(struct mechdata *md, struct buffer *buf) {