diff --git a/gb.openssl/src/Makefile.am b/gb.openssl/src/Makefile.am index 01454e70e..1e56ffa32 100644 --- a/gb.openssl/src/Makefile.am +++ b/gb.openssl/src/Makefile.am @@ -9,6 +9,7 @@ gb_openssl_la_CPPFLAGS = @OPENSSL_INC@ -I../../main/gbx -I../../main/share gb_openssl_la_SOURCES = \ main.h main.c \ + c_openssl.h c_openssl.c \ c_digest.h c_digest.c \ c_cipher.h c_cipher.c \ c_hmac.h c_hmac.c diff --git a/gb.openssl/src/c_openssl.c b/gb.openssl/src/c_openssl.c new file mode 100644 index 000000000..58b4e45f7 --- /dev/null +++ b/gb.openssl/src/c_openssl.c @@ -0,0 +1,80 @@ +/* + * c_openssl.c - Static OpenSSL class + * + * Copyright (C) 2019 Tobias Boege + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give + * permission to link the code of portions of this program with the + * OpenSSL library under certain conditions as described in each + * individual source file, and distribute linked combinations + * including the two. + * You must obey the GNU General Public License in all respects + * for all of the code used other than OpenSSL. If you modify + * file(s) with this exception, you may extend this exception to + * your version of the file(s), but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement + * from your version. If you delete this exception statement from + * all source files in the program, then also delete it here. + */ + +#define __C_OPENSSL_C + +#include +#include +#include + +#include "main.h" +#include "c_openssl.h" + +/* + * OpenSSL + */ + +/**G + * Return a cryptographically strongly pseudo-random string of the + * given *Length*. + **/ +BEGIN_METHOD(OpenSSL_RandomBytes, GB_INTEGER length) + + char *ret = GB.TempString(NULL, VARG(length)); + int res; + + #if OPENSSL_VERSION_NUMBER < 0x10100000L + res = RAND_pseudo_bytes((unsigned char *) ret, VARG(length)); + #else + res = RAND_bytes((unsigned char *) ret, VARG(length)); + #endif + if (res == -1) { + GB.Error("Random number generator not supported"); + return; + } else if (res == 0) { + GB.Error(ERR_error_string(ERR_get_error(), NULL)); + return; + } + + GB.ReturnString(ret); + +END_METHOD + +GB_DESC COpenSSL[] = { + GB_DECLARE_STATIC("OpenSSL"), + + GB_STATIC_METHOD("RandomBytes", "s", OpenSSL_RandomBytes, "(Length)i"), + + GB_END_DECLARE +}; diff --git a/gb.openssl/src/c_openssl.h b/gb.openssl/src/c_openssl.h new file mode 100644 index 000000000..30fa38c75 --- /dev/null +++ b/gb.openssl/src/c_openssl.h @@ -0,0 +1,43 @@ +/* + * c_openssl.h + * + * Copyright (C) 2019 Tobias Boege + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give + * permission to link the code of portions of this program with the + * OpenSSL library under certain conditions as described in each + * individual source file, and distribute linked combinations + * including the two. + * You must obey the GNU General Public License in all respects + * for all of the code used other than OpenSSL. If you modify + * file(s) with this exception, you may extend this exception to + * your version of the file(s), but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement + * from your version. If you delete this exception statement from + * all source files in the program, then also delete it here. + */ + +#ifndef __C_OPENSSL_H +#define __C_OPENSSL_H + +#ifndef __C_OPENSSL_C +extern GB_DESC COpenSSL[]; +#endif + +#endif /* __C_OPENSSL_H */ + diff --git a/gb.openssl/src/main.c b/gb.openssl/src/main.c index 78a6a18b4..5b5dee7fd 100644 --- a/gb.openssl/src/main.c +++ b/gb.openssl/src/main.c @@ -41,6 +41,7 @@ #include #include "main.h" +#include "c_openssl.h" #include "c_digest.h" #include "c_cipher.h" #include "c_hmac.h" @@ -48,6 +49,8 @@ GB_INTERFACE GB EXPORT; GB_DESC *GB_CLASSES[] EXPORT = { + COpenSSL, + CDigest, CDigestMethod,