X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=ipif%2Fmech-blowfish.c;h=69122221fd1f860038e8291e4ee4c15b42c62a3a;hb=HEAD;hp=7447cadb1d888a3ccd729f897c720ba9e5ca0018;hpb=0f4b558c78aae6fda9f52287e1b53483e9435903;p=userv-utils.git diff --git a/ipif/mech-blowfish.c b/ipif/mech-blowfish.c index 7447cad..6912222 100644 --- a/ipif/mech-blowfish.c +++ b/ipif/mech-blowfish.c @@ -1,25 +1,49 @@ /* - * Blowfish + * Blowfish mechanism for udp tunnel * + * mechanisms: blowfish-cbc, blowfish-cbcmac * arguments: key size in bits (must be multiple of 8) * * key values: 8 byte random IV and n byte random key * + * restrictions: plaintext length must be multiple of block size (8 bytes) * encoding: do CBC encryption overwriting message * encoding for MAC: do CBC and prepend last ciphertext block */ +/* + * This file is part of ipif, part of userv-utils + * + * Copyright 1996-2013 Ian Jackson + * Copyright 1998 David Damerell + * Copyright 1999,2003 + * Chancellor Masters and Scholars of the University of Cambridge + * Copyright 2010 Tony Finch + * + * 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 3 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, see http://www.gnu.org/licenses/. + */ #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]; XMALLOC(md); @@ -29,12 +53,10 @@ static void mds_blowfish(struct mechdata **md_r) { 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; } @@ -62,6 +84,7 @@ static void mes_bfmac(struct mechdata **md_r, int *maxprefix_io, int *maxsuffix_ #define FOREACH_BLOCK(func,inptr,outptr) \ { \ unsigned char *ptr; \ + blowfish_cbc_setiv(&md->cbc, md->iv); \ for (ptr= buf->start; \ ptr < buf->start + msgsize; \ ptr += BLOWFISH_BLOCKBYTES) { \