* hbytes raw2h BINARY => hex
* hbytes h2raw HEX => binary
*
+ * hbytes length VALUE => count
* hbytes prepend VAR [VALUE ...] = set VAR [concat VALUE ... $VAR]
* hbytes append VAR [VALUE ...] = set VAR [concat $VAR VALUE ...]
* hbytes concat VAR [VALUE ...] = set VAR [concat VALUE ...]
*
* hbytes pkcs5 pa|ua VAR ALG => worked? (always 1 for p)
* hbytes pkcs5 pn|un VAR BLOCKSIZE => worked? (always 1 for p)
- * hbytes blockcipher d|e VAR ALG MODE [IV] => IV
+ * hbytes blockcipher d|e VAR ALG KEY MODE [IV] => IV
*
* hbytes hash ALG MESSAGE => hash
* hbytes hmac ALG MESSAGE KEY [MACLENGTH] => mac
int staticerr(Tcl_Interp *ip, const char *m);
void objfreeir(Tcl_Obj *o);
+void obj_updatestr_array(Tcl_Obj *o, const Byte *array, int l);
+int get_urandom(Tcl_Interp *ip, Byte *buffer, int l);
/* from parse.c */
const char *what);
#define enum_lookup_cached(ip,o,table,what) \
(enum_lookup_cached_func((ip),(o), \
- sizeof((table)[0]),&(table)[0], \
+ &(table)[0],sizeof((table)[0]), \
(what)))
/* table should be a pointer to an array of structs of size
* entrysize, the first member of which should be a const char*.
/* from crypto.c */
+void memxor(Byte *dest, const Byte *src, int l);
+
+typedef struct {
+ const char *name;
+ int pad, use_algname;
+} PadMethod;
+
+Tcl_ObjType blockcipherkey_type;
+
+/* from algtables.c */
+
typedef struct {
- int blocksize, hashsize;
+ const char *name;
+ int hashsize, blocksize, statesize;
+ void (*init)(void *state);
+ void (*update)(void *state, const Byte *data, int len);
+ void (*final)(void *state, Byte *digest);
+ void (*oneshot)(Byte *digest, const Byte *data, int len);
} HashAlgInfo;
+extern const HashAlgInfo hashalginfos[];
+
typedef struct {
- int blocksize;
+ void (*make_schedule)(void *schedule, const Byte *key, int keylen);
+ void (*crypt)(const void *schedule, const void *in, void *out);
+ /* in and out may be the same, but if they aren't they may not overlap */
+ /* in and out for crypt will have been through block_byteswap */
+} BlockCipherDirectionInfo;
+
+typedef struct {
+ const char *name;
+ int blocksize, schedule_size, key_min, key_max;
+ void (*byteswap)(Byte *block);
+ BlockCipherDirectionInfo encrypt, decrypt;
} BlockCipherAlgInfo;
+extern const BlockCipherAlgInfo blockcipheralginfos[];
+
+/* from bcmode.c */
+
typedef struct {
- int dummy;
+ const char *name;
+ int iv_blocks, buf_blocks;
+ const char *(*encrypt)(Byte *data, int blocks,
+ const Byte *iv, Byte *buf,
+ const BlockCipherAlgInfo *alg, int encr,
+ int blocksize, const void *sch);
+ const char *(*decrypt)(Byte *data, int blocks,
+ const Byte *iv, Byte *buf,
+ const BlockCipherAlgInfo *alg, int encr,
+ int blocksize, const void *sch);
+ /* in each case, *iv is provided, but may be modified */
} BlockCipherModeInfo;
+extern const BlockCipherModeInfo blockciphermodeinfos[];
+
/* useful macros */
#define OBJ_HBYTES(o) ((HBytes_Value*)&(o)->internalRep.twoPtrValue)