Below is a patch to avoiding using SecBlock's members directly.

I believe we got it tested under all the code paths - no ASM, i686 ASM and 
x86_64 ASM.

Any comments or objections?

$ cat hide.diff
diff --git a/salsa.cpp b/salsa.cpp
index a42e3df..7e95542 100644
--- a/salsa.cpp
+++ b/salsa.cpp
@@ -8,6 +8,8 @@
 
 #include "salsa.h"
 #include "misc.h"
+#include "stdcpp.h"
+#include "smartptr.h"
 #include "argnames.h"
 #include "cpu.h"
 #include "trap.h"
@@ -89,8 +91,11 @@ void Salsa20_Policy::OperateKeystream(KeystreamOperation 
operation, byte *output
 {
 #endif    // #ifdef CRYPTOPP_GENERATE_X64_MASM
 
+    // m_state.m_ptr was used below. Fetch it through data() member so we 
can make SecBlock's members private
+    word32* state = m_state.data();
+
 #ifdef CRYPTOPP_X64_MASM_AVAILABLE
-    Salsa20_OperateKeystream(output, input, iterationCount, m_rounds, 
m_state.data());
+    Salsa20_OperateKeystream(output, input, iterationCount, m_rounds, 
state);
     return;
 #endif
 
@@ -154,14 +159,13 @@ void 
Salsa20_Policy::OperateKeystream(KeystreamOperation operation, byte *output
             GNU_AS_INTEL_SYNTAX
             AS_PUSH_IF86(    bx)
     #else
-        void *s = m_state.data();
-        word32 r = m_rounds;
+        word32 rounds = m_rounds;
 
         AS2(    mov        REG_iterationCount, iterationCount)
         AS2(    mov        REG_input, input)
         AS2(    mov        REG_output, output)
-        AS2(    mov        REG_state, s)
-        AS2(    mov        REG_rounds, r)
+        AS2(    mov        REG_state, state)
+        AS2(    mov        REG_rounds, rounds)
     #endif
 #endif    // #ifndef CRYPTOPP_GENERATE_X64_MASM
 
@@ -462,11 +466,11 @@ void 
Salsa20_Policy::OperateKeystream(KeystreamOperation operation, byte *output
         GNU_AS_ATT_SYNTAX
     #if CRYPTOPP_BOOL_X64
             : "+r" (input), "+r" (output), "+r" (iterationCount)
-            : "r" (m_rounds), "r" (m_state.m_ptr), "r" (workspace)
+            : "r" (m_rounds), "r" (state), "r" (workspace)
             : "%eax", "%rdx", "memory", "cc", "%xmm0", "%xmm1", "%xmm2", 
"%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7", "%xmm8", "%xmm9", "%xmm10", 
"%xmm11", "%xmm12", "%xmm13", "%xmm14", "%xmm15"
     #else
             : "+a" (input), "+D" (output), "+c" (iterationCount)
-            : "d" (m_rounds), "S" (m_state.m_ptr)
+            : "d" (m_rounds), "S" (state)
             : "memory", "cc"
     #endif
         );
diff --git a/sosemanuk.cpp b/sosemanuk.cpp
index 52dd24b..a642ac7 100644
--- a/sosemanuk.cpp
+++ b/sosemanuk.cpp
@@ -326,8 +326,11 @@ void 
SosemanukPolicy::OperateKeystream(KeystreamOperation operation, byte *outpu
 {
 #endif    // #ifdef CRYPTOPP_GENERATE_X64_MASM
 
+    // m_state.m_ptr was used below. Fetch it through data() member so we 
can make SecBlock's members private
+    word32* state = m_state.data();
+
 #ifdef CRYPTOPP_X64_MASM_AVAILABLE
-    Sosemanuk_OperateKeystream(iterationCount, input, output, 
m_state.data());
+    Sosemanuk_OperateKeystream(iterationCount, input, output, state);
     return;
 #endif
 
@@ -353,6 +356,7 @@ void 
SosemanukPolicy::OperateKeystream(KeystreamOperation operation, byte *outpu
 #ifdef __GNUC__
     #if CRYPTOPP_BOOL_X64
         FixedSizeAlignedSecBlock<byte, 80*4*2+12*4+8*WORD_SZ> workspace;
+        const byte* space = workspace.data();
     #endif
         __asm__ __volatile__
         (
@@ -598,9 +602,9 @@ void 
SosemanukPolicy::OperateKeystream(KeystreamOperation operation, byte *outpu
         AS_POP_IF86(    bx)
         GNU_AS_ATT_SYNTAX
             :
-            : "a" (m_state.m_ptr), "c" (iterationCount), "S" 
(s_sosemanukMulTables), "D" (output), "d" (input)
+            : "a" (state), "c" (iterationCount), "S" 
(s_sosemanukMulTables), "D" (output), "d" (input)
     #if CRYPTOPP_BOOL_X64
-            , "r" (workspace.m_ptr)
+            , "r" (space)
             : "memory", "cc", "%r9", "%r10", "%xmm0", "%xmm1", "%xmm2", 
"%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7"
     #else
             : "memory", "cc"

-- 
-- 
You received this message because you are subscribed to the "Crypto++ Users" 
Google Group.
To unsubscribe, send an email to [email protected].
More information about Crypto++ and this group is available at 
http://www.cryptopp.com.
--- 
You received this message because you are subscribed to the Google Groups 
"Crypto++ Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to