return value;
}
-static int hc_bin(ClientData cd, Tcl_Interp *ip, int objc,
- Tcl_Obj *const *objv) {
- Tcl_Obj *varname, *value, *result;
+HC_DEFINE(raw2h) {
+ HC_DECLS;
+ Tcl_Obj *raw, *value;
const char *str;
int l;
+ HC_ARG_O(raw);
+ HC_ARGS_E;
+ str= Tcl_GetStringFromObj(raw,&l);
+ value= hbytes_set(0,str,l);
+ Tcl_SetObjResult(ip,value);
+ HC_FINI;
+}
+
+HC_DEFINE(h2raw) {
+ Tcl_Obj *value, *result;
+
+ HC_ARG_H(value);
+ HC_ARGS_E;
+ result= Tcl_NewStringObj(HBYTES(value)->start, HBYTES_LEN(value));
+ Tcl_SetObjResult(ip,result);
+ HC_FINI;
+}
+
+HC_DEFINE(pkcs5) {
+ typedef struct {
+ const char *spec;
+ int pad, algname;
+ } PadKindInfo;
+ static const PadKindInfo padkindinfos[0]= {
+ { "pa", 1, 1 },
+ { "pn", 1, 0 },
+ { "ua", 0, 1 },
+ { "un", 0, 0 },
+ { 0 }
+ };
+
+ HC_DECLS_HBV;
+ Tcl_Obj *v;
+ int blocksize;
+ const PadKindInfo *pk;
+ const BlockCipherInfo *bc;
+
+ HC_ARG_ENUM(pk, padkindinfos);
+ HC_ARG_HBV;
+ if (!pk->algname) HC_ARG_INTRANGE(blocksize, 1,255);
+ else { HC_ARG_ENUM(bc, blockciphers); blocksize= bc->blocksize; }
+ HC_ARGS_E;
+
+ /* do nothing :-) */
+
+ HC_FINI_HBV;
+}
+
+static int hc_raw2h(ClientData cd, Tcl_Interp *ip, int objc,
+ Tcl_Obj *const *objv) {
+
+ Tcl_Obj *varname, *value, *result;
+
varname= objv[0];
switch (objc) {
case 1:
value= hb_getvar(ip,varname); if (!value) return TCL_ERROR;
- result= Tcl_NewStringObj(HBYTES(value)->start, HBYTES_LEN(value));
assert(result);
Tcl_SetObjResult(ip,result);
return TCL_OK;
case 2:
value= objv[1];
- str= Tcl_GetStringFromObj(value,&l);
- value= hbytes_set(0,str,l);
+ HC_MINARGS(1);
+
value= Tcl_ObjSetVar2(ip,varname,0, value, TCL_LEAVE_ERR_MSG);
if (!value) return TCL_ERROR;
Tcl_ResetResult(ip);
Tcl_ObjCmdProc *func;
} SubCommand;
+#define SUBCOMMANDS \
+ DO(raw2h) \
+ DO(h2raw) \
+ DO(pkcs5)
+
static const SubCommand subcommands[] = {
- { "bin", 1, 2, hc_bin },
+#define DO(c) { #c, hc_##c },
+ SUBCOMMANDS
{ 0 }
};