X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=userv-utils.git;a=blobdiff_plain;f=ipif%2Fmech-pkcs5.c;h=5116917746d560b23da3799671e88c0b5fd716b0;hp=85b586379e70e5f21c63ded960d19f312a4b8a3b;hb=2cbcd670c5dfcda374720737fa5a5cd0be93e338;hpb=f9e59051127e72847e1bee84ad52670e875f7d2f diff --git a/ipif/mech-pkcs5.c b/ipif/mech-pkcs5.c index 85b5863..5116917 100644 --- a/ipif/mech-pkcs5.c +++ b/ipif/mech-pkcs5.c @@ -1,11 +1,35 @@ /* - * PKCS#5 padding + * PKCS#5 padding mechanism for udp tunnel * - * arguments: block size to pad to, must be power of 2 + * mechanism: pkcs5 + * arguments: block size to pad to, must be power of 2 and <=128 * + * restrictions: none * encoding: append between 1 and n bytes, all of the same value being * the number of bytes appended */ +/* + * 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" @@ -21,7 +45,7 @@ static unsigned long setup(struct mechdata **md_r) { blocksize= getarg_ulong(); md->mask= blocksize - 1; - arg_assert(!md->mask & blocksize); + arg_assert(!(md->mask & blocksize)); arg_assert(blocksize <= 255); *md_r= md; @@ -58,11 +82,11 @@ static const char *mdec_pkcs5(struct mechdata *md, struct buffer *buf) { unsigned padlen; int i; - BUF_UNPREPEND(padp,buf,1); + BUF_UNAPPEND(padp,buf,1); padlen= *padp; - if (!padlen || (padlen & ~md->mask)) return "invalid length"; + if (!padlen || (padlen > md->mask+1)) return "invalid length"; - BUF_UNPREPEND(padp,buf,padlen-1); + BUF_UNAPPEND(padp,buf,padlen-1); for (i=0; i