chiark / gitweb /
debian/: Improve dyndns description a bit
[userv-utils.git] / ipif / mech-pkcs5.c
index 85b586379e70e5f21c63ded960d19f312a4b8a3b..5116917746d560b23da3799671e88c0b5fd716b0 100644 (file)
@@ -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 <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 "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<padlen-1; i++)
     if (*++padp != padlen) return "corrupted padding";