ports/166968: archivers/unrar: speed up decryption
Christian Weisgerber
naddy at FreeBSD.org
Sun Apr 15 16:30:12 UTC 2012
>Number: 166968
>Category: ports
>Synopsis: archivers/unrar: speed up decryption
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Sun Apr 15 16:30:11 UTC 2012
>Closed-Date:
>Last-Modified:
>Originator: Christian Weisgerber
>Release: FreeBSD 7.4-STABLE amd64
>Organization:
>Environment:
System: FreeBSD lorvorc.mips.inka.de 7.4-STABLE FreeBSD 7.4-STABLE #0: Sat Apr 14 12:42:37 CEST 2012 naddy at lorvorc.mips.inka.de:/usr/obj/usr/src/sys/GENERIC amd64
>Description:
Use OpenSSL instead of the included AES code to speed up extraction
of encrypted archives.
>How-To-Repeat:
>Fix:
Index: Makefile
===================================================================
RCS file: /home/pcvs/ports/archivers/unrar/Makefile,v
retrieving revision 1.74
diff -u -r1.74 Makefile
--- Makefile 19 Feb 2012 06:05:10 -0000 1.74
+++ Makefile 15 Apr 2012 15:45:41 -0000
@@ -7,7 +7,7 @@
PORTNAME= unrar
PORTVERSION= 4.10
-PORTREVISION= 1
+PORTREVISION= 2
PORTEPOCH= 5
CATEGORIES+= archivers
MASTER_SITES= http://www.rarlab.com/rar/ \
Index: files/patch-makefile.unix
===================================================================
RCS file: files/patch-makefile.unix
diff -N files/patch-makefile.unix
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ files/patch-makefile.unix 15 Apr 2012 15:45:41 -0000
@@ -0,0 +1,14 @@
+--- makefile.unix.orig 2012-04-05 23:34:11.000000000 +0200
++++ makefile.unix 2012-04-05 23:34:26.000000000 +0200
+@@ -8,9 +8,10 @@
+ # Linux using GCC
+ CXX=g++
+ CXXFLAGS=-O2
+-DEFINES=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
++DEFINES=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -DOPENSSL
+ STRIP=strip
+ DESTDIR=/usr
++LIBS=-lcrypto
+
+ # Linux using LCC
+ #CXX=lcc
Index: files/patch-os.hpp
===================================================================
RCS file: files/patch-os.hpp
diff -N files/patch-os.hpp
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ files/patch-os.hpp 15 Apr 2012 15:45:41 -0000
@@ -0,0 +1,13 @@
+--- os.hpp.orig 2012-04-05 22:20:56.000000000 +0200
++++ os.hpp 2012-04-05 22:21:36.000000000 +0200
+@@ -193,6 +193,10 @@
+ #include <utime.h>
+ #include <locale.h>
+
++#ifdef OPENSSL
++#include <openssl/evp.h>
++#endif
++
+ #ifdef S_IFLNK
+ #define SAVE_LINKS
+ #endif
Index: files/patch-rijndael.cpp
===================================================================
RCS file: files/patch-rijndael.cpp
diff -N files/patch-rijndael.cpp
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ files/patch-rijndael.cpp 15 Apr 2012 15:45:41 -0000
@@ -0,0 +1,79 @@
+--- rijndael.cpp.orig 2012-01-09 14:46:08.000000000 +0100
++++ rijndael.cpp 2012-04-05 23:36:23.000000000 +0200
+@@ -7,6 +7,8 @@
+ **************************************************************************/
+ #include "rar.hpp"
+
++#ifndef OPENSSL
++
+ const int uKeyLenInBytes=16, m_uRounds=10;
+
+ static byte S[256],S5[256],rcon[30];
+@@ -54,6 +56,7 @@ inline void Copy128(byte *dest,const byt
+ #endif
+ }
+
++#endif // OPENSSL
+
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ // API
+@@ -61,13 +64,21 @@ inline void Copy128(byte *dest,const byt
+
+ Rijndael::Rijndael()
+ {
++#ifndef OPENSSL
+ if (S[0]==0)
+ GenerateTables();
++#endif
+ }
+
+
+ void Rijndael::init(Direction dir,const byte * key,byte * initVector)
+ {
++#ifdef OPENSSL
++ EVP_CIPHER_CTX_init(&ctx);
++ EVP_CipherInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key, initVector,
++ dir == Decrypt ? 0 : 1);
++ EVP_CIPHER_CTX_set_padding(&ctx, 0);
++#else
+ m_direction = dir;
+
+ byte keyMatrix[_MAX_KEY_COLUMNS][4];
+@@ -82,6 +93,7 @@ void Rijndael::init(Direction dir,const
+
+ if(m_direction == Decrypt)
+ keyEncToDec();
++#endif // OPENSSL
+ }
+
+
+@@ -91,6 +103,11 @@ size_t Rijndael::blockDecrypt(const byte
+ if (input == 0 || inputLen <= 0)
+ return 0;
+
++#ifdef OPENSSL
++ int outLen;
++ EVP_CipherUpdate(&ctx, outBuffer, &outLen, input, inputLen);
++ return outLen;
++#else
+ byte block[16], iv[4][4];
+ memcpy(iv,m_initVector,16);
+
+@@ -113,9 +130,11 @@ size_t Rijndael::blockDecrypt(const byte
+ memcpy(m_initVector,iv,16);
+
+ return 16*numBlocks;
++#endif // OPENSSL
+ }
+
+
++#ifndef OPENSSL
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ // ALGORITHM
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+@@ -296,3 +315,5 @@ void Rijndael::GenerateTables()
+ U1[b][0]=U2[b][1]=U3[b][2]=U4[b][3]=T5[i][0]=T6[i][1]=T7[i][2]=T8[i][3]=FFmul0e(b);
+ }
+ }
++
++#endif // OPENSSL
Index: files/patch-rijndael.hpp
===================================================================
RCS file: files/patch-rijndael.hpp
diff -N files/patch-rijndael.hpp
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ files/patch-rijndael.hpp 15 Apr 2012 15:45:41 -0000
@@ -0,0 +1,24 @@
+--- rijndael.hpp.orig 2012-01-09 14:46:08.000000000 +0100
++++ rijndael.hpp 2012-04-05 22:42:56.000000000 +0200
+@@ -18,15 +18,21 @@ class Rijndael
+ public:
+ enum Direction { Encrypt , Decrypt };
+ private:
++#ifndef OPENSSL
+ void keySched(byte key[_MAX_KEY_COLUMNS][4]);
+ void keyEncToDec();
+ void encrypt(const byte a[16], byte b[16]);
+ void decrypt(const byte a[16], byte b[16]);
+ void GenerateTables();
++#endif
+
++#ifdef OPENSSL
++ EVP_CIPHER_CTX ctx;
++#else
+ Direction m_direction;
+ byte m_initVector[MAX_IV_SIZE];
+ byte m_expandedKey[_MAX_ROUNDS+1][4][4];
++#endif
+ public:
+ Rijndael();
+ void init(Direction dir,const byte *key,byte *initVector);
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list