/*
- * 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 <ijackson@chiark.greenend.org.uk>
+ * Copyright 1998 David Damerell <damerell@chiark.greenend.org.uk>
+ * Copyright 1999,2003
+ * Chancellor Masters and Scholars of the University of Cambridge
+ * Copyright 2010 Tony Finch <fanf@dotat.at>
+ *
+ * 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 "mech.h"
+#include "forwarder.h"
struct mechdata {
unsigned mask;
blocksize= getarg_ulong();
md->mask= blocksize - 1;
- arg_assert(!md->mask & blocksize);
+ arg_assert(!(md->mask & blocksize));
arg_assert(blocksize <= 255);
*md_r= md;
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<padlen-1; i++)
if (*++padp != padlen) return "corrupted padding";