On Fri, 6 Apr 2012 02:02:56 +0200
Christian Weisgerber <na...@mips.inka.de> wrote:

> Extracting encrypted rar files is noticeably slower than unencrypted
> ones.  Rar uses the standard AES-128-CBC algorithm for encryption,
> so I had the idea of using OpenSSL's optimized implementation instead
> of the generic one included with unrar.
> 
> Running "unrar t" on a 1.5 GB test archive, I see a substantial
> speedup on my amd64:
> 
> included AES:   1m43.74s real     1m28.22s user     0m2.35s system
> OpenSSL AES:  0m35.30s real     0m19.54s user     0m2.00s system
> 
> Do we want his?  If so, it could stand additional testing.


sure if it speeds up on extract!
can you please check the updated version with your test file?

thanks

Index: Makefile
===================================================================
RCS file: /cvs/ports/archivers/unrar/Makefile,v
retrieving revision 1.53
diff -u -p -r1.53 Makefile
--- Makefile    8 Sep 2011 11:13:30 -0000       1.53
+++ Makefile    6 Apr 2012 17:04:20 -0000
@@ -11,7 +11,7 @@ COMMENT=      extract, list, and test RAR arc
 
 PKGNAME=       unrar-4.00
 EPOCH=         1
-DISTNAME=      unrarsrc-4.0.7
+DISTNAME=      unrarsrc-4.1.4
 CATEGORIES=    archivers
 
 HOMEPAGE=      http://www.rarlab.com/
@@ -24,7 +24,7 @@ PERMIT_PACKAGE_FTP=   Yes
 PERMIT_DISTFILES_CDROM=        Yes
 PERMIT_DISTFILES_FTP=  Yes
 
-WANTLIB=       c m stdc++
+WANTLIB=       c crypto m stdc++
 
 MASTER_SITES=  ${HOMEPAGE}rar/
 
Index: distinfo
===================================================================
RCS file: /cvs/ports/archivers/unrar/distinfo,v
retrieving revision 1.21
diff -u -p -r1.21 distinfo
--- distinfo    18 Mar 2011 20:14:58 -0000      1.21
+++ distinfo    6 Apr 2012 17:04:20 -0000
@@ -1,5 +1,5 @@
-MD5 (unrarsrc-4.0.7.tar.gz) = QbCpvKlFtK4mCEIa/Y9gbg==
-RMD160 (unrarsrc-4.0.7.tar.gz) = Bin4YA6d2ymPWfwFuVab1AcDrK8=
-SHA1 (unrarsrc-4.0.7.tar.gz) = 5Miw1HJ4R189+3foSX9YGOyj1KA=
-SHA256 (unrarsrc-4.0.7.tar.gz) = 6sntdJOHDKf2eyPpIIrvHbcBw4ESOsRi6X9wN3ejMHE=
-SIZE (unrarsrc-4.0.7.tar.gz) = 152853
+MD5 (unrarsrc-4.1.4.tar.gz) = gIySpmGCCmN8oTMM9AwY5A==
+RMD160 (unrarsrc-4.1.4.tar.gz) = C7IAwB9mUUK3WBsbQO8QR9yhPFc=
+SHA1 (unrarsrc-4.1.4.tar.gz) = rkseLJnpZSfEqX+YDapUdJn0Kg8=
+SHA256 (unrarsrc-4.1.4.tar.gz) = cF2TKF/NO5wR9o5S2WOV2UK/PCAXLc7hTw148f7lc2E=
+SIZE (unrarsrc-4.1.4.tar.gz) = 157135
Index: patches/patch-makefile_unix
===================================================================
RCS file: /cvs/ports/archivers/unrar/patches/patch-makefile_unix,v
retrieving revision 1.13
diff -u -p -r1.13 patch-makefile_unix
--- patches/patch-makefile_unix 18 Mar 2011 20:14:58 -0000      1.13
+++ patches/patch-makefile_unix 6 Apr 2012 17:04:20 -0000
@@ -1,12 +1,28 @@
 $OpenBSD: patch-makefile_unix,v 1.13 2011/03/18 20:14:58 naddy Exp $
---- makefile.unix.orig Wed Mar  9 17:40:47 2011
-+++ makefile.unix      Wed Mar  9 17:41:01 2011
-@@ -107,6 +107,8 @@ OBJECTS=rar.o strlist.o strfn.o pathfn.o savepos.o sma
+--- makefile.unix.orig Mon May 30 11:47:49 2011
++++ makefile.unix      Fri Apr  6 06:58:41 2012
+@@ -6,11 +6,12 @@
+ #
+ 
+ # Linux using GCC
+-CXX=g++
+-CXXFLAGS=-O2
+-DEFINES=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
++#CXX=g++
++#CXXFLAGS=-O2
++DEFINES=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -DOPENSSL
+ STRIP=strip
+ DESTDIR=/usr
++LIBS=-lcrypto
+ 
+ # Linux using LCC
+ #CXX=lcc
+@@ -106,6 +107,8 @@ OBJECTS=rar.o strlist.o strfn.o pathfn.o savepos.o sma
+       archive.o arcread.o unicode.o system.o isnt.o crypt.o crc.o rawread.o 
encname.o \
        resource.o match.o timefn.o rdwrfn.o consio.o options.o ulinks.o 
errhnd.o rarvm.o \
        rijndael.o getbits.o sha1.o extinfo.o extract.o volume.o list.o find.o 
unpack.o cmddata.o
- 
-+.SUFFIXES: .cpp
 +
++.SUFFIXES: .cpp
+ 
  .cpp.o:
        $(COMPILE) -D$(WHAT) -c $<
- 
Index: patches/patch-os_hpp
===================================================================
RCS file: /cvs/ports/archivers/unrar/patches/patch-os_hpp,v
retrieving revision 1.6
diff -u -p -r1.6 patch-os_hpp
--- patches/patch-os_hpp        30 Dec 2010 07:51:31 -0000      1.6
+++ patches/patch-os_hpp        6 Apr 2012 17:04:20 -0000
@@ -1,7 +1,18 @@
 $OpenBSD: patch-os_hpp,v 1.6 2010/12/30 07:51:31 benoit Exp $
---- os.hpp.orig        Fri Nov 26 08:20:01 2010
-+++ os.hpp     Mon Dec  6 07:49:22 2010
-@@ -262,12 +262,12 @@
+--- os.hpp.orig        Mon Jan  9 07:46:08 2012
++++ os.hpp     Fri Apr  6 06:52:00 2012
+@@ -193,6 +193,10 @@
+ #include <utime.h>
+ #include <locale.h>
+ 
++#ifdef OPENSSL
++#include <openssl/evp.h>
++#endif
++
+ #ifdef  S_IFLNK
+ #define SAVE_LINKS
+ #endif
+@@ -263,12 +267,12 @@
    #endif
  #endif
  
Index: patches/patch-rijndael_cpp
===================================================================
RCS file: patches/patch-rijndael_cpp
diff -N patches/patch-rijndael_cpp
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-rijndael_cpp  6 Apr 2012 17:04:20 -0000
@@ -0,0 +1,80 @@
+$OpenBSD$
+--- rijndael.cpp.orig  Wed Mar  2 08:43:12 2011
++++ rijndael.cpp       Fri Apr  6 00:32:04 2012
+@@ -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 byte *src)
+ #endif
+ }
+ 
++#endif // OPENSSL
+ 
+ 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ // API
+@@ -61,13 +64,21 @@ inline void Copy128(byte *dest,const byte *src)
+ 
+ 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 byte * key,byt
+ 
+   if(m_direction == Decrypt)
+     keyEncToDec();
++#endif // OPENSSL
+ }
+ 
+ 
+@@ -91,6 +103,11 @@ size_t Rijndael::blockDecrypt(const byte *input, size_
+   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 *input, size_
+   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: patches/patch-rijndael_hpp
===================================================================
RCS file: patches/patch-rijndael_hpp
diff -N patches/patch-rijndael_hpp
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-rijndael_hpp  6 Apr 2012 17:04:20 -0000
@@ -0,0 +1,25 @@
+$OpenBSD$
+--- rijndael.hpp.orig  Wed Mar  2 08:43:13 2011
++++ rijndael.hpp       Fri Apr  6 00:32:04 2012
+@@ -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);

Reply via email to