+ pmcd.blocksize= alg->blocksize;
+ } else {
+ rc= Tcl_GetIntFromObj(ip, blocksz, &pmcd.blocksize); if (rc) return rc;
+ if (pmcd.blocksize < 1) staticerr(ip, "block size must be at least 1", 0);
+ }
+
+ pmcd.hb= v.hb;
+ pmcd.pad= op->pad;
+
+ return meth->func(&pmcd,ip,methargsc,methargsv);
+}
+
+int do_padmethodinfo_rfc2406(ClientData cd, Tcl_Interp *ip,
+ Tcl_Obj *nxthdr_arg, int *ok) {
+ const PadMethodClientData *pmcd= (const void*)cd;
+ int i, rc, padlen, old_len;
+
+ if (pmcd->blocksize > 256)
+ return staticerr(ip, "block size too large for RFC2406 padding", 0);
+
+ if (pmcd->pad) {
+ Byte *padding;
+ HBytes_Value nxthdr;
+
+ rc= pat_hb(ip,nxthdr_arg,&nxthdr);
+ if (rc) return rc;
+
+ if (hbytes_len(&nxthdr) != 1) return
+ staticerr(ip, "RFC2406 next header field must be exactly 1 byte", 0);
+ padlen= pmcd->blocksize-1 - ((hbytes_len(pmcd->hb)+1) % pmcd->blocksize);
+ padding= hbytes_append(pmcd->hb, padlen+2);
+ for (i=1; i<=padlen; i++)
+ *padding++ = i;
+ *padding++ = padlen;
+ *padding++ = hbytes_data(&nxthdr)[0];
+ *ok= 1;
+