diff options
author | Luigi Scarso <luigi.scarso@gmail.com> | 2018-09-05 21:30:41 +0000 |
---|---|---|
committer | Luigi Scarso <luigi.scarso@gmail.com> | 2018-09-05 21:30:41 +0000 |
commit | 1b8b254a766350291f8e7e19feaf6326ebabe633 (patch) | |
tree | 8a20823763635906b94a68b72541a10dc6f91377 /Build/source/texk/web2c/luatexdir/luamd5 | |
parent | ef7aedbc1cabb3eebb59082e349f9792c9c4d3c1 (diff) |
sync with luatex revision 6924.
git-svn-id: svn://tug.org/texlive/trunk@48591 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/luamd5')
-rw-r--r-- | Build/source/texk/web2c/luatexdir/luamd5/md5lib.c | 271 |
1 files changed, 168 insertions, 103 deletions
diff --git a/Build/source/texk/web2c/luatexdir/luamd5/md5lib.c b/Build/source/texk/web2c/luatexdir/luamd5/md5lib.c index 40fd2de386b..dfbc0865a6b 100644 --- a/Build/source/texk/web2c/luatexdir/luamd5/md5lib.c +++ b/Build/source/texk/web2c/luatexdir/luamd5/md5lib.c @@ -5,7 +5,6 @@ * @author Roberto Ierusalimschy */ - #include <stdlib.h> #include <string.h> #include <time.h> @@ -15,22 +14,21 @@ #include "luamd5.h" - /** * Hash function. Returns a hash for a given string. * @param message: arbitrary binary string. * @return A 128-bit hash string. */ + static int lmd5 (lua_State *L) { - char buff[16]; - size_t l; - const char *message = luaL_checklstring(L, 1, &l); - md5(message, l, buff); - lua_pushlstring(L, buff, 16L); - return 1; + char buff[16]; + size_t l; + const char *message = luaL_checklstring(L, 1, &l); + md5(message, l, buff); + lua_pushlstring(L, buff, 16L); + return 1; } - /** * X-Or. Does a bit-a-bit exclusive-or of two strings. * @param s1: arbitrary binary string. @@ -38,78 +36,73 @@ static int lmd5 (lua_State *L) { * @return a binary string with same length as s1 and s2, * where each bit is the exclusive-or of the corresponding bits in s1-s2. */ + static int ex_or (lua_State *L) { - size_t l1, l2; - const char *s1 = luaL_checklstring(L, 1, &l1); - const char *s2 = luaL_checklstring(L, 2, &l2); - luaL_Buffer b; - luaL_argcheck( L, l1 == l2, 2, "lengths must be equal" ); - luaL_buffinit(L, &b); - while (l1--) luaL_addchar(&b, (*s1++)^(*s2++)); - luaL_pushresult(&b); - return 1; + size_t l1, l2; + const char *s1 = luaL_checklstring(L, 1, &l1); + const char *s2 = luaL_checklstring(L, 2, &l2); + luaL_Buffer b; + luaL_argcheck( L, l1 == l2, 2, "lengths must be equal" ); + luaL_buffinit(L, &b); + while (l1--) + luaL_addchar(&b, (*s1++)^(*s2++)); + luaL_pushresult(&b); + return 1; } - static void checkseed (lua_State *L) { - if (lua_isnone(L, 3)) { /* no seed? */ - time_t tm = time(NULL); /* for `random' seed */ - lua_pushlstring(L, (char *)&tm, sizeof(tm)); - } + if (lua_isnone(L, 3)) { /* no seed? */ + time_t tm = time(NULL); /* for `random' seed */ + lua_pushlstring(L, (char *)&tm, sizeof(tm)); + } } - -#define MAXKEY 256 -#define BLOCKSIZE 16 - - +#define MAXKEY 256 +#define BLOCKSIZE 16 static int initblock (lua_State *L, const char *seed, int lseed, char *block) { - size_t lkey; - const char *key = luaL_checklstring(L, 2, &lkey); - if (lkey > MAXKEY) - luaL_error(L, "key too long (> %d)", MAXKEY); - memset(block, 0, BLOCKSIZE); - memcpy(block, seed, lseed); - memcpy(block+BLOCKSIZE, key, lkey); - return (int)lkey+BLOCKSIZE; + size_t lkey; + const char *key = luaL_checklstring(L, 2, &lkey); + if (lkey > MAXKEY) + luaL_error(L, "key too long (> %d)", MAXKEY); + memset(block, 0, BLOCKSIZE); + memcpy(block, seed, lseed); + memcpy(block+BLOCKSIZE, key, lkey); + return (int)lkey+BLOCKSIZE; } - static void codestream (lua_State *L, const char *msg, size_t lmsg, char *block, int lblock) { - luaL_Buffer b; - luaL_buffinit(L, &b); - while (lmsg > 0) { - char code[BLOCKSIZE]; - int i; - md5(block, lblock, code); - for (i=0; i<BLOCKSIZE && lmsg > 0; i++, lmsg--) - code[i] ^= *msg++; - luaL_addlstring(&b, code, i); - memcpy(block, code, i); /* update seed */ - } - luaL_pushresult(&b); + luaL_Buffer b; + luaL_buffinit(L, &b); + while (lmsg > 0) { + char code[BLOCKSIZE]; + int i; + md5(block, lblock, code); + for (i=0; i<BLOCKSIZE && lmsg > 0; i++, lmsg--) + code[i] ^= *msg++; + luaL_addlstring(&b, code, i); + memcpy(block, code, i); /* update seed */ + } + luaL_pushresult(&b); } - static void decodestream (lua_State *L, const char *cypher, size_t lcypher, char *block, int lblock) { - luaL_Buffer b; - luaL_buffinit(L, &b); - while (lcypher > 0) { - char code[BLOCKSIZE]; - int i; - md5(block, lblock, code); /* update seed */ - for (i=0; i<BLOCKSIZE && lcypher > 0; i++, lcypher--) - code[i] ^= *cypher++; - luaL_addlstring(&b, code, i); - memcpy(block, cypher-i, i); - } - luaL_pushresult(&b); + luaL_Buffer b; + luaL_buffinit(L, &b); + while (lcypher > 0) { + char code[BLOCKSIZE]; + int i; + md5(block, lblock, code); /* update seed */ + for (i=0; i<BLOCKSIZE && lcypher > 0; i++, lcypher--) + code[i] ^= *cypher++; + luaL_addlstring(&b, code, i); + memcpy(block, cypher-i, i); + } + luaL_pushresult(&b); } - /** * Encrypts a string. Uses the hash function md5 in CFB (Cipher-feedback * mode). @@ -117,28 +110,29 @@ static void decodestream (lua_State *L, const char *cypher, size_t lcypher, * @param key: arbitrary binary string to be used as a key. * @param [seed]: optional arbitrary binary string to be used as a seed. * if no seed is provided, the function uses the result of -* <code>time()</code> as a seed. +* <code>time()</code> as a seed. * @return The cyphertext (as a binary string). */ + static int crypt (lua_State *L) { - size_t lmsg; - const char *msg = luaL_checklstring(L, 1, &lmsg); - size_t lseed; - const char *seed; - int lblock; - char block[BLOCKSIZE+MAXKEY]; - checkseed(L); - seed = luaL_checklstring(L, 3, &lseed); - if (lseed > BLOCKSIZE) - luaL_error(L, "seed too long (> %d)", BLOCKSIZE); - /* put seed and seed length at the beginning of result */ - block[0] = (char)lseed; - memcpy(block+1, seed, lseed); - lua_pushlstring(L, block, lseed+1); /* to concat with result */ - lblock = initblock(L, seed, lseed, block); - codestream(L, msg, lmsg, block, lblock); - lua_concat(L, 2); - return 1; + size_t lmsg; + const char *msg = luaL_checklstring(L, 1, &lmsg); + size_t lseed; + const char *seed; + int lblock; + char block[BLOCKSIZE+MAXKEY]; + checkseed(L); + seed = luaL_checklstring(L, 3, &lseed); + if (lseed > BLOCKSIZE) + luaL_error(L, "seed too long (> %d)", BLOCKSIZE); + /* put seed and seed length at the beginning of result */ + block[0] = (char)lseed; + memcpy(block+1, seed, lseed); + lua_pushlstring(L, block, lseed+1); /* to concat with result */ + lblock = initblock(L, seed, lseed, block); + codestream(L, msg, lmsg, block, lblock); + lua_concat(L, 2); + return 1; } @@ -151,33 +145,104 @@ static int crypt (lua_State *L) { * @return The plaintext. */ static int decrypt (lua_State *L) { - size_t lcyphertext; - const char *cyphertext = luaL_checklstring(L, 1, &lcyphertext); - size_t lseed = cyphertext[0]; - const char *seed = cyphertext+1; - int lblock; - char block[BLOCKSIZE+MAXKEY]; - luaL_argcheck(L, lcyphertext >= lseed+1 && lseed <= BLOCKSIZE, 1, - "invalid cyphered string"); - cyphertext += lseed+1; - lcyphertext -= lseed+1; - lblock = initblock(L, seed, lseed, block); - decodestream(L, cyphertext, lcyphertext, block, lblock); - return 1; + size_t lcyphertext; + const char *cyphertext = luaL_checklstring(L, 1, &lcyphertext); + size_t lseed = cyphertext[0]; + const char *seed = cyphertext+1; + int lblock; + char block[BLOCKSIZE+MAXKEY]; + luaL_argcheck(L, lcyphertext >= lseed+1 && lseed <= BLOCKSIZE, 1, + "invalid cyphered string"); + cyphertext += lseed+1; + lcyphertext -= lseed+1; + lblock = initblock(L, seed, lseed, block); + decodestream(L, cyphertext, lcyphertext, block, lblock); + return 1; +} + +/* not now .. doesn't compile anyway + +#include "../luapplib/util/utilmd5.h" + +static int pdfelib_md_5(lua_State * L) +{ + if (lua_type(L,1) == LUA_TSTRING) { + uint8_t result[16]; + size_t size = 0; + const char *data = lua_tolstring(L,1,&size); + md5(data,size,result); + lua_pushlstring(L,(const char *)result,16); + return 1; + } + return 0; } +*/ static struct luaL_Reg md5lib[] = { - {"sum", lmd5}, - {"exor", ex_or}, - {"crypt", crypt}, - {"decrypt", decrypt}, - {NULL, NULL} + { "sum", lmd5}, + { "exor", ex_or}, + { "crypt", crypt}, + { "decrypt", decrypt}, + { NULL, NULL} }; +int luaopen_md5(lua_State *L) { + luaL_openlib(L, "md5", md5lib, 0); + return 1; +} + +/* We could use a different file but this is as easy. */ + +#include "../luapplib/util/utilsha.h" + +static int sha2_256(lua_State * L) +{ + if (lua_type(L,1) == LUA_TSTRING) { + uint8_t result[SHA256_DIGEST_LENGTH]; + size_t size = 0; + const char *data = lua_tolstring(L,1,&size); + sha256(data,size,result); + lua_pushlstring(L,(const char *)result,SHA256_DIGEST_LENGTH); + return 1; + } + return 0; +} + +static int sha2_384(lua_State * L) +{ + if (lua_type(L,1) == LUA_TSTRING) { + size_t size = 0; + uint8_t result[SHA384_DIGEST_LENGTH]; + const char *data = lua_tolstring(L,1,&size); + sha384(data,size,result); + lua_pushlstring(L,(const char *)result,SHA384_DIGEST_LENGTH); + return 1; + } + return 0; +} -int luaopen_md5 (lua_State *L) { - luaL_openlib(L, "md5", md5lib, 0); - return 1; +static int sha2_512(lua_State * L) +{ + if (lua_type(L,1) == LUA_TSTRING) { + uint8_t result[SHA512_DIGEST_LENGTH]; + size_t size = 0; + const char *data = lua_tolstring(L,1,&size); + sha512(data,size,result); + lua_pushlstring(L,(const char *)result,SHA512_DIGEST_LENGTH); + return 1; + } + return 0; } +static struct luaL_Reg sha2lib[] = { + { "digest256", sha2_256 }, + { "digest384", sha2_384 }, + { "digest512", sha2_512 }, + { NULL, NULL} +}; + +int luaopen_sha2(lua_State *L) { + luaL_openlib(L, "sha2", sha2lib, 0); + return 1; +} |