Nmap Development mailing list archives
Re: [RFC] Lua bindings for OpenSSL md5 and sha1 hash functions
From: Sven Klemm <sven () c3d2 de>
Date: Wed, 06 Aug 2008 00:46:58 +0200
Yet another smaller update. I've updated Makefile.in according to Davids changes and added functions for setting/clearing/getting bits and setting/getting the sign of bignums.
Cheers, Sven -- Sven Klemm http://cthulhu.c3d2.de/~sven/
Index: nselib-bin/Makefile.in =================================================================== --- nselib-bin/Makefile.in (revision 9353) +++ nselib-bin/Makefile.in (working copy) @@ -15,15 +15,25 @@ LIBTOOL= ./libtool LTFLAGS = --tag=CC --silent -all: bit.so +all: bit.so openssl.so bit.so: bit.c @LIBTOOL_DEPS@ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) $(CPPFLAGS) $(CFLAGS) -c bit.c $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -avoid-version -module -rpath $(nselib_bindir) $(LDFLAGS) -o bit.la bit.lo $(LIBS) mv .libs/bit.so bit.so +openssl.so: openssl.c @LIBTOOL_DEPS@ + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) $(CPPFLAGS) $(CFLAGS) -c openssl.c + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -avoid-version -module -rpath $(nselib_bindir) $(LDFLAGS) -o openssl.la openssl.lo $(LIBS) + mv .libs/openssl.so openssl.so + +x.so: openssl.c @LIBTOOL_DEPS@ + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) @LUAINCLUDE@ $(CFLAGS) -c openssl.c + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -avoid-version -module -rpath /usr/local/lib -o openssl.la openssl.lo + mv .libs/openssl.so openssl.so + clean: - rm -f bit.so *.la *.lo + rm -f bit.so openssl.so *.la *.lo rm -rf .libs distclean: clean Index: nselib-bin/openssl.c =================================================================== --- nselib-bin/openssl.c (revision 0) +++ nselib-bin/openssl.c (revision 0) @@ -0,0 +1,258 @@ +#include "../nmap_config.h" + +#if HAVE_OPENSSL + +/* OpenSSL library for lua + * adapted from lmd5 library (http://www.tecgraf.puc-rio.br/~lhf/ftp/lua/) + * Original code written by Luiz Henrique de Figueiredo <lhf () tecgraf puc-rio br> + * Adapted for NMap by Thomas Buchanan <tbuchanan () thecompassgrp net> + * bignum and rand_bytes functions added by Sven Klemm <sven () c3d2 de> + */ + +#include "openssl.h" +#include <openssl/crypto.h> +#include <openssl/bn.h> +#include <openssl/rand.h> + +typedef struct bignum_data { + BIGNUM * bn; +} bignum_data_t; + +static int l_bignum_bin2bn( lua_State *L ) /** bignum_bin2bn( string s ) */ +{ + size_t len; + const unsigned char * s = (unsigned char *) luaL_checklstring( L, 1, &len ); + BIGNUM * num = BN_new(); + BN_bin2bn( s, len, num ); + bignum_data_t * data = (bignum_data_t *) lua_newuserdata( L, sizeof(bignum_data_t)); + luaL_getmetatable( L, "BIGNUM" ); + lua_setmetatable( L, -2 ); + data->bn = num; + return 1; +} + +static int l_bignum_dec2bn( lua_State *L ) /** bignum_dec2bn( string s ) */ +{ + const char * s = luaL_checkstring( L, 1 ); + BIGNUM * num = BN_new(); + BN_dec2bn( &num, s ); + bignum_data_t * data = (bignum_data_t *) lua_newuserdata( L, sizeof(bignum_data_t)); + luaL_getmetatable( L, "BIGNUM" ); + lua_setmetatable( L, -2 ); + data->bn = num; + return 1; +} + +static int l_bignum_hex2bn( lua_State *L ) /** bignum_hex2bn( string s ) */ +{ + const char * s = luaL_checkstring( L, 1 ); + BIGNUM * num = BN_new(); + BN_hex2bn( &num, s ); + bignum_data_t * data = (bignum_data_t *) lua_newuserdata( L, sizeof(bignum_data_t)); + luaL_getmetatable( L, "BIGNUM" ); + lua_setmetatable( L, -2 ); + data->bn = num; + return 1; +} + +static int l_bignum_rand( lua_State *L ) /** bignum_rand( number bits ) */ +{ + size_t bits = luaL_checkint( L, 1 ); + BIGNUM * num = BN_new(); + BN_rand( num, bits, -1, 0 ); + bignum_data_t * data = (bignum_data_t *) lua_newuserdata( L, sizeof(bignum_data_t)); + luaL_getmetatable( L, "BIGNUM" ); + lua_setmetatable( L, -2 ); + data->bn = num; + return 1; +} + +static int l_bignum_pseudo_rand( lua_State *L ) /** bignum_pseudo_rand( number bits ) */ +{ + size_t bits = luaL_checkint( L, 1 ); + BIGNUM * num = BN_new(); + BN_pseudo_rand( num, bits, -1, 0 ); + bignum_data_t * data = (bignum_data_t *) lua_newuserdata( L, sizeof(bignum_data_t)); + luaL_getmetatable( L, "BIGNUM" ); + lua_setmetatable( L, -2 ); + data->bn = num; + return 1; +} + +static int l_bignum_mod_exp( lua_State *L ) /** bignum_mod_exp( BIGNUM a, BIGNUM p, BIGNUM m ) */ +{ + bignum_data_t * a = (bignum_data_t *) luaL_checkudata(L, 1, "BIGNUM"); + bignum_data_t * p = (bignum_data_t *) luaL_checkudata(L, 2, "BIGNUM"); + bignum_data_t * m = (bignum_data_t *) luaL_checkudata(L, 3, "BIGNUM"); + BIGNUM * result = BN_new(); + BN_CTX * ctx = BN_CTX_new(); + BN_CTX_init( ctx ); + BN_mod_exp( result, a->bn, p->bn, m->bn, ctx ); + BN_CTX_free( ctx ); + bignum_data_t * data = (bignum_data_t *) lua_newuserdata( L, sizeof(bignum_data_t)); + luaL_getmetatable( L, "BIGNUM" ); + lua_setmetatable( L, -2 ); + data->bn = result; + return 1; +} + +static int l_bignum_num_bits( lua_State *L ) /** bignum_num_bits( BIGNUM bn ) */ +{ + bignum_data_t * userdata = (bignum_data_t *) luaL_checkudata(L, 1, "BIGNUM"); + lua_pushnumber( L, BN_num_bits( userdata->bn) ); + return 1; +} + +static int l_bignum_num_bytes( lua_State *L ) /** bignum_num_bytes( BIGNUM bn ) */ +{ + bignum_data_t * userdata = (bignum_data_t *) luaL_checkudata(L, 1, "BIGNUM"); + lua_pushnumber( L, BN_num_bytes( userdata->bn) ); + return 1; +} + +static int l_bignum_set_bit( lua_State *L ) /** bignum_set_bit( BIGNUM bn, number position ) */ +{ + bignum_data_t * userdata = (bignum_data_t *) luaL_checkudata(L, 1, "BIGNUM"); + int position = luaL_checkint( L, 2 ); + BN_set_bit( userdata->bn, position ); + return 0; +} + +static int l_bignum_clear_bit( lua_State *L ) /** bignum_clear_bit( BIGNUM bn, number position ) */ +{ + bignum_data_t * userdata = (bignum_data_t *) luaL_checkudata(L, 1, "BIGNUM"); + int position = luaL_checkint( L, 2 ); + BN_clear_bit( userdata->bn, position ); + return 0; +} + +static int l_bignum_is_bit_set( lua_State *L ) /** bignum_set_bit( BIGNUM bn, number position ) */ +{ + bignum_data_t * userdata = (bignum_data_t *) luaL_checkudata(L, 1, "BIGNUM"); + int position = luaL_checkint( L, 2 ); + lua_pushboolean( L, BN_is_bit_set( userdata->bn, position ) ); + return 1; +} + +static int l_bignum_set_negative( lua_State *L ) /** bignum_set_negative( BIGNUM bn ) */ +{ + bignum_data_t * userdata = (bignum_data_t *) luaL_checkudata(L, 1, "BIGNUM"); + int value = lua_toboolean(L, 2); + BN_set_negative( userdata->bn, value ); + return 0; +} + +static int l_bignum_is_negative( lua_State *L ) /** bignum_is_negative( BIGNUM bn ) */ +{ + bignum_data_t * userdata = (bignum_data_t *) luaL_checkudata(L, 1, "BIGNUM"); + lua_pushboolean( L, BN_is_negative( userdata->bn) ); + return 1; +} + +static int l_bignum_bn2bin( lua_State *L ) /** bignum_bn2bin( BIGNUM bn ) */ +{ + bignum_data_t * userdata = (bignum_data_t *) luaL_checkudata(L, 1, "BIGNUM"); + unsigned char * result = (unsigned char *) malloc( BN_num_bytes( userdata->bn ) ); + int len = BN_bn2bin( userdata->bn, result ); + lua_pushlstring( L, (char *) result, len ); + free( result ); + return 1; +} + +static int l_bignum_bn2dec( lua_State *L ) /** bignum_bn2dec( BIGNUM bn ) */ +{ + bignum_data_t * userdata = (bignum_data_t *) luaL_checkudata(L, 1, "BIGNUM"); + char * result = BN_bn2dec( userdata->bn ); + lua_pushstring( L, result ); + OPENSSL_free( result ); + return 1; +} + +static int l_bignum_bn2hex( lua_State *L ) /** bignum_bn2hex( BIGNUM bn ) */ +{ + bignum_data_t * userdata = (bignum_data_t *) luaL_checkudata(L, 1, "BIGNUM"); + char * result = BN_bn2hex( userdata->bn ); + lua_pushstring( L, result ); + OPENSSL_free( result ); + return 1; +} + +static int l_bignum_free( lua_State *L ) /** bignum_free( bignum ) */ +{ + bignum_data_t * userdata = (bignum_data_t *) luaL_checkudata(L, 1, "BIGNUM"); + BN_clear_free( userdata->bn ); + return 0; +} + +static int l_rand_bytes( lua_State *L ) /** rand_bytes( number bytes ) */ +{ + size_t len = luaL_checkint( L, 1 ); + unsigned char * result = (unsigned char *) malloc( len ); + RAND_bytes( result, len ); + lua_pushlstring( L, (char *) result, len ); + free( result ); + return 1; +} + +static int l_rand_pseudo_bytes( lua_State *L ) /** rand_pseudo_bytes( number bytes ) */ +{ + size_t len = luaL_checkint( L, 1 ); + unsigned char * result = (unsigned char *) malloc( len ); + RAND_pseudo_bytes( result, len ); + lua_pushlstring( L, (char *) result, len ); + free( result ); + return 1; +} + +static const struct luaL_reg bignum_methods[] = { + { "num_bits", l_bignum_num_bits }, + { "num_bytes", l_bignum_num_bytes }, + { "to_bin", l_bignum_bn2bin }, + { "to_dec", l_bignum_bn2dec }, + { "to_hex", l_bignum_bn2hex }, + { "is_bit_set", l_bignum_is_bit_set }, + { "set_bit", l_bignum_set_bit }, + { "clear_bit", l_bignum_clear_bit }, + { "is_bit_set", l_bignum_is_bit_set }, + { "set_negative", l_bignum_set_negative }, + { "is_negative", l_bignum_is_negative }, + { "__gc", l_bignum_free }, + { NULL, NULL } +}; + +static const struct luaL_reg openssllib[] = { + { "bignum_num_bits", l_bignum_num_bits }, + { "bignum_num_bytes", l_bignum_num_bytes }, + { "bignum_set_bit", l_bignum_set_bit }, + { "bignum_clear_bit", l_bignum_clear_bit }, + { "bignum_set_negative", l_bignum_set_negative }, + { "bignum_is_negative", l_bignum_is_negative }, + { "bignum_bin2bn", l_bignum_bin2bn }, + { "bignum_dec2bn", l_bignum_dec2bn }, + { "bignum_hex2bn", l_bignum_hex2bn }, + { "bignum_rand", l_bignum_rand }, + { "bignum_pseudo_rand", l_bignum_pseudo_rand }, + { "bignum_bn2bin", l_bignum_bn2bin }, + { "bignum_bn2dec", l_bignum_bn2dec }, + { "bignum_bn2hex", l_bignum_bn2hex }, + { "bignum_mod_exp", l_bignum_mod_exp }, + { "rand_bytes", l_rand_bytes}, + { "rand_pseudo_bytes", l_rand_pseudo_bytes}, + { NULL, NULL } +}; + +LUALIB_API int luaopen_openssl(lua_State *L) { + + luaL_openlib(L, OPENSSLLIBNAME, openssllib, 0); + + // create metatable for bignum + luaL_newmetatable( L, "BIGNUM" ); + // metatable.__index = metatable + lua_pushvalue( L, -1 ); + lua_setfield( L, -2, "__index" ); + // register methods + luaL_register( L, NULL, bignum_methods ); + + return 1; +} +#endif Index: nselib-bin/openssl.h =================================================================== --- nselib-bin/openssl.h (revision 0) +++ nselib-bin/openssl.h (revision 0) @@ -0,0 +1,17 @@ +#include "../nmap_config.h" + +#if HAVE_OPENSSL + +#ifndef OPENSSLLIB +#define OPENSSLLIB + +#define OPENSSLLIBNAME "openssl" + +#include "lua.h" +#include "lauxlib.h" + +LUALIB_API int luaopen_openssl(lua_State *L); + +#endif + +#endif
_______________________________________________ Sent through the nmap-dev mailing list http://cgi.insecure.org/mailman/listinfo/nmap-dev Archived at http://SecLists.Org
Current thread:
- Re: [RFC] Lua bindings for OpenSSL md5 and sha1 hash functions Sven Klemm (Aug 03)
- Re: [RFC] Lua bindings for OpenSSL md5 and sha1 hash functions Philip Pickering (Aug 03)
- Re: [RFC] Lua bindings for OpenSSL md5 and sha1 hash functions Sven Klemm (Aug 03)
- Re: [RFC] Lua bindings for OpenSSL md5 and sha1 hash functions Sven Klemm (Aug 05)
- Re: [RFC] Lua bindings for OpenSSL md5 and sha1 hash functions Sven Klemm (Aug 05)
- Re: [RFC] Lua bindings for OpenSSL md5 and sha1 hash functions Sven Klemm (Aug 03)
- Re: [RFC] Lua bindings for OpenSSL md5 and sha1 hash functions Philip Pickering (Aug 03)