X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=base%2Fchiark-tcl.h;h=0f38890875e7ad304be3dda64f073fd6610a39d8;hb=743de63e7b3214a5abc748ec0fa90160b6983551;hp=ce00dd9537128a56d8227adc73c6d3eaa125328d;hpb=07876950ceee6d28473f347ad2f0c4422c266e32;p=chiark-tcl.git diff --git a/base/chiark-tcl.h b/base/chiark-tcl.h index ce00dd9..0f38890 100644 --- a/base/chiark-tcl.h +++ b/base/chiark-tcl.h @@ -15,28 +15,11 @@ * * hbytes range VALUE START SIZE => substring (or error) * hbytes overwrite VAR START VALUE - * hbytes trimleft VALUE removes any leading 0 octets + * hbytes trimleft VAR removes any leading 0 octets * hbytes repeat VALUE COUNT => COUNT copies of VALUE * - * hbytes h2ulong HEX => ulong (HEX len must be 4) - * hbytes ulong2h UL => hex - * - * ulong ul2bitfields VALUE [SIZE TYPE [TYPE-ARG...] ...] => 0/1 - * ulong bitfields2ul BASE [SIZE TYPE [TYPE-ARG...] ...] => ULONG - * goes from left (MSbit) to right (LSbit) where - * SIZE is size in bits - * TYPE [TYPE-ARGS...] is as below - * zero - * ignore - * fixed ULONG-VALUE - * uint VARNAME/VALUE (VARNAME if ul2bitfields; - * ulong VARNAME/VALUE VALUE if bitfields2ul) - * - * ulong ul2int ULONG => INT can fail if >INT_MAX - * ulong int2ul INT => ULONG can fail if <0 - * - * hbytes shift l|r ULONG BITS fails if BITS >32 - * hbytes mask A B => A & B + * hbytes ushort2h LONG => LONG must be <2^16, returns as hex + * hbytes h2ushort HEX => |HEX| must be 2 bytes, returns as ulong * * hbytes compare A B * => -2 A is lexically earlier than B and not a prefix of B (A worked? (always 1 for p) * hbytes pkcs5 pn|un VAR BLOCKSIZE => worked? (always 1 for p) * hbytes blockcipher d|e VAR ALG KEY MODE [IV] => IV + * hbytes blockcipher mac MSG ALG KEY MODE IV => final block * * hbytes hash ALG MESSAGE => hash * hbytes hmac ALG MESSAGE KEY [MACLENGTH] => mac * + * ulong ul2int ULONG => INT can fail if >INT_MAX + * ulong int2ul INT => ULONG can fail if <0 + * ulong mask A B => A & B + * ulong add A B => A + B (mod 2^32) + * ulong subtract A B => A - B (mod 2^32) + * ulong compare A B => 0/-1/1 + * ulong shift l|r ULONG BITS fails if BITS >32 + * + * ulong ul2bitfields VALUE [SIZE TYPE [TYPE-ARG...] ...] => 0/1 + * ulong bitfields2ul BASE [SIZE TYPE [TYPE-ARG...] ...] => ULONG + * goes from left (MSbit) to right (LSbit) where + * SIZE is size in bits + * TYPE [TYPE-ARGS...] is as below + * zero + * ignore + * fixed ULONG-VALUE + * uint VARNAME/VALUE (VARNAME if ul2bitfields; + * ulong VARNAME/VALUE VALUE if bitfields2ul) + * * Refs: HMAC: RFC2104 */ @@ -169,6 +172,7 @@ void obj_updatestr_string(Tcl_Obj *o, const char *str); typedef struct { HBytes_Value *hb; Tcl_Obj *obj, *var; + int copied; } HBytes_Var; void fini_hbv(Tcl_Interp *ip, int rc, HBytes_Var *agg); @@ -232,13 +236,13 @@ typedef struct { 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; +} BlockCipherPerDirectionInfo; typedef struct { const char *name; int blocksize, schedule_size, key_min, key_max; void (*byteswap)(void *block); - BlockCipherDirectionInfo encrypt, decrypt; + BlockCipherPerDirectionInfo encrypt, decrypt; } BlockCipherAlgInfo; extern const BlockCipherAlgInfo blockcipheralginfos[]; @@ -247,16 +251,31 @@ extern const BlockCipherAlgInfo blockcipheralginfos[]; typedef struct { const char *name; - int iv_blocks, buf_blocks; - const char *(*encrypt)(Byte *data, int blocks, + int iv_blocks, buf_blocks, mac_blocks; + + /* Each function is allowed to use up to buf_blocks * blocksize + * bytes of space in buf. data is blocks * blocksize bytes + * long. data should be modified in place by encrypt and decrypt; + * modes may not change the size of data. iv is always provided and + * is always of length iv_blocks * blocksize; encrypt and + * decrypt may modify the iv value (in which case the Tcl caller + * will get the modified IV) but this is not recommended. mac + * should leave the mac, which must be mac_blocks * blocksize + * bytes, in buf. (Therefore mac_blocks must be at least + * buf_blocks.) + */ + const char *(*encrypt)(Byte *data, int nblocks, const Byte *iv, Byte *buf, const BlockCipherAlgInfo *alg, int encr, - int blocksize, const void *sch); - const char *(*decrypt)(Byte *data, int blocks, + const void *sch); + const char *(*decrypt)(Byte *data, int nblocks, 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 */ + const void *sch); + const char *(*mac)(const Byte *data, int nblocks, + const Byte *iv, Byte *buf, + const BlockCipherAlgInfo *alg, + const void *sch); } BlockCipherModeInfo; extern const BlockCipherModeInfo blockciphermodeinfos[];