diff options
Diffstat (limited to 'source/blender/encrypt')
-rw-r--r-- | source/blender/encrypt/BLO_encrypt.h | 50 | ||||
-rw-r--r-- | source/blender/encrypt/Makefile | 37 | ||||
-rw-r--r-- | source/blender/encrypt/intern/BLO_encrypt.c | 229 | ||||
-rw-r--r-- | source/blender/encrypt/intern/Makefile | 60 |
4 files changed, 376 insertions, 0 deletions
diff --git a/source/blender/encrypt/BLO_encrypt.h b/source/blender/encrypt/BLO_encrypt.h new file mode 100644 index 00000000000..d9d2fdd396a --- /dev/null +++ b/source/blender/encrypt/BLO_encrypt.h @@ -0,0 +1,50 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * 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 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#ifndef BLO_ENCRYPT_H +#define BLO_ENCRYPT_H + +#ifdef __cplusplus +extern "C" { +#endif + + int +BLO_encrypt( + unsigned char *data, + unsigned int dataIn, + struct streamGlueHeaderStruct *streamGlueHeader); + +#ifdef __cplusplus +} +#endif + +#endif /* BLO_ENCRYPT_H */ diff --git a/source/blender/encrypt/Makefile b/source/blender/encrypt/Makefile new file mode 100644 index 00000000000..4dbd71af099 --- /dev/null +++ b/source/blender/encrypt/Makefile @@ -0,0 +1,37 @@ +# +# $Id$ +# +# ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** +# +# 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 +# of the License, or (at your option) any later version. The Blender +# Foundation also sells licenses for use in proprietary software under +# the Blender License. See http://www.blender.org/BL/ for information +# about this. +# +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. +# All rights reserved. +# +# The Original Code is: all of this file. +# +# Contributor(s): none yet. +# +# ***** END GPL/BL DUAL LICENSE BLOCK ***** +# +# Bounces make to subdirectories. + +SOURCEDIR = source/blender/encrypt +DIRS = intern + +include nan_subdirs.mk diff --git a/source/blender/encrypt/intern/BLO_encrypt.c b/source/blender/encrypt/intern/BLO_encrypt.c new file mode 100644 index 00000000000..ecea0d5fc14 --- /dev/null +++ b/source/blender/encrypt/intern/BLO_encrypt.c @@ -0,0 +1,229 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * 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 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + * openssl/crypt rc4 crypto wrapper library + */ + +#include <stdio.h> +#include <stdlib.h> + +#ifdef _WIN32 +#include <winsock2.h> +#include <windows.h> +#endif + +#include "openssl/rc4.h" +#include "openssl/rand.h" +#include "openssl/rsa.h" +#include "zlib.h" + +#include "GEN_messaging.h" + +#include "BLO_keyStore.h" +#include "BLO_writeStreamGlue.h" +#include "BLO_en_de_cryptHeader.h" +#include "BLO_encrypt.h" + + int +BLO_encrypt( + unsigned char *data, + unsigned int dataIn, + struct streamGlueHeaderStruct *streamGlueHeader) +{ + int err = 0; + struct writeStreamGlueStruct *streamGlue = NULL; + struct BLO_en_de_cryptHeaderStruct BLO_en_de_cryptHeader; + RC4_KEY *rc4_key; + unsigned char *cryptBuf = NULL; + byte *pubKey, *privKey; + int pubKeyLen, privKeyLen; + int cryptKeyLen = 16; + int cryptedKeyLen; + byte cryptKey[16]; // FIXME cryptKeyLen]; + RSA *rsa = NULL; + byte *cryptedKey; + static unsigned char rsa_e[] = "\x01\x00\x01"; + + cryptBuf = malloc(dataIn); + if (!cryptBuf) { + err = BWS_SETFUNCTION(BWS_ENCRYPT) | + BWS_SETGENERR(BWS_MALLOC); + return err; + } + + rc4_key = malloc(sizeof(RC4_KEY)); + if (!rc4_key) { + err = BWS_SETFUNCTION(BWS_ENCRYPT) | + BWS_SETGENERR(BWS_MALLOC); + free(cryptBuf); + return err; + } + +#ifdef _WIN32 + RAND_screen(); +#endif + RAND_bytes(cryptKey, cryptKeyLen); + + RC4_set_key(rc4_key, cryptKeyLen, cryptKey); + RC4(rc4_key, dataIn, data, cryptBuf); + + free(rc4_key); + + // Update streamGlueHeader that initiated us and write it away + streamGlueHeader->totalStreamLength = + htonl(EN_DE_CRYPTHEADERSTRUCTSIZE + dataIn); + streamGlueHeader->crc = htonl(crc32(0L, + (const Bytef *) streamGlueHeader, STREAMGLUEHEADERSIZE - 4)); +#ifndef NDEBUG + fprintf(GEN_errorstream, + "BLO_encrypt writes streamGlueHeader of %u bytes\n", + STREAMGLUEHEADERSIZE); +#endif + + err = writeStreamGlue( + Global_streamGlueControl, + &streamGlue, + (unsigned char *)streamGlueHeader, + STREAMGLUEHEADERSIZE, + 0); + if (err) { + free(cryptBuf); + return err; + } + + pubKeyLen = keyStoreGetPubKey(&pubKey); + privKeyLen = keyStoreGetPrivKey(&privKey); + if ((pubKeyLen == 0) || (privKeyLen == 0)) { + err = BWS_SETFUNCTION(BWS_ENCRYPT) | + BWS_SETGENERR(BWS_RSA); + free(cryptBuf); + return err; + } + + rsa = RSA_new(); + if (rsa == NULL) { +#ifndef NDEBUG + fprintf(GEN_errorstream, + "Error in RSA_new\n"); +#endif + err = BWS_SETFUNCTION(BWS_ENCRYPT) | + BWS_SETSPECERR(BWS_RSANEWERROR); + free(cryptBuf); + return err; + } + // static exponent + rsa->e = BN_bin2bn(rsa_e, sizeof(rsa_e)-1, rsa->e); + + // public part into rsa->n + rsa->n = BN_bin2bn(pubKey, pubKeyLen, rsa->n); + + // private part into rsa->d + rsa->d = BN_bin2bn(privKey, privKeyLen, rsa->d); + + //DEBUG RSA_print_fp(stdout, rsa, 0); + + cryptedKey = malloc(RSA_size(rsa) * sizeof(byte)); + if (!cryptedKey) { + err = BWS_SETFUNCTION(BWS_ENCRYPT) | + BWS_SETGENERR(BWS_MALLOC); + free(cryptBuf); + RSA_free(rsa); + return err; + } + + // crypt the cryptkey + cryptedKeyLen = RSA_private_encrypt(cryptKeyLen, cryptKey, cryptedKey, + rsa, RSA_PKCS1_PADDING); + if (cryptedKeyLen == -1) { + // TODO real error handling +#ifndef NDEBUG + fprintf(GEN_errorstream, + "Error in RSA_private_encrypt\n"); +#endif + err = BWS_SETFUNCTION(BWS_ENCRYPT) | + BWS_SETSPECERR(BWS_ENCRYPTERROR); + free(cryptBuf); + free(cryptedKey); + RSA_free(rsa); + return err; + } + +#ifndef NDEBUG + fprintf(GEN_errorstream, + "BLO_encrypt writes BLO_en_de_cryptHeader of %u bytes\n", + EN_DE_CRYPTHEADERSTRUCTSIZE); +#endif + + // write out our header + BLO_en_de_cryptHeader.magic = 'A'; + BLO_en_de_cryptHeader.length = htonl(dataIn); + memcpy(BLO_en_de_cryptHeader.pubKey, pubKey, pubKeyLen); + BLO_en_de_cryptHeader.pubKeyLen = htonl(pubKeyLen); + memcpy(BLO_en_de_cryptHeader.cryptedKey, cryptedKey, cryptedKeyLen); + BLO_en_de_cryptHeader.cryptedKeyLen = htonl(cryptedKeyLen); + BLO_en_de_cryptHeader.datacrc = htonl(crc32(0L, + (const Bytef *) cryptBuf, dataIn)); + BLO_en_de_cryptHeader.headercrc = htonl(crc32(0L, + (const Bytef *) &BLO_en_de_cryptHeader, EN_DE_CRYPTHEADERSTRUCTSIZE-4)); + err = writeStreamGlue( + Global_streamGlueControl, + &streamGlue, + (unsigned char *) &BLO_en_de_cryptHeader, + EN_DE_CRYPTHEADERSTRUCTSIZE, + 0); + if (err) { + free(cryptBuf); + free(cryptedKey); + RSA_free(rsa); + return err; + } + +#ifndef NDEBUG + fprintf(GEN_errorstream, + "BLO_encrypt writes %u bytes raw data (total %u)\n", + dataIn, + STREAMGLUEHEADERSIZE + EN_DE_CRYPTHEADERSTRUCTSIZE + dataIn); +#endif + + // finally write all crypted data + err = writeStreamGlue( + Global_streamGlueControl, + &streamGlue, + (unsigned char *) cryptBuf, + dataIn, + 1); + + free(cryptBuf); + free(cryptedKey); + RSA_free(rsa); + + return err; +} + diff --git a/source/blender/encrypt/intern/Makefile b/source/blender/encrypt/intern/Makefile new file mode 100644 index 00000000000..0c8bab4f2ab --- /dev/null +++ b/source/blender/encrypt/intern/Makefile @@ -0,0 +1,60 @@ +# +# $Id$ +# +# ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** +# +# 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 +# of the License, or (at your option) any later version. The Blender +# Foundation also sells licenses for use in proprietary software under +# the Blender License. See http://www.blender.org/BL/ for information +# about this. +# +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. +# All rights reserved. +# +# The Original Code is: all of this file. +# +# Contributor(s): none yet. +# +# ***** END GPL/BL DUAL LICENSE BLOCK ***** +# +# + +LIBNAME = encrypt +DIR = $(OCGDIR)/blender/$(LIBNAME) + +include nan_compile.mk + +ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows")) + CFLAGS += -funsigned-char +endif + +CFLAGS += $(LEVEL_2_C_WARNINGS) + +# path to our own external headerfiles +CPPFLAGS += -I.. + +# external modules +CPPFLAGS += -I../../../kernel/gen_messaging +CPPFLAGS += -I../../writestreamglue +CPPFLAGS += -I../../readstreamglue +CPPFLAGS += -I../../decrypt + +CPPFLAGS += -I$(NAN_OPENSSL)/include +CPPFLAGS += -I$(NAN_BLENKEY)/include + +ifeq ($(OS),$(findstring $(OS), "solaris windows")) + CPPFLAGS += -I$(NAN_ZLIB)/include +endif + |