+ pmcd.hb= v.hb;
+ pmcd.pad= op->pad;
+
+ return meth->func(&pmcd,ip,methargsc,methargsv);
+}
+
+int cht_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 cht_staticerr(ip, "block size too large for RFC2406 padding", 0);
+
+ if (pmcd->pad) {
+ Byte *padding;
+ HBytes_Value nxthdr;
+
+ rc= cht_pat_hb(ip,nxthdr_arg,&nxthdr);
+ if (rc) return rc;
+
+ if (cht_hb_len(&nxthdr) != 1) return
+ cht_staticerr(ip, "RFC2406 next header field must be exactly 1 byte", 0);
+ padlen= pmcd->blocksize-1 - ((cht_hb_len(pmcd->hb)+1) % pmcd->blocksize);
+ padding= cht_hb_append(pmcd->hb, padlen+2);
+ for (i=1; i<=padlen; i++)
+ *padding++ = i;
+ *padding++ = padlen;
+ *padding++ = cht_hb_data(&nxthdr)[0];
+ *ok= 1;
+
+ } else {
+ const Byte *padding, *trailer;
+ HBytes_Value nxthdr;
+ Tcl_Obj *nxthdr_valobj, *ro;
+
+ *ok= 0;
+ old_len= cht_hb_len(pmcd->hb); if (old_len % pmcd->blocksize) goto quit;
+ trailer= cht_hb_unappend(pmcd->hb, 2); if (!trailer) goto quit;
+
+ padlen= trailer[0];
+ cht_hb_array(&nxthdr,trailer+1,1);
+ nxthdr_valobj= cht_ret_hb(ip,nxthdr);
+ ro= Tcl_ObjSetVar2(ip,nxthdr_arg,0,nxthdr_valobj,TCL_LEAVE_ERR_MSG);
+ if (!ro) { Tcl_DecrRefCount(nxthdr_valobj); return TCL_ERROR; }
+
+ padding= cht_hb_unappend(pmcd->hb, padlen);
+ for (i=1; i<=padlen; i++)
+ if (*padding++ != i) goto quit;
+
+ *ok= 1;
+
+ quit:;
+
+ }
+
+ return TCL_OK;
+}
+
+int cht_do_padmethodinfo_pkcs5(ClientData cd, Tcl_Interp *ip, int *ok) {
+ const PadMethodClientData *pmcd= (const void*)cd;
+ int padlen, old_len, i;
+
+ if (pmcd->blocksize > 255)
+ return cht_staticerr(ip, "block size too large for pkcs#5", 0);
+
+ if (pmcd->pad) {
+
+ Byte *padding;
+
+ padlen= pmcd->blocksize - (cht_hb_len(pmcd->hb) % pmcd->blocksize);
+ padding= cht_hb_append(pmcd->hb, padlen);