gb.openssl: Add OpenSSL static class and RandomBytes method

[GB.OPENSSL]
* NEW: Add static class OpenSSL for general utility methods provided by OpenSSL
* NEW: Add OpenSSL.RandomBytes to generate a cryptographically strong pseudo-random string of given length
This commit is contained in:
Tobias Boege 2019-07-06 21:45:37 +02:00
parent ade69465d6
commit d913a59929
4 changed files with 127 additions and 0 deletions

View file

@ -9,6 +9,7 @@ gb_openssl_la_CPPFLAGS = @OPENSSL_INC@ -I../../main/gbx -I../../main/share
gb_openssl_la_SOURCES = \ gb_openssl_la_SOURCES = \
main.h main.c \ main.h main.c \
c_openssl.h c_openssl.c \
c_digest.h c_digest.c \ c_digest.h c_digest.c \
c_cipher.h c_cipher.c \ c_cipher.h c_cipher.c \
c_hmac.h c_hmac.c c_hmac.h c_hmac.c

View file

@ -0,0 +1,80 @@
/*
* c_openssl.c - Static OpenSSL class
*
* Copyright (C) 2019 Tobias Boege <tobias@gambas-buch.de>
*
* 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 <openssl/crypto.h>
#include <openssl/rand.h>
#include <openssl/err.h>
#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
};

View file

@ -0,0 +1,43 @@
/*
* c_openssl.h
*
* Copyright (C) 2019 Tobias Boege <tobias@gambas-buch.de>
*
* 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 */

View file

@ -41,6 +41,7 @@
#include <gbx_c_array.h> #include <gbx_c_array.h>
#include "main.h" #include "main.h"
#include "c_openssl.h"
#include "c_digest.h" #include "c_digest.h"
#include "c_cipher.h" #include "c_cipher.h"
#include "c_hmac.h" #include "c_hmac.h"
@ -48,6 +49,8 @@
GB_INTERFACE GB EXPORT; GB_INTERFACE GB EXPORT;
GB_DESC *GB_CLASSES[] EXPORT = { GB_DESC *GB_CLASSES[] EXPORT = {
COpenSSL,
CDigest, CDigest,
CDigestMethod, CDigestMethod,