From 6e1436294082bd7412839b5d6796c105298be006 Mon Sep 17 00:00:00 2001 From: Jay Satiro Date: Mon, 23 Mar 2015 02:12:01 -0400 Subject: [PATCH 001/350] build: Add DLL configurations to wolfssl64.sln and all vcxproj files - Remove extern from declspec in WOLFSSL_API macro. - Add a property file to *.vcxproj so that $(DefaultPlatformToolset) is available. - Remove the specified platform toolset (VS 2012) in *.vcxproj. This change allows the projects to use $(DefaultPlatformToolset) so that they will be built using the default platform toolset for whatever version of Visual Studio 2010+ that loads them. - Add DLL Release and DLL Debug configurations to *.vcxproj except for sslSniffer.vcxproj. The sniffer uses internal library components that aren't exposed in the wolfSSL DLL so it can only be built by linking to CyaSSL's static lib. - Change intermediate output directory of obj files to \obj\. The purpose of this change is to separate the output files from the intermediate files because sometimes they can end up in the same dir. --- examples/client/client.vcxproj | 160 +++++++++++++++++- examples/client/client.vcxproj.props | 44 +++++ examples/echoclient/echoclient.vcxproj | 160 +++++++++++++++++- examples/echoclient/echoclient.vcxproj.props | 44 +++++ examples/echoserver/echoserver.vcxproj | 160 +++++++++++++++++- examples/echoserver/echoserver.vcxproj.props | 44 +++++ examples/server/server.vcxproj | 160 +++++++++++++++++- examples/server/server.vcxproj.props | 44 +++++ sslSniffer/sslSniffer.vcxproj | 15 +- sslSniffer/sslSniffer.vcxproj.props | 44 +++++ testsuite/testsuite.vcxproj | 160 +++++++++++++++++- testsuite/testsuite.vcxproj.props | 44 +++++ wolfssl.vcxproj | 167 +++++++++++++++++-- wolfssl.vcxproj.props | 44 +++++ wolfssl/wolfcrypt/visibility.h | 4 +- wolfssl64.sln | 58 ++++++- 16 files changed, 1300 insertions(+), 52 deletions(-) create mode 100644 examples/client/client.vcxproj.props create mode 100644 examples/echoclient/echoclient.vcxproj.props create mode 100644 examples/echoserver/echoserver.vcxproj.props create mode 100644 examples/server/server.vcxproj.props create mode 100644 sslSniffer/sslSniffer.vcxproj.props create mode 100644 testsuite/testsuite.vcxproj.props create mode 100644 wolfssl.vcxproj.props diff --git a/examples/client/client.vcxproj b/examples/client/client.vcxproj index 4442c56fd..eed2b0f81 100644 --- a/examples/client/client.vcxproj +++ b/examples/client/client.vcxproj @@ -9,6 +9,22 @@ Debug x64 + + DLL Debug + Win32 + + + DLL Debug + x64 + + + DLL Release + Win32 + + + DLL Release + x64 + Release Win32 @@ -24,26 +40,41 @@ Win32Proj + Application - v110 + Unicode + true + + + Application Unicode true Application - v110 + Unicode + true + + + Application Unicode true Application - v110 + Unicode + + + Application Unicode Application - v110 + Unicode + + + Application Unicode @@ -52,34 +83,70 @@ + + + + + + + + + + + + <_ProjectFileVersion>11.0.61030.0 $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ true true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + false + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ false false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ @@ -101,6 +168,26 @@ false + + + Disabled + ../../;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + Disabled @@ -119,6 +206,24 @@ Console + + + Disabled + ../../;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + + MaxSpeed @@ -141,6 +246,28 @@ false + + + MaxSpeed + true + ../../;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + MaxSpeed @@ -162,6 +289,27 @@ true + + + MaxSpeed + true + ../../;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + true + true + + diff --git a/examples/client/client.vcxproj.props b/examples/client/client.vcxproj.props new file mode 100644 index 000000000..97cb4c2ec --- /dev/null +++ b/examples/client/client.vcxproj.props @@ -0,0 +1,44 @@ + + + + + + v100 + + $(DefaultPlatformToolset) + + diff --git a/examples/echoclient/echoclient.vcxproj b/examples/echoclient/echoclient.vcxproj index 342bb9ca5..5ca5d43ad 100644 --- a/examples/echoclient/echoclient.vcxproj +++ b/examples/echoclient/echoclient.vcxproj @@ -9,6 +9,22 @@ Debug x64 + + DLL Debug + Win32 + + + DLL Debug + x64 + + + DLL Release + Win32 + + + DLL Release + x64 + Release Win32 @@ -24,26 +40,41 @@ Win32Proj + Application - v110 + Unicode + true + + + Application Unicode true Application - v110 + Unicode + true + + + Application Unicode true Application - v110 + Unicode + + + Application Unicode Application - v110 + Unicode + + + Application Unicode @@ -52,34 +83,70 @@ + + + + + + + + + + + + <_ProjectFileVersion>11.0.61030.0 $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ true true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + false + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ false false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ @@ -102,6 +169,26 @@ + + + Disabled + ../../;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + Disabled @@ -120,6 +207,24 @@ Console + + + Disabled + ../../;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + + MaxSpeed @@ -143,6 +248,28 @@ + + + MaxSpeed + true + ../../;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + MaxSpeed @@ -164,6 +291,27 @@ true + + + MaxSpeed + true + ../../;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + true + true + + diff --git a/examples/echoclient/echoclient.vcxproj.props b/examples/echoclient/echoclient.vcxproj.props new file mode 100644 index 000000000..97cb4c2ec --- /dev/null +++ b/examples/echoclient/echoclient.vcxproj.props @@ -0,0 +1,44 @@ + + + + + + v100 + + $(DefaultPlatformToolset) + + diff --git a/examples/echoserver/echoserver.vcxproj b/examples/echoserver/echoserver.vcxproj index a9c210cbd..09381a8f6 100644 --- a/examples/echoserver/echoserver.vcxproj +++ b/examples/echoserver/echoserver.vcxproj @@ -9,6 +9,22 @@ Debug x64 + + DLL Debug + Win32 + + + DLL Debug + x64 + + + DLL Release + Win32 + + + DLL Release + x64 + Release Win32 @@ -24,26 +40,41 @@ Win32Proj + Application - v110 + Unicode + true + + + Application Unicode true Application - v110 + Unicode + true + + + Application Unicode true Application - v110 + Unicode + + + Application Unicode Application - v110 + Unicode + + + Application Unicode @@ -52,34 +83,70 @@ + + + + + + + + + + + + <_ProjectFileVersion>11.0.61030.0 $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ true true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + false + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ false false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ @@ -102,6 +169,26 @@ + + + Disabled + ../../;%(AdditionalIncludeDirectories) + USE_ANY_ADDR;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + Disabled @@ -120,6 +207,24 @@ Console + + + Disabled + ../../;%(AdditionalIncludeDirectories) + USE_ANY_ADDR;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + + MaxSpeed @@ -142,6 +247,28 @@ false + + + MaxSpeed + true + ../../;%(AdditionalIncludeDirectories) + USE_ANY_ADDR;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + MaxSpeed @@ -163,6 +290,27 @@ true + + + MaxSpeed + true + ../../;%(AdditionalIncludeDirectories) + USE_ANY_ADDR;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + true + true + + diff --git a/examples/echoserver/echoserver.vcxproj.props b/examples/echoserver/echoserver.vcxproj.props new file mode 100644 index 000000000..97cb4c2ec --- /dev/null +++ b/examples/echoserver/echoserver.vcxproj.props @@ -0,0 +1,44 @@ + + + + + + v100 + + $(DefaultPlatformToolset) + + diff --git a/examples/server/server.vcxproj b/examples/server/server.vcxproj index dc31fd672..6581aece5 100644 --- a/examples/server/server.vcxproj +++ b/examples/server/server.vcxproj @@ -9,6 +9,22 @@ Debug x64 + + DLL Debug + Win32 + + + DLL Debug + x64 + + + DLL Release + Win32 + + + DLL Release + x64 + Release Win32 @@ -24,26 +40,41 @@ Win32Proj + Application - v110 + Unicode + true + + + Application Unicode true Application - v110 + Unicode + true + + + Application Unicode true Application - v110 + Unicode + + + Application Unicode Application - v110 + Unicode + + + Application Unicode @@ -52,34 +83,70 @@ + + + + + + + + + + + + <_ProjectFileVersion>11.0.61030.0 $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ true true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + false + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ false false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ @@ -102,6 +169,26 @@ + + + Disabled + ../../;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + Disabled @@ -120,6 +207,24 @@ Console + + + Disabled + ../../;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + + MaxSpeed @@ -143,6 +248,28 @@ + + + MaxSpeed + true + ../../;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + MaxSpeed @@ -164,6 +291,27 @@ true + + + MaxSpeed + true + ../../;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + true + true + + diff --git a/examples/server/server.vcxproj.props b/examples/server/server.vcxproj.props new file mode 100644 index 000000000..97cb4c2ec --- /dev/null +++ b/examples/server/server.vcxproj.props @@ -0,0 +1,44 @@ + + + + + + v100 + + $(DefaultPlatformToolset) + + diff --git a/sslSniffer/sslSniffer.vcxproj b/sslSniffer/sslSniffer.vcxproj index 7419737c1..f00bf8e4b 100644 --- a/sslSniffer/sslSniffer.vcxproj +++ b/sslSniffer/sslSniffer.vcxproj @@ -24,26 +24,23 @@ Win32Proj + DynamicLibrary - v110 Unicode true DynamicLibrary - v110 Unicode true DynamicLibrary - v110 Unicode DynamicLibrary - v110 Unicode @@ -67,19 +64,23 @@ $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ true true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ false false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ @@ -166,7 +167,7 @@ - + diff --git a/sslSniffer/sslSniffer.vcxproj.props b/sslSniffer/sslSniffer.vcxproj.props new file mode 100644 index 000000000..97cb4c2ec --- /dev/null +++ b/sslSniffer/sslSniffer.vcxproj.props @@ -0,0 +1,44 @@ + + + + + + v100 + + $(DefaultPlatformToolset) + + diff --git a/testsuite/testsuite.vcxproj b/testsuite/testsuite.vcxproj index f7d5f16b5..a8c748918 100644 --- a/testsuite/testsuite.vcxproj +++ b/testsuite/testsuite.vcxproj @@ -9,6 +9,22 @@ Debug x64 + + DLL Debug + Win32 + + + DLL Debug + x64 + + + DLL Release + Win32 + + + DLL Release + x64 + Release Win32 @@ -24,26 +40,41 @@ Win32Proj + Application - v110 + Unicode + true + + + Application Unicode true Application - v110 + Unicode + true + + + Application Unicode true Application - v110 + Unicode + + + Application Unicode Application - v110 + Unicode + + + Application Unicode @@ -52,34 +83,70 @@ + + + + + + + + + + + + <_ProjectFileVersion>11.0.61030.0 $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ true true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + false + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ false false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ @@ -101,6 +168,26 @@ false + + + Disabled + ../;%(AdditionalIncludeDirectories) + NO_MAIN_DRIVER;WOLFSSL_RIPEMD;WOLFSSL_SHA512;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + Disabled @@ -119,6 +206,24 @@ Console + + + Disabled + ../;%(AdditionalIncludeDirectories) + NO_MAIN_DRIVER;WOLFSSL_RIPEMD;WOLFSSL_SHA512;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + + MaxSpeed @@ -141,6 +246,28 @@ false + + + MaxSpeed + true + ../;%(AdditionalIncludeDirectories) + NO_MAIN_DRIVER;WOLFSSL_RIPEMD;WOLFSSL_SHA512;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + MaxSpeed @@ -162,6 +289,27 @@ true + + + MaxSpeed + true + ../;%(AdditionalIncludeDirectories) + NO_MAIN_DRIVER;WOLFSSL_RIPEMD;WOLFSSL_SHA512;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + true + true + + diff --git a/testsuite/testsuite.vcxproj.props b/testsuite/testsuite.vcxproj.props new file mode 100644 index 000000000..97cb4c2ec --- /dev/null +++ b/testsuite/testsuite.vcxproj.props @@ -0,0 +1,44 @@ + + + + + + v100 + + $(DefaultPlatformToolset) + + diff --git a/wolfssl.vcxproj b/wolfssl.vcxproj index cf057198a..c4b6840a3 100644 --- a/wolfssl.vcxproj +++ b/wolfssl.vcxproj @@ -9,6 +9,22 @@ Debug x64 + + DLL Debug + Win32 + + + DLL Debug + x64 + + + DLL Release + Win32 + + + DLL Release + x64 + Release Win32 @@ -24,26 +40,41 @@ Win32Proj + StaticLibrary - v110 + Unicode + true + + + DynamicLibrary Unicode true StaticLibrary - v110 + Unicode + true + + + DynamicLibrary Unicode true StaticLibrary - v110 + Unicode + + + DynamicLibrary Unicode StaticLibrary - v110 + Unicode + + + DynamicLibrary Unicode @@ -52,29 +83,60 @@ + + + + + + + + + + + + - - <_ProjectFileVersion>11.0.61030.0 + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ + + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ - - + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ - Disabled @@ -89,6 +151,26 @@ 4206;4214;4706;%(DisableSpecificWarnings) + + + Disabled + ./;%(AdditionalIncludeDirectories) + OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + 4206;4214;4706;%(DisableSpecificWarnings) + + + ws2_32.lib;%(AdditionalDependencies) + false + true + + Disabled @@ -103,6 +185,25 @@ 4206;4214;4706;%(DisableSpecificWarnings) + + + Disabled + ./;%(AdditionalIncludeDirectories) + OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + 4206;4214;4706;%(DisableSpecificWarnings) + + + ws2_32.lib;%(AdditionalDependencies) + false + true + + MaxSpeed @@ -116,6 +217,24 @@ ProgramDatabase + + + MaxSpeed + true + ./;%(AdditionalIncludeDirectories) + OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + ws2_32.lib;%(AdditionalDependencies) + true + + MaxSpeed @@ -130,6 +249,24 @@ ProgramDatabase + + + MaxSpeed + true + ./;%(AdditionalIncludeDirectories) + OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + ws2_32.lib;%(AdditionalDependencies) + true + + @@ -169,14 +306,20 @@ false + false ml64.exe /c /Zi /Fo"$(OutDir)%(Filename).obj" %(Identity) + ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) $(OutDir)%(Filename).obj + $(IntDir)%(Filename).obj false + false ml64.exe /c /Zi /Fo"$(OutDir)%(Filename).obj" %(Identity) + ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) $(OutDir)%(Filename).obj + $(IntDir)%(Filename).obj - + \ No newline at end of file diff --git a/wolfssl.vcxproj.props b/wolfssl.vcxproj.props new file mode 100644 index 000000000..97cb4c2ec --- /dev/null +++ b/wolfssl.vcxproj.props @@ -0,0 +1,44 @@ + + + + + + v100 + + $(DefaultPlatformToolset) + + diff --git a/wolfssl/wolfcrypt/visibility.h b/wolfssl/wolfcrypt/visibility.h index 05fd4754b..6e41d238f 100644 --- a/wolfssl/wolfcrypt/visibility.h +++ b/wolfssl/wolfcrypt/visibility.h @@ -47,7 +47,7 @@ #define WOLFSSL_LOCAL __hidden #elif defined(_MSC_VER) #ifdef WOLFSSL_DLL - #define WOLFSSL_API extern __declspec(dllexport) + #define WOLFSSL_API __declspec(dllexport) #else #define WOLFSSL_API #endif @@ -59,7 +59,7 @@ #else /* BUILDING_WOLFSSL */ #if defined(_MSC_VER) #ifdef WOLFSSL_DLL - #define WOLFSSL_API extern __declspec(dllimport) + #define WOLFSSL_API __declspec(dllimport) #else #define WOLFSSL_API #endif diff --git a/wolfssl64.sln b/wolfssl64.sln index 223ad75da..5e17787dc 100644 --- a/wolfssl64.sln +++ b/wolfssl64.sln @@ -1,6 +1,6 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Express 2012 for Windows Desktop +# Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wolfssl", "wolfssl.vcxproj", "{73973223-5EE8-41CA-8E88-1D60E89A237B}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testsuite", "testsuite\testsuite.vcxproj", "{611E8971-46E0-4D0A-B5A1-632C3B00CB80}" @@ -19,6 +19,10 @@ Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Debug|x64 = DLL Debug|x64 + DLL Release|Win32 = DLL Release|Win32 + DLL Release|x64 = DLL Release|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection @@ -27,6 +31,14 @@ Global {73973223-5EE8-41CA-8E88-1D60E89A237B}.Debug|Win32.Build.0 = Debug|Win32 {73973223-5EE8-41CA-8E88-1D60E89A237B}.Debug|x64.ActiveCfg = Debug|x64 {73973223-5EE8-41CA-8E88-1D60E89A237B}.Debug|x64.Build.0 = Debug|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|x64.Build.0 = DLL Release|x64 {73973223-5EE8-41CA-8E88-1D60E89A237B}.Release|Win32.ActiveCfg = Release|Win32 {73973223-5EE8-41CA-8E88-1D60E89A237B}.Release|Win32.Build.0 = Release|Win32 {73973223-5EE8-41CA-8E88-1D60E89A237B}.Release|x64.ActiveCfg = Release|x64 @@ -35,6 +47,14 @@ Global {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.Debug|Win32.Build.0 = Debug|Win32 {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.Debug|x64.ActiveCfg = Debug|x64 {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.Debug|x64.Build.0 = Debug|x64 + {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Release|x64.Build.0 = DLL Release|x64 {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.Release|Win32.ActiveCfg = Release|Win32 {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.Release|Win32.Build.0 = Release|Win32 {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.Release|x64.ActiveCfg = Release|x64 @@ -43,6 +63,10 @@ Global {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.Debug|Win32.Build.0 = Debug|Win32 {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.Debug|x64.ActiveCfg = Debug|x64 {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.Debug|x64.Build.0 = Debug|x64 + {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.DLL Debug|Win32.ActiveCfg = Debug|Win32 + {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.DLL Debug|x64.ActiveCfg = Debug|x64 + {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.DLL Release|Win32.ActiveCfg = Release|Win32 + {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.DLL Release|x64.ActiveCfg = Release|x64 {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.Release|Win32.ActiveCfg = Release|Win32 {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.Release|Win32.Build.0 = Release|Win32 {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.Release|x64.ActiveCfg = Release|x64 @@ -51,6 +75,14 @@ Global {07D97C48-E08F-4E34-9F67-3064039FF2CB}.Debug|Win32.Build.0 = Debug|Win32 {07D97C48-E08F-4E34-9F67-3064039FF2CB}.Debug|x64.ActiveCfg = Debug|x64 {07D97C48-E08F-4E34-9F67-3064039FF2CB}.Debug|x64.Build.0 = Debug|x64 + {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Release|x64.Build.0 = DLL Release|x64 {07D97C48-E08F-4E34-9F67-3064039FF2CB}.Release|Win32.ActiveCfg = Release|Win32 {07D97C48-E08F-4E34-9F67-3064039FF2CB}.Release|Win32.Build.0 = Release|Win32 {07D97C48-E08F-4E34-9F67-3064039FF2CB}.Release|x64.ActiveCfg = Release|x64 @@ -59,6 +91,14 @@ Global {8362A816-C5DC-4E22-B5C5-9E6806387073}.Debug|Win32.Build.0 = Debug|Win32 {8362A816-C5DC-4E22-B5C5-9E6806387073}.Debug|x64.ActiveCfg = Debug|x64 {8362A816-C5DC-4E22-B5C5-9E6806387073}.Debug|x64.Build.0 = Debug|x64 + {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Release|x64.Build.0 = DLL Release|x64 {8362A816-C5DC-4E22-B5C5-9E6806387073}.Release|Win32.ActiveCfg = Release|Win32 {8362A816-C5DC-4E22-B5C5-9E6806387073}.Release|Win32.Build.0 = Release|Win32 {8362A816-C5DC-4E22-B5C5-9E6806387073}.Release|x64.ActiveCfg = Release|x64 @@ -67,6 +107,14 @@ Global {3ADE9549-582D-4D8E-9826-B172197A7959}.Debug|Win32.Build.0 = Debug|Win32 {3ADE9549-582D-4D8E-9826-B172197A7959}.Debug|x64.ActiveCfg = Debug|x64 {3ADE9549-582D-4D8E-9826-B172197A7959}.Debug|x64.Build.0 = Debug|x64 + {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Release|x64.Build.0 = DLL Release|x64 {3ADE9549-582D-4D8E-9826-B172197A7959}.Release|Win32.ActiveCfg = Release|Win32 {3ADE9549-582D-4D8E-9826-B172197A7959}.Release|Win32.Build.0 = Release|Win32 {3ADE9549-582D-4D8E-9826-B172197A7959}.Release|x64.ActiveCfg = Release|x64 @@ -75,6 +123,14 @@ Global {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.Debug|Win32.Build.0 = Debug|Win32 {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.Debug|x64.ActiveCfg = Debug|x64 {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.Debug|x64.Build.0 = Debug|x64 + {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Release|x64.Build.0 = DLL Release|x64 {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.Release|Win32.ActiveCfg = Release|Win32 {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.Release|Win32.Build.0 = Release|Win32 {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.Release|x64.ActiveCfg = Release|x64 From b8b13ad9e9d7d0e5c55635e85e0d4bb4db38a660 Mon Sep 17 00:00:00 2001 From: Jay Satiro Date: Wed, 1 Apr 2015 02:05:15 -0400 Subject: [PATCH 002/350] build: Revert using MSBuild property files to auto-detect platform toolset Prior to this change I had added a .props file for each .vcxproj to use MSBuild's $(DefaultPlatformToolset) as the the default for $(PlatformToolset). Typically that configuration allows for the appropriate toolset to be used no matter which version of VS2010+ the wolfssl64.sln and project files are opened in. Problem is when an MSBuild was used from the command line to build the solution it got the $(DefaultPlatformToolset) from a property file based on the solution header (currently "Format Version 12.00" which maps to Visual Studio 2012) instead. Another side effect was it set the VisualStudioVersion to 11.0 (n - 1; n in this case 12.0) which was incorrect. To remedy the above this change reverts back to the old PlatformToolset method where the v110 toolset (Visual Studio 2012) is specified in every configuration in every vcxproj. The user will have to specify explicitly a different toolset to override it (either via command line or the GUI) if they are not using VS2012. VS2010 example: msbuild -p:Configuration="Debug" wolfssl64.sln -p:PlatformToolset=v100 --- examples/client/client.vcxproj | 9 +++- examples/client/client.vcxproj.props | 44 -------------------- examples/echoclient/echoclient.vcxproj | 9 +++- examples/echoclient/echoclient.vcxproj.props | 44 -------------------- examples/echoserver/echoserver.vcxproj | 9 +++- examples/echoserver/echoserver.vcxproj.props | 44 -------------------- examples/server/server.vcxproj | 9 +++- examples/server/server.vcxproj.props | 44 -------------------- sslSniffer/sslSniffer.vcxproj | 5 ++- sslSniffer/sslSniffer.vcxproj.props | 44 -------------------- testsuite/testsuite.vcxproj | 9 +++- testsuite/testsuite.vcxproj.props | 44 -------------------- wolfssl.vcxproj | 9 +++- wolfssl.vcxproj.props | 44 -------------------- 14 files changed, 52 insertions(+), 315 deletions(-) delete mode 100644 examples/client/client.vcxproj.props delete mode 100644 examples/echoclient/echoclient.vcxproj.props delete mode 100644 examples/echoserver/echoserver.vcxproj.props delete mode 100644 examples/server/server.vcxproj.props delete mode 100644 sslSniffer/sslSniffer.vcxproj.props delete mode 100644 testsuite/testsuite.vcxproj.props delete mode 100644 wolfssl.vcxproj.props diff --git a/examples/client/client.vcxproj b/examples/client/client.vcxproj index eed2b0f81..dec191d7a 100644 --- a/examples/client/client.vcxproj +++ b/examples/client/client.vcxproj @@ -40,41 +40,48 @@ Win32Proj - Application + v110 Unicode true Application + v110 Unicode true Application + v110 Unicode true Application + v110 Unicode true Application + v110 Unicode Application + v110 Unicode Application + v110 Unicode Application + v110 Unicode diff --git a/examples/client/client.vcxproj.props b/examples/client/client.vcxproj.props deleted file mode 100644 index 97cb4c2ec..000000000 --- a/examples/client/client.vcxproj.props +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - v100 - - $(DefaultPlatformToolset) - - diff --git a/examples/echoclient/echoclient.vcxproj b/examples/echoclient/echoclient.vcxproj index 5ca5d43ad..a3a60545a 100644 --- a/examples/echoclient/echoclient.vcxproj +++ b/examples/echoclient/echoclient.vcxproj @@ -40,41 +40,48 @@ Win32Proj - Application + v110 Unicode true Application + v110 Unicode true Application + v110 Unicode true Application + v110 Unicode true Application + v110 Unicode Application + v110 Unicode Application + v110 Unicode Application + v110 Unicode diff --git a/examples/echoclient/echoclient.vcxproj.props b/examples/echoclient/echoclient.vcxproj.props deleted file mode 100644 index 97cb4c2ec..000000000 --- a/examples/echoclient/echoclient.vcxproj.props +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - v100 - - $(DefaultPlatformToolset) - - diff --git a/examples/echoserver/echoserver.vcxproj b/examples/echoserver/echoserver.vcxproj index 09381a8f6..096ba75c6 100644 --- a/examples/echoserver/echoserver.vcxproj +++ b/examples/echoserver/echoserver.vcxproj @@ -40,41 +40,48 @@ Win32Proj - Application + v110 Unicode true Application + v110 Unicode true Application + v110 Unicode true Application + v110 Unicode true Application + v110 Unicode Application + v110 Unicode Application + v110 Unicode Application + v110 Unicode diff --git a/examples/echoserver/echoserver.vcxproj.props b/examples/echoserver/echoserver.vcxproj.props deleted file mode 100644 index 97cb4c2ec..000000000 --- a/examples/echoserver/echoserver.vcxproj.props +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - v100 - - $(DefaultPlatformToolset) - - diff --git a/examples/server/server.vcxproj b/examples/server/server.vcxproj index 6581aece5..f6b53fc57 100644 --- a/examples/server/server.vcxproj +++ b/examples/server/server.vcxproj @@ -40,41 +40,48 @@ Win32Proj - Application + v110 Unicode true Application + v110 Unicode true Application + v110 Unicode true Application + v110 Unicode true Application + v110 Unicode Application + v110 Unicode Application + v110 Unicode Application + v110 Unicode diff --git a/examples/server/server.vcxproj.props b/examples/server/server.vcxproj.props deleted file mode 100644 index 97cb4c2ec..000000000 --- a/examples/server/server.vcxproj.props +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - v100 - - $(DefaultPlatformToolset) - - diff --git a/sslSniffer/sslSniffer.vcxproj b/sslSniffer/sslSniffer.vcxproj index f00bf8e4b..56404e997 100644 --- a/sslSniffer/sslSniffer.vcxproj +++ b/sslSniffer/sslSniffer.vcxproj @@ -24,23 +24,26 @@ Win32Proj - DynamicLibrary + v110 Unicode true DynamicLibrary + v110 Unicode true DynamicLibrary + v110 Unicode DynamicLibrary + v110 Unicode diff --git a/sslSniffer/sslSniffer.vcxproj.props b/sslSniffer/sslSniffer.vcxproj.props deleted file mode 100644 index 97cb4c2ec..000000000 --- a/sslSniffer/sslSniffer.vcxproj.props +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - v100 - - $(DefaultPlatformToolset) - - diff --git a/testsuite/testsuite.vcxproj b/testsuite/testsuite.vcxproj index a8c748918..484a87584 100644 --- a/testsuite/testsuite.vcxproj +++ b/testsuite/testsuite.vcxproj @@ -40,41 +40,48 @@ Win32Proj - Application + v110 Unicode true Application + v110 Unicode true Application + v110 Unicode true Application + v110 Unicode true Application + v110 Unicode Application + v110 Unicode Application + v110 Unicode Application + v110 Unicode diff --git a/testsuite/testsuite.vcxproj.props b/testsuite/testsuite.vcxproj.props deleted file mode 100644 index 97cb4c2ec..000000000 --- a/testsuite/testsuite.vcxproj.props +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - v100 - - $(DefaultPlatformToolset) - - diff --git a/wolfssl.vcxproj b/wolfssl.vcxproj index c4b6840a3..8a95297e1 100644 --- a/wolfssl.vcxproj +++ b/wolfssl.vcxproj @@ -40,41 +40,48 @@ Win32Proj - StaticLibrary + v110 Unicode true DynamicLibrary + v110 Unicode true StaticLibrary + v110 Unicode true DynamicLibrary + v110 Unicode true StaticLibrary + v110 Unicode DynamicLibrary + v110 Unicode StaticLibrary + v110 Unicode DynamicLibrary + v110 Unicode diff --git a/wolfssl.vcxproj.props b/wolfssl.vcxproj.props deleted file mode 100644 index 97cb4c2ec..000000000 --- a/wolfssl.vcxproj.props +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - v100 - - $(DefaultPlatformToolset) - - From 3aeedcf092e3cc0de2a728c5b9415652cb540d24 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Wed, 1 Apr 2015 16:19:29 +0900 Subject: [PATCH 003/350] fixed --enable-debug issue on Intel MULX, asm.c --- wolfcrypt/src/asm.c | 66 ++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/wolfcrypt/src/asm.c b/wolfcrypt/src/asm.c index fef35cd1c..a5ee7d1ba 100755 --- a/wolfcrypt/src/asm.c +++ b/wolfcrypt/src/asm.c @@ -1232,54 +1232,60 @@ __asm__( \ /* anything you need at the end */ #define COMBA_FINI -#define MULADD_MULX(b0, c0, c1)\ - __asm__ volatile ( \ +#define MULADD_MULX(b0, c0, c1, rdx)\ + __asm__ volatile ( \ + "movq %3, %%rdx\n\t" \ "mulx %2,%%r9, %%r8 \n\t" \ "adoxq %%r9,%0 \n\t" \ "adcxq %%r8,%1 \n\t" \ - :"+r"(c0),"+r"(c1):"r"(b0):"%r8","%r9","%r10","%rdx"\ + :"+r"(c0),"+r"(c1):"r"(b0), "r"(rdx):"%r8","%r9","%r10","%rdx"\ ) #define MULADD_MULX_ADD_CARRY(c0, c1)\ __asm__ volatile(\ "mov $0, %%r10\n\t"\ - "movq %1, %%r8\n\t" \ + "movq %1, %%r8\n\t"\ "adox %%r10, %0\n\t"\ "adcx %%r10, %1\n\t"\ :"+r"(c0),"+r"(c1)::"%r8","%r9","%r10","%rdx") ; #define MULADD_SET_A(a0)\ - __asm__ volatile("add $0, %%r8\n\t" \ - "movq %0,%%rdx\n\t"::"r"(a0):"%r8","%r9","%r10","%rdx") ; \ + __asm__ volatile("add $0, %%r8\n\t" \ + "movq %0,%%rdx\n\t" \ + ::"r"(a0):"%r8","%r9","%r10","%rdx") ; #define MULADD_BODY(a,b,c)\ - cp = &(c->dp[iz]) ;\ - c0 = cp[0] ; c1 = cp[1];\ - MULADD_SET_A(a->dp[ix]) ;\ - MULADD_MULX(b0, c0, c1) ;\ - cp[0]=c0; c0=cp[2]; cp++ ;\ - MULADD_MULX(b1, c1, c0) ;\ - cp[0]=c1; c1=cp[2]; cp++ ; \ - MULADD_MULX(b2, c0, c1) ;\ - cp[0]=c0; c0=cp[2]; cp++ ; \ - MULADD_MULX(b3, c1, c0) ;\ - cp[0]=c1; c1=cp[2]; cp++ ; \ - MULADD_MULX_ADD_CARRY(c0, c1) ;\ - cp[0]=c0; cp[1]=c1; + { word64 rdx = a->dp[ix] ; \ + cp = &(c->dp[iz]) ; \ + c0 = cp[0] ; c1 = cp[1]; \ + MULADD_SET_A(rdx) ; \ + MULADD_MULX(b0, c0, c1, rdx) ;\ + cp[0]=c0; c0=cp[2]; \ + MULADD_MULX(b1, c1, c0, rdx) ;\ + cp[1]=c1; c1=cp[3]; \ + MULADD_MULX(b2, c0, c1, rdx) ;\ + cp[2]=c0; c0=cp[4]; \ + MULADD_MULX(b3, c1, c0, rdx) ;\ + cp[3]=c1; c1=cp[5]; \ + MULADD_MULX_ADD_CARRY(c0, c1);\ + cp[4]=c0; cp[5]=c1; \ + } #define TFM_INTEL_MUL_COMBA(a, b, c)\ - for(ix=0; ixdp[ix]=0 ;\ - for(iy=0; (iyused); iy+=4) {\ - fp_digit *bp ;\ - bp = &(b->dp[iy+0]) ; \ - fp_digit b0 = bp[0] , b1= bp[1], b2= bp[2], b3= bp[3];\ - ix=0, iz=iy;\ - while(ixused) {\ - fp_digit c0, c1; \ - fp_digit *cp ;\ - MULADD_BODY(a,b,c); ix++ ; iz++ ; \ - }\ + for(ix=0; ixdp[ix]=0 ; \ + for(iy=0; (iyused); iy+=4) { \ + fp_digit *bp ; \ + bp = &(b->dp[iy+0]) ; \ + fp_digit b0 = bp[0] , b1= bp[1], \ + b2= bp[2], b3= bp[3]; \ + ix=0, iz=iy; \ + while(ixused) { \ + fp_digit c0, c1; \ + fp_digit *cp ; \ + MULADD_BODY(a,b,c); \ + ix++ ; iz++ ; \ + } \ }; #elif defined(TFM_X86_64) From 50e829ea7941f275d7c8f4e2c82aade6c17470b7 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Wed, 1 Apr 2015 15:36:55 -0700 Subject: [PATCH 004/350] when keeping peer cert, alt names were getting lost for the peer name check --- src/internal.c | 6 +++--- wolfcrypt/src/asn.c | 5 ++++- wolfssl/wolfcrypt/asn.h | 1 + 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/internal.c b/src/internal.c index 89dc78db4..49e078c49 100644 --- a/src/internal.c +++ b/src/internal.c @@ -3817,9 +3817,9 @@ int CopyDecodedToX509(WOLFSSL_X509* x509, DecodedCert* dCert) x509->derCert.length = dCert->maxIdx; } - x509->altNames = dCert->altNames; - dCert->altNames = NULL; /* takes ownership */ - x509->altNamesNext = x509->altNames; /* index hint */ + x509->altNames = dCert->altNames; + dCert->weOwnAltNames = 0; + x509->altNamesNext = x509->altNames; /* index hint */ x509->isCa = dCert->isCA; #ifdef OPENSSL_EXTRA diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 6c61fbf2a..231ad0ce1 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -1425,6 +1425,7 @@ void InitDecodedCert(DecodedCert* cert, byte* source, word32 inSz, void* heap) cert->subjectCNLen = 0; cert->subjectCNEnc = CTC_UTF8; cert->subjectCNStored = 0; + cert->weOwnAltNames = 0; cert->altNames = NULL; #ifndef IGNORE_NAME_CONSTRAINTS cert->altEmailNames = NULL; @@ -1563,7 +1564,7 @@ void FreeDecodedCert(DecodedCert* cert) XFREE(cert->subjectCN, cert->heap, DYNAMIC_TYPE_SUBJECT_CN); if (cert->pubKeyStored == 1) XFREE(cert->publicKey, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY); - if (cert->altNames) + if (cert->weOwnAltNames && cert->altNames) FreeAltNames(cert->altNames, cert->heap); #ifndef IGNORE_NAME_CONSTRAINTS if (cert->altEmailNames) @@ -3416,6 +3417,8 @@ static int DecodeAltNames(byte* input, int sz, DecodedCert* cert) return ASN_PARSE_E; } + cert->weOwnAltNames = 1; + while (length > 0) { byte b = input[idx++]; diff --git a/wolfssl/wolfcrypt/asn.h b/wolfssl/wolfcrypt/asn.h index bcea930ab..7511cdfc4 100644 --- a/wolfssl/wolfcrypt/asn.h +++ b/wolfssl/wolfcrypt/asn.h @@ -387,6 +387,7 @@ struct DecodedCert { byte extNameConstraintSet; #endif /* IGNORE_NAME_CONSTRAINTS */ byte isCA; /* CA basic constraint true */ + byte weOwnAltNames; /* altNames haven't been given to copy */ byte extKeyUsageSet; word16 extKeyUsage; /* Key usage bitfield */ byte extExtKeyUsageSet; /* Extended Key Usage */ From ad29c262d4321a0dcc392cf1d741ff6fb7b1b9e5 Mon Sep 17 00:00:00 2001 From: Vikram Adiga Date: Wed, 1 Apr 2015 16:21:48 -0700 Subject: [PATCH 005/350] use Seconds APIs instead of MYTIME APIs for TI-RTOS --- src/internal.c | 2 +- wolfcrypt/src/asn.c | 2 +- wolfssl/wolfcrypt/settings.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/internal.c b/src/internal.c index 49e078c49..176c98b3f 100644 --- a/src/internal.c +++ b/src/internal.c @@ -2349,7 +2349,7 @@ ProtocolVersion MakeDTLSv1_2(void) word32 LowResTimer(void) { - return (word32) MYTIME_gettime(); + return (word32) Seconds_get(); } #elif defined(USER_TICKS) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 231ad0ce1..399753ab3 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -363,7 +363,7 @@ time_t XTIME(time_t * timer) { time_t sec = 0; - sec = (time_t) MYTIME_gettime(); + sec = (time_t) Seconds_get(); if (timer != NULL) *timer = sec; diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index 9ffe61acd..23924ca2c 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -340,7 +340,7 @@ #pragma diag_suppress=11 #endif - #include + #include #endif #ifdef EBSNET From 4a5912c7544aa1bae8544dc414d3e6b6541390c6 Mon Sep 17 00:00:00 2001 From: Vikram Adiga Date: Wed, 1 Apr 2015 16:43:05 -0700 Subject: [PATCH 006/350] fix tirtos build for wolfssl name change --- tirtos/packages/ti/net/wolfssl/package.bld | 2 +- tirtos/packages/ti/net/wolfssl/package.xdc | 3 +-- tirtos/packages/ti/net/wolfssl/package.xs | 2 +- .../wolfcrypt/benchmark/TM4C1294NC.icf | 0 .../wolfcrypt/benchmark/benchmark.cfg | 0 .../{ => EK_TM4C1294XL}/wolfcrypt/benchmark/main.c | 4 ++-- .../wolfcrypt/benchmark/package.bld | 10 +++++----- .../EK_TM4C1294XL/wolfcrypt/benchmark/package.xdc | 6 ++++++ .../wolfcrypt/test/TM4C1294NC.icf | 0 .../tests/{ => EK_TM4C1294XL}/wolfcrypt/test/main.c | 3 +-- .../{ => EK_TM4C1294XL}/wolfcrypt/test/package.bld | 10 +++++----- .../tests/EK_TM4C1294XL/wolfcrypt/test/package.xdc | 6 ++++++ .../{ => EK_TM4C1294XL}/wolfcrypt/test/test.cfg | 0 .../wolfssl/tests/wolfcrypt/benchmark/package.xdc | 6 ------ .../ti/net/wolfssl/tests/wolfcrypt/test/package.xdc | 6 ------ tirtos/wolfssl.bld | 13 ++++++++----- 16 files changed, 36 insertions(+), 35 deletions(-) rename tirtos/packages/ti/net/wolfssl/tests/{ => EK_TM4C1294XL}/wolfcrypt/benchmark/TM4C1294NC.icf (100%) rename tirtos/packages/ti/net/wolfssl/tests/{ => EK_TM4C1294XL}/wolfcrypt/benchmark/benchmark.cfg (100%) rename tirtos/packages/ti/net/wolfssl/tests/{ => EK_TM4C1294XL}/wolfcrypt/benchmark/main.c (97%) rename tirtos/packages/ti/net/wolfssl/tests/{ => EK_TM4C1294XL}/wolfcrypt/benchmark/package.bld (93%) create mode 100644 tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/benchmark/package.xdc rename tirtos/packages/ti/net/wolfssl/tests/{ => EK_TM4C1294XL}/wolfcrypt/test/TM4C1294NC.icf (100%) rename tirtos/packages/ti/net/wolfssl/tests/{ => EK_TM4C1294XL}/wolfcrypt/test/main.c (95%) rename tirtos/packages/ti/net/wolfssl/tests/{ => EK_TM4C1294XL}/wolfcrypt/test/package.bld (92%) create mode 100644 tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/test/package.xdc rename tirtos/packages/ti/net/wolfssl/tests/{ => EK_TM4C1294XL}/wolfcrypt/test/test.cfg (100%) delete mode 100644 tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/benchmark/package.xdc delete mode 100644 tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/test/package.xdc diff --git a/tirtos/packages/ti/net/wolfssl/package.bld b/tirtos/packages/ti/net/wolfssl/package.bld index 95d0811ac..002cb08dc 100644 --- a/tirtos/packages/ti/net/wolfssl/package.bld +++ b/tirtos/packages/ti/net/wolfssl/package.bld @@ -50,7 +50,7 @@ var wolfSSLObjList = [ for each (var targ in Build.targets) { var libOptions = {incs: wolfsslPathInclude}; - var lib = Pkg.addLibrary("lib/" + Pkg.name, targ, libOptions); + var lib = Pkg.addLibrary("lib/wolfssl", targ, libOptions); lib.addObjects(wolfSSLObjList); } diff --git a/tirtos/packages/ti/net/wolfssl/package.xdc b/tirtos/packages/ti/net/wolfssl/package.xdc index f0c4b9f83..5fe467d45 100644 --- a/tirtos/packages/ti/net/wolfssl/package.xdc +++ b/tirtos/packages/ti/net/wolfssl/package.xdc @@ -1,7 +1,6 @@ /*! * ======== ti.net.wolfssl ======== * wolfSSL library for TI-RTOS - * */ -package ti.net.wolfssl { +package ti.net.wolfssl [1, 0, 0] { } diff --git a/tirtos/packages/ti/net/wolfssl/package.xs b/tirtos/packages/ti/net/wolfssl/package.xs index 9ecf38e5b..7f5215d36 100644 --- a/tirtos/packages/ti/net/wolfssl/package.xs +++ b/tirtos/packages/ti/net/wolfssl/package.xs @@ -8,5 +8,5 @@ */ function getLibs(prog) { - return ("lib/" + this.$name + ".a" + prog.build.target.suffix); + return ("lib/wolfssl.a" + prog.build.target.suffix); } diff --git a/tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/benchmark/TM4C1294NC.icf b/tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/benchmark/TM4C1294NC.icf similarity index 100% rename from tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/benchmark/TM4C1294NC.icf rename to tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/benchmark/TM4C1294NC.icf diff --git a/tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/benchmark/benchmark.cfg b/tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/benchmark/benchmark.cfg similarity index 100% rename from tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/benchmark/benchmark.cfg rename to tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/benchmark/benchmark.cfg diff --git a/tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/benchmark/main.c b/tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/benchmark/main.c similarity index 97% rename from tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/benchmark/main.c rename to tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/benchmark/main.c index 15ee1fb98..eddd432f7 100644 --- a/tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/benchmark/main.c +++ b/tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/benchmark/main.c @@ -1,6 +1,6 @@ /* * ======== main.c ======== - * Entry point for Benchmark application + * Entry point for Benchmark application */ /* BIOS Header files */ #include @@ -27,7 +27,7 @@ void runBenchmarks(UArg arg0, UArg arg1) { void *args = NULL; msTimer_init(); - + System_printf("Running benchmarks...\n"); System_flush(); benchmark_test(args); diff --git a/tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/benchmark/package.bld b/tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/benchmark/package.bld similarity index 93% rename from tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/benchmark/package.bld rename to tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/benchmark/package.bld index cff396855..453fee738 100644 --- a/tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/benchmark/package.bld +++ b/tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/benchmark/package.bld @@ -10,7 +10,7 @@ if ((typeof(TivaWareDir) == undefined) || (TivaWareDir == "")) { var Build = xdc.useModule('xdc.bld.BuildEnvironment'); var Pkg = xdc.useModule('xdc.bld.PackageContents'); -/* make command to search for the srcs */ +/* make command to search for the srcs */ Pkg.makePrologue = "vpath %.c $(subst ;, ,$(XPKGPATH))"; var srcs = [ @@ -37,16 +37,16 @@ for each (var targ in Build.targets) { targ.$orig.lnkOpts.suffix = suffix.replace(/PrintfSmall/, "PrintfFull"); } else if (targ.$name.match(/^gnu/)) { - targ.$orig.lnkOpts.suffix += " -L" + TivaWareDir + "/driverlib/gcc " + targ.$orig.lnkOpts.suffix += " -L" + TivaWareDir + "/driverlib/gcc " + " -Wl,--start-group -ldriver -Wl,--end-group "; targ.$orig.bspLib = "rdimon"; } - - var exeOptions = { incs: wolfsslPathInclude + + var exeOptions = { incs: wolfsslPathInclude + " -DNO_MAIN_DRIVER -D_INCLUDE_NIMU_CODE -DBENCH_EMBEDDED " + " -DTIVAWARE -DPART_TM4C1294NCPDT", lopts: lnkOpts - }; + }; var exe = Pkg.addExecutable("benchmark", targ, platform, exeOptions); exe.addObjects(srcs); diff --git a/tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/benchmark/package.xdc b/tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/benchmark/package.xdc new file mode 100644 index 000000000..6a93cc333 --- /dev/null +++ b/tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/benchmark/package.xdc @@ -0,0 +1,6 @@ +/* + * ======== ti.net.wolfssl.tests.EK_TM4C1294XL.wolfcrypt.benchmark ======== + * wc_ Benchmark Application + */ +package ti.net.wolfssl.tests.EK_TM4C1294XL.wolfcrypt.benchmark [1, 0, 0] { +} diff --git a/tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/test/TM4C1294NC.icf b/tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/test/TM4C1294NC.icf similarity index 100% rename from tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/test/TM4C1294NC.icf rename to tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/test/TM4C1294NC.icf diff --git a/tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/test/main.c b/tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/test/main.c similarity index 95% rename from tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/test/main.c rename to tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/test/main.c index 41378767a..88023e4e1 100644 --- a/tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/test/main.c +++ b/tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/test/main.c @@ -1,6 +1,6 @@ /* * ======== main.c ======== - * Entry point to wolfcrypt Test Application + * Entry point to wolfcrypt Test Application */ /* XDCtools Header files */ @@ -53,4 +53,3 @@ int main(int argc, char** argv) BIOS_start(); } - diff --git a/tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/test/package.bld b/tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/test/package.bld similarity index 92% rename from tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/test/package.bld rename to tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/test/package.bld index a76add170..adfca1c9c 100644 --- a/tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/test/package.bld +++ b/tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/test/package.bld @@ -10,7 +10,7 @@ if ((typeof(TivaWareDir) == undefined) || (TivaWareDir == "")) { var Build = xdc.useModule('xdc.bld.BuildEnvironment'); var Pkg = xdc.useModule('xdc.bld.PackageContents'); -/* make command to search for the srcs */ +/* make command to search for the srcs */ Pkg.makePrologue = "vpath %.c $(subst ;, ,$(XPKGPATH))"; var srcs = [ @@ -33,16 +33,16 @@ for each (var targ in Build.targets) { platform = "ti.platforms.tiva:TM4C1294NCPDT"; } else if (targ.$name.match(/^gnu/)) { - targ.$orig.lnkOpts.suffix += " -L" + TivaWareDir + "/driverlib/gcc " + targ.$orig.lnkOpts.suffix += " -L" + TivaWareDir + "/driverlib/gcc " + " -Wl,--start-group -ldriver -Wl,--end-group "; targ.$orig.bspLib = "rdimon"; } - - var exeOptions = { incs: wolfsslPathInclude + + var exeOptions = { incs: wolfsslPathInclude + " -DNO_MAIN_DRIVER -D_INCLUDE_NIMU_CODE -DBENCH_EMBEDDED " + " -DTIVAWARE -DPART_TM4C1294NCPDT", lopts: lnkOpts, - }; + }; var exe = Pkg.addExecutable("test", targ, platform, exeOptions); exe.addObjects(srcs); diff --git a/tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/test/package.xdc b/tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/test/package.xdc new file mode 100644 index 000000000..0b85d5786 --- /dev/null +++ b/tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/test/package.xdc @@ -0,0 +1,6 @@ +/* + * ======== ti.net.wolfssl.tests.EK_TM4C1294XL.wolfcrypt.test ======== + * wolfcrypt Test Application + */ +package ti.net.wolfssl.tests.EK_TM4C1294XL.wolfcrypt.test [1, 0, 0] { +} diff --git a/tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/test/test.cfg b/tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/test/test.cfg similarity index 100% rename from tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/test/test.cfg rename to tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/test/test.cfg diff --git a/tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/benchmark/package.xdc b/tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/benchmark/package.xdc deleted file mode 100644 index c027f3203..000000000 --- a/tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/benchmark/package.xdc +++ /dev/null @@ -1,6 +0,0 @@ -/* - * ======== ti.net.wolfssl.tests.wolfcrypt.benchmark ======== - * wc_ Benchmark Application - */ -package ti.net.wolfssl.tests.wolfcrypt.benchmark { -} diff --git a/tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/test/package.xdc b/tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/test/package.xdc deleted file mode 100644 index 8b5cc1db6..000000000 --- a/tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/test/package.xdc +++ /dev/null @@ -1,6 +0,0 @@ -/* - * ======== ti.net.wolfssl.tests.wolfcrypt.test ======== - * wolfcrypt Test Application - */ -package ti.net.wolfssl.tests.wolfcrypt.test { -} diff --git a/tirtos/wolfssl.bld b/tirtos/wolfssl.bld index 5702b8340..696208ba0 100644 --- a/tirtos/wolfssl.bld +++ b/tirtos/wolfssl.bld @@ -32,21 +32,24 @@ */ var armOpts = " -ms "; -var gnuOpts = ""; +var gnuOpts = " -D_POSIX_SOURCE "; var iarOpts = ""; /* Uncomment the following lines to build libraries for debug mode: */ // Pkg.attrs.profile = "debug"; // armOpts += " -g -o0 "; -// gnuOpts += " -g "; +// gnuOpts += " -g -D_POSIX_SOURCE "; // iarOpts += " --debug "; var ccOpts = { - "ti.targets.arm.elf.M4F" : armOpts, + "ti.targets.arm.elf.M4" : armOpts, + "ti.targets.arm.elf.M4F" : armOpts, - "gnu.targets.arm.M4F" : gnuOpts, + "gnu.targets.arm.M4" : gnuOpts, + "gnu.targets.arm.M4F" : gnuOpts, - "iar.targets.arm.M4F" : iarOpts, + "iar.targets.arm.M4" : iarOpts, + "iar.targets.arm.M4F" : iarOpts, }; /* initialize local vars with those set in xdcpaths.mak (via XDCARGS) */ From 327a5c6dc2f1fdc9fe7ecf2c1ac0374600abb3e2 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Wed, 1 Apr 2015 19:38:03 -0700 Subject: [PATCH 007/350] added compile time check for Max Strength that all the requirements aren't disabled --- wolfssl/internal.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 9dbf02c6c..55af1d1b9 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -188,6 +188,19 @@ typedef byte word24[3]; need to be switched off. Allowed suites use (EC)DHE, AES-GCM|CCM, or CHACHA-POLY. */ + +/* Check that if WOLFSSL_MAX_STRENGTH is set that all the required options are + * not turned off. */ +#if defined(WOLFSSL_MAX_STRENGTH) && \ + ((!defined(HAVE_ECC) && (defined(NO_DH) || defined(NO_RSA))) || \ + (!defined(HAVE_AESGCM) && !defined(HAVE_AESCCM) && \ + (!defined(HAVE_POLY1305) || !defined(HAVE_CHACHA))) || \ + (defined(NO_SHA256) && !defined(WOLFSSL_SHA384)) || \ + !defined(NO_OLD_TLS)) + + #error "You are trying to build max strength with requirements disabled." +#endif + #ifndef WOLFSSL_MAX_STRENGTH #if !defined(NO_RSA) && !defined(NO_RC4) From b9aa7621e716267f310aec0010c5240270b75cce Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Thu, 2 Apr 2015 15:42:38 +0900 Subject: [PATCH 008/350] Intel MULX run time check in tfm.c --- wolfcrypt/src/asm.c | 53 ++++---------- wolfcrypt/src/tfm.c | 173 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 180 insertions(+), 46 deletions(-) diff --git a/wolfcrypt/src/asm.c b/wolfcrypt/src/asm.c index a5ee7d1ba..9dbf9a15a 100755 --- a/wolfcrypt/src/asm.c +++ b/wolfcrypt/src/asm.c @@ -87,7 +87,7 @@ __asm__( \ :"0"(_c[LO]), "1"(cy), "r"(mu), "r"(*tmpm++) \ : "%rax", "%rdx", "cc") -#ifdef HAVE_INTEL_MULX +#if defined(HAVE_INTEL_MULX) #define MULX_INIT(a0, c0, cy)\ __asm__ volatile( \ "xorq %%r10, %%r10\n\t" \ @@ -1208,7 +1208,8 @@ __asm__( \ "adcl $0,%2 \n\t" \ :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i), "m"(j) :"%eax","%edx","cc"); -#elif defined(HAVE_INTEL_MULX) +#elif defined(TFM_X86_64) +/* x86-64 optimized */ /* anything you need at the start */ #define COMBA_START @@ -1232,6 +1233,18 @@ __asm__( \ /* anything you need at the end */ #define COMBA_FINI +/* this should multiply i and j */ +#define MULADD(i, j) \ +__asm__ ( \ + "movq %6,%%rax \n\t" \ + "mulq %7 \n\t" \ + "addq %%rax,%0 \n\t" \ + "adcq %%rdx,%1 \n\t" \ + "adcq $0,%2 \n\t" \ + :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i), "g"(j) :"%rax","%rdx","cc"); + + +#if defined(HAVE_INTEL_MULX) #define MULADD_MULX(b0, c0, c1, rdx)\ __asm__ volatile ( \ "movq %3, %%rdx\n\t" \ @@ -1287,41 +1300,7 @@ __asm__( \ ix++ ; iz++ ; \ } \ }; - -#elif defined(TFM_X86_64) -/* x86-64 optimized */ - -/* anything you need at the start */ -#define COMBA_START - -/* clear the chaining variables */ -#define COMBA_CLEAR \ - c0 = c1 = c2 = 0; - -/* forward the carry to the next digit */ -#define COMBA_FORWARD \ - do { c0 = c1; c1 = c2; c2 = 0; } while (0); - -/* store the first sum */ -#define COMBA_STORE(x) \ - x = c0; - -/* store the second sum [carry] */ -#define COMBA_STORE2(x) \ - x = c1; - -/* anything you need at the end */ -#define COMBA_FINI - -/* this should multiply i and j */ -#define MULADD(i, j) \ -__asm__ ( \ - "movq %6,%%rax \n\t" \ - "mulq %7 \n\t" \ - "addq %%rax,%0 \n\t" \ - "adcq %%rdx,%1 \n\t" \ - "adcq $0,%2 \n\t" \ - :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i), "g"(j) :"%rax","%rdx","cc"); +#endif #elif defined(TFM_SSE2) /* use SSE2 optimizations */ diff --git a/wolfcrypt/src/tfm.c b/wolfcrypt/src/tfm.c index e479f8c4d..132898962 100755 --- a/wolfcrypt/src/tfm.c +++ b/wolfcrypt/src/tfm.c @@ -402,7 +402,74 @@ void fp_mul_2d(fp_int *a, int b, fp_int *c) /* generic PxQ multiplier */ #if defined(HAVE_INTEL_MULX) -void fp_mul_comba(fp_int *A, fp_int *B, fp_int *C) + +/* Each platform needs to query info type 1 from cpuid to see if aesni is + * supported. Also, let's setup a macro for proper linkage w/o ABI conflicts + */ + +#ifndef _MSC_VER + #define cpuid(reg, leaf, sub)\ + __asm__ __volatile__ ("cpuid":\ + "=a" (reg[0]), "=b" (reg[1]), "=c" (reg[2]), "=d" (reg[3]) :\ + "a" (leaf), "c"(sub)); + + #define XASM_LINK(f) asm(f) +#else + + #include + #define cpuid(a,b) __cpuid((int*)a,b) + + #define XASM_LINK(f) + +#endif /* _MSC_VER */ + +#define EAX 0 +#define EBX 1 +#define ECX 2 +#define EDX 3 + +#define CPUID_AVX1 0x1 +#define CPUID_AVX2 0x2 +#define CPUID_RDRAND 0x4 +#define CPUID_RDSEED 0x8 + +#define IS_INTEL_AVX1 (cpuid_flags&CPUID_AVX1) +#define IS_INTEL_AVX2 (cpuid_flags&CPUID_AVX2) +#define IS_INTEL_RDRAND (cpuid_flags&CPUID_RDRAND) +#define IS_INTEL_RDSEED (cpuid_flags&CPUID_RDSEED) +#define SET_FLAGS if(cpuid_check==0)set_cpuid_flags() + +static word32 cpuid_check = 0 ; +static word32 cpuid_flags = 0 ; + +static word32 cpuid_flag(word32 leaf, word32 sub, word32 num, word32 bit) { + int got_intel_cpu=0; + unsigned int reg[5]; + + reg[4] = '\0' ; + cpuid(reg, 0, 0); + if(memcmp((char *)&(reg[EBX]), "Genu", 4) == 0 && + memcmp((char *)&(reg[EDX]), "ineI", 4) == 0 && + memcmp((char *)&(reg[ECX]), "ntel", 4) == 0) { + got_intel_cpu = 1; + } + if (got_intel_cpu) { + cpuid(reg, leaf, sub); + return((reg[num]>>bit)&0x1) ; + } + return 0 ; +} + +INLINE static int set_cpuid_flags(void) { + if(cpuid_check == 0) { + if(cpuid_flag(7, 0, EBX, 5)){ cpuid_flags |= CPUID_AVX2 ; } + cpuid_check = 1 ; + return 0 ; + } + return 1 ; +} + +INLINE static void fp_mul_comba_mulx(fp_int *A, fp_int *B, fp_int *C) { int ix, iy, iz, pa; @@ -430,13 +497,22 @@ void fp_mul_comba(fp_int *A, fp_int *B, fp_int *C) fp_copy(dst, C); } -#else +#endif + void fp_mul_comba(fp_int *A, fp_int *B, fp_int *C) { int ix, iy, iz, tx, ty, pa; fp_digit c0, c1, c2, *tmpx, *tmpy; fp_int tmp, *dst; + #if defined(HAVE_INTEL_MULX) + SET_FLAGS ; + if(IS_INTEL_AVX2) { + fp_mul_comba_mulx(A, B, C) ; + return ; + } + #endif + COMBA_START; COMBA_CLEAR; @@ -485,7 +561,6 @@ void fp_mul_comba(fp_int *A, fp_int *B, fp_int *C) fp_clamp(dst); fp_copy(dst, C); } -#endif /* a/b => cb + d == a */ int fp_div(fp_int *a, fp_int *b, fp_int *c, fp_int *d) @@ -1567,10 +1642,9 @@ static inline void innermul8_mulx(fp_digit *c_mulx, fp_digit *cy_mulx, fp_digit c_mulx[0]=_c0; c_mulx[1]=_c1; c_mulx[2]=_c2; c_mulx[3]=_c3; c_mulx[4]=_c4; c_mulx[5]=_c5; c_mulx[6]=_c6; c_mulx[7]=_c7; *cy_mulx = cy ; } -#endif /* computes x/R == x (mod N) via Montgomery Reduction */ -void fp_montgomery_reduce(fp_int *a, fp_int *m, fp_digit mp) +static void fp_montgomery_reduce_mulx(fp_int *a, fp_int *m, fp_digit mp) { fp_digit c[FP_SIZE], *_c, *tmpm, mu = 0; int oldused, x, y, pa; @@ -1589,6 +1663,91 @@ void fp_montgomery_reduce(fp_int *a, fp_int *m, fp_digit mp) #endif + /* now zero the buff */ + XMEMSET(c, 0, sizeof c); + pa = m->used; + + /* copy the input */ + oldused = a->used; + for (x = 0; x < oldused; x++) { + c[x] = a->dp[x]; + } + MONT_START; + + for (x = 0; x < pa; x++) { + fp_digit cy = 0; + /* get Mu for this round */ + LOOP_START; + _c = c + x; + tmpm = m->dp; + y = 0; + for (; y < (pa & ~7); y += 8) { + innermul8_mulx(_c, &cy, tmpm, mu) ; + _c += 8; + tmpm += 8; + } + for (; y < pa; y++) { + INNERMUL; + ++_c; + } + LOOP_END; + while (cy) { + PROPCARRY; + ++_c; + } + } + + /* now copy out */ + _c = c + pa; + tmpm = a->dp; + for (x = 0; x < pa+1; x++) { + *tmpm++ = *_c++; + } + + for (; x < oldused; x++) { + *tmpm++ = 0; + } + + MONT_FINI; + + a->used = pa+1; + fp_clamp(a); + + /* if A >= m then A = A - m */ + if (fp_cmp_mag (a, m) != FP_LT) { + s_fp_sub (a, m, a); + } +} +#endif + +/* computes x/R == x (mod N) via Montgomery Reduction */ +void fp_montgomery_reduce(fp_int *a, fp_int *m, fp_digit mp) +{ + fp_digit c[FP_SIZE], *_c, *tmpm, mu = 0; + int oldused, x, y, pa; + + #ifdef HAVE_INTEL_MULX + SET_FLAGS ; + if(IS_INTEL_AVX2) { + fp_montgomery_reduce_mulx(a, m, mp) ; + return ; + } + #endif + + /* bail if too large */ + if (m->used > (FP_SIZE/2)) { + (void)mu; /* shut up compiler */ + return; + } + +#ifdef TFM_SMALL_MONT_SET + if (m->used <= 16) { + fp_montgomery_reduce_small(a, m, mp); + return; + } +#endif + + /* now zero the buff */ XMEMSET(c, 0, sizeof c); pa = m->used; @@ -1609,11 +1768,7 @@ void fp_montgomery_reduce(fp_int *a, fp_int *m, fp_digit mp) y = 0; #if (defined(TFM_SSE2) || defined(TFM_X86_64)) for (; y < (pa & ~7); y += 8) { - #ifdef HAVE_INTEL_MULX - innermul8_mulx(_c, &cy, tmpm, mu) ; - #else INNERMUL8 ; - #endif _c += 8; tmpm += 8; } From e1beca3e6018039f423ee3c78539e30ac25238a6 Mon Sep 17 00:00:00 2001 From: toddouska Date: Thu, 2 Apr 2015 08:14:48 -0700 Subject: [PATCH 009/350] fix with ecc w/o dh functions --- wolfssl/ssl.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index afee66e47..62ef01a09 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -882,7 +882,6 @@ WOLFSSL_API int wolfSSL_SetTmpDH(WOLFSSL*, const unsigned char* p, int pSz, const unsigned char* g, int gSz); WOLFSSL_API int wolfSSL_SetTmpDH_buffer(WOLFSSL*, const unsigned char* b, long sz, int format); -WOLFSSL_API int wolfSSL_SetTmpEC_DHE_Sz(WOLFSSL*, unsigned short); #ifndef NO_FILESYSTEM WOLFSSL_API int wolfSSL_SetTmpDH_file(WOLFSSL*, const char* f, int format); #endif @@ -900,6 +899,9 @@ WOLFSSL_API int wolfSSL_CTX_SetTmpEC_DHE_Sz(WOLFSSL_CTX*, unsigned short); #endif #endif /* NO_DH */ +WOLFSSL_API int wolfSSL_SetTmpEC_DHE_Sz(WOLFSSL*, unsigned short); +WOLFSSL_API int wolfSSL_CTX_SetTmpEC_DHE_Sz(WOLFSSL_CTX*, unsigned short); + /* keyblock size in bytes or -1 */ /* need to call wolfSSL_KeepArrays before handshake to save keys */ WOLFSSL_API int wolfSSL_get_keyblock_size(WOLFSSL*); From a54c916c8f6150cad2c177451550ecba9688a325 Mon Sep 17 00:00:00 2001 From: toddouska Date: Thu, 2 Apr 2015 09:40:22 -0700 Subject: [PATCH 010/350] fix chacha on bigendian, touchups --- wolfcrypt/src/chacha.c | 29 +++++++++++++++-------------- wolfssl/wolfcrypt/settings.h | 6 +++--- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/wolfcrypt/src/chacha.c b/wolfcrypt/src/chacha.c index 25e42a1d4..ab148597d 100644 --- a/wolfcrypt/src/chacha.c +++ b/wolfcrypt/src/chacha.c @@ -78,10 +78,6 @@ int wc_Chacha_SetIV(ChaCha* ctx, const byte* inIv, word32 counter) { word32 temp[3]; /* used for alignment of memory */ - XMEMSET(temp, 0, 12); - - if (ctx == NULL) - return BAD_FUNC_ARG; #ifdef CHACHA_AEAD_TEST word32 i; @@ -92,12 +88,15 @@ int wc_Chacha_SetIV(ChaCha* ctx, const byte* inIv, word32 counter) printf("\n\n"); #endif + if (ctx == NULL) + return BAD_FUNC_ARG; + XMEMCPY(temp, inIv, 12); - ctx->X[12] = counter; /* block counter */ - ctx->X[13] = temp[0]; /* fixed variable from nonce */ - ctx->X[14] = temp[1]; /* counter from nonce */ - ctx->X[15] = temp[2]; /* counter from nonce */ + ctx->X[12] = LITTLE32(counter); /* block counter */ + ctx->X[13] = LITTLE32(temp[0]); /* fixed variable from nonce */ + ctx->X[14] = LITTLE32(temp[1]); /* counter from nonce */ + ctx->X[15] = LITTLE32(temp[2]); /* counter from nonce */ return 0; } @@ -115,14 +114,20 @@ int wc_Chacha_SetKey(ChaCha* ctx, const byte* key, word32 keySz) const word32* constants; const byte* k; +#ifdef XSTREAM_ALIGN + word32 alignKey[8]; +#endif + if (ctx == NULL) return BAD_FUNC_ARG; + if (keySz != 16 && keySz != 32) + return BAD_FUNC_ARG; + #ifdef XSTREAM_ALIGN - word32 alignKey[keySz / 4]; if ((wolfssl_word)key % 4) { WOLFSSL_MSG("wc_ChachaSetKey unaligned key"); - XMEMCPY(alignKey, key, sizeof(alignKey)); + XMEMCPY(alignKey, key, keySz); k = (byte*)alignKey; } else { @@ -152,10 +157,6 @@ int wc_Chacha_SetKey(ChaCha* ctx, const byte* key, word32 keySz) constants = sigma; } else { - /* key size of 128 */ - if (keySz != 16) - return BAD_FUNC_ARG; - constants = tau; } ctx->X[ 8] = U8TO32_LITTLE(k + 0); diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index 23924ca2c..4a773844a 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -703,11 +703,11 @@ /* stream ciphers except arc4 need 32bit alignment, intel ok without */ -#ifndef XSTREAM_ALIGNMENT +#ifndef XSTREAM_ALIGN #if defined(__x86_64__) || defined(__ia64__) || defined(__i386__) - #define NO_XSTREAM_ALIGNMENT + #define NO_XSTREAM_ALIGN #else - #define XSTREAM_ALIGNMENT + #define XSTREAM_ALIGN #endif #endif From ee4b063b42908771e4ddc95c173f38da467e6950 Mon Sep 17 00:00:00 2001 From: toddouska Date: Thu, 2 Apr 2015 10:01:09 -0700 Subject: [PATCH 011/350] remove double define --- wolfssl/ssl.h | 1 - 1 file changed, 1 deletion(-) diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 62ef01a09..a5e0a64d8 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -891,7 +891,6 @@ WOLFSSL_API int wolfSSL_CTX_SetTmpDH(WOLFSSL_CTX*, const unsigned char* p, int pSz, const unsigned char* g, int gSz); WOLFSSL_API int wolfSSL_CTX_SetTmpDH_buffer(WOLFSSL_CTX*, const unsigned char* b, long sz, int format); -WOLFSSL_API int wolfSSL_CTX_SetTmpEC_DHE_Sz(WOLFSSL_CTX*, unsigned short); #ifndef NO_FILESYSTEM WOLFSSL_API int wolfSSL_CTX_SetTmpDH_file(WOLFSSL_CTX*, const char* f, From d2c816f32202e6a3e494dc9905ae525b330595b5 Mon Sep 17 00:00:00 2001 From: toddouska Date: Thu, 2 Apr 2015 10:52:58 -0700 Subject: [PATCH 012/350] fix github issue #63, intelasm checkin broke MMCAU sha256 --- wolfcrypt/src/sha256.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c index fd853633c..9993dcc88 100755 --- a/wolfcrypt/src/sha256.c +++ b/wolfcrypt/src/sha256.c @@ -446,9 +446,9 @@ int wc_Sha256Update(Sha256* sha256, const byte* data, word32 len) if (sha256->buffLen == SHA256_BLOCK_SIZE) { int ret; - #if defined(LITTLE_ENDIAN_ORDER) + #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) - if(!IS_INTEL_AVX1 && !IS_INTEL_AVX2) + if(!IS_INTEL_AVX1 && !IS_INTEL_AVX2) #endif ByteReverseWords(sha256->buffer, sha256->buffer, SHA256_BLOCK_SIZE); @@ -481,7 +481,7 @@ int wc_Sha256Final(Sha256* sha256, byte* hash) XMEMSET(&local[sha256->buffLen], 0, SHA256_BLOCK_SIZE - sha256->buffLen); sha256->buffLen += SHA256_BLOCK_SIZE - sha256->buffLen; - #if defined(LITTLE_ENDIAN_ORDER) + #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) if(!IS_INTEL_AVX1 && !IS_INTEL_AVX2) #endif @@ -502,7 +502,7 @@ int wc_Sha256Final(Sha256* sha256, byte* hash) sha256->loLen = sha256->loLen << 3; /* store lengths */ - #if defined(LITTLE_ENDIAN_ORDER) + #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) if(!IS_INTEL_AVX1 && !IS_INTEL_AVX2) #endif @@ -512,7 +512,7 @@ int wc_Sha256Final(Sha256* sha256, byte* hash) XMEMCPY(&local[SHA256_PAD_SIZE], &sha256->hiLen, sizeof(word32)); XMEMCPY(&local[SHA256_PAD_SIZE + sizeof(word32)], &sha256->loLen, sizeof(word32)); - + #if defined(FREESCALE_MMCAU) || defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) /* Kinetis requires only these bytes reversed */ #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) From 9437a3a303683c63b94864c867453eff17db27ae Mon Sep 17 00:00:00 2001 From: toddouska Date: Thu, 2 Apr 2015 11:26:55 -0700 Subject: [PATCH 013/350] fix tirtos distcheck --- tirtos/include.am | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tirtos/include.am b/tirtos/include.am index 46bdd4323..03f87e4bf 100644 --- a/tirtos/include.am +++ b/tirtos/include.am @@ -9,14 +9,14 @@ EXTRA_DIST += \ tirtos/packages/ti/net/wolfssl/package.bld \ tirtos/packages/ti/net/wolfssl/package.xdc \ tirtos/packages/ti/net/wolfssl/package.xs \ - tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/test/package.bld \ - tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/test/package.xdc \ - tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/test/test.cfg \ - tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/test/TM4C1294NC.icf \ - tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/test/main.c \ - tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/benchmark/package.bld \ - tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/benchmark/package.xdc \ - tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/benchmark/benchmark.cfg \ - tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/benchmark/TM4C1294NC.icf \ - tirtos/packages/ti/net/wolfssl/tests/wolfcrypt/benchmark/main.c + tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/test/package.bld \ + tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/test/package.xdc \ + tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/test/test.cfg \ + tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/test/TM4C1294NC.icf \ + tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/test/main.c \ + tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/benchmark/package.bld \ + tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/benchmark/package.xdc \ + tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/benchmark/benchmark.cfg \ + tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/benchmark/TM4C1294NC.icf \ + tirtos/packages/ti/net/wolfssl/tests/EK_TM4C1294XL/wolfcrypt/benchmark/main.c From 7552764fbb3d324bfac0481bc8c530f239277016 Mon Sep 17 00:00:00 2001 From: toddouska Date: Thu, 2 Apr 2015 11:34:17 -0700 Subject: [PATCH 014/350] turn off chacha on big endian --- configure.ac | 8 +++++++- support/wolfssl.pc | 2 +- wolfcrypt/src/chacha.c | 1 + wolfssl/version.h | 4 ++-- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index 36d1794df..566492b74 100644 --- a/configure.ac +++ b/configure.ac @@ -6,7 +6,7 @@ # # -AC_INIT([wolfssl],[3.4.6],[https://github.com/wolfssl/wolfssl/issues],[wolfssl],[http://www.wolfssl.com]) +AC_INIT([wolfssl],[3.4.7],[https://github.com/wolfssl/wolfssl/issues],[wolfssl],[http://www.wolfssl.com]) AC_CONFIG_AUX_DIR([build-aux]) @@ -1201,6 +1201,12 @@ AC_ARG_ENABLE([chacha], [ ENABLED_CHACHA=yes ] ) +# not ready for big endian yet +if test "x$ac_cv_c_bigendian" = "xyes" +then + ENABLED_CHACHA=no +fi + # lean psk does't need chacha if test "$ENABLED_LEANPSK" = "yes" then diff --git a/support/wolfssl.pc b/support/wolfssl.pc index 7b18d95e5..1265e7ce0 100644 --- a/support/wolfssl.pc +++ b/support/wolfssl.pc @@ -5,6 +5,6 @@ includedir=${prefix}/include Name: wolfssl Description: wolfssl C library. -Version: 3.4.6 +Version: 3.4.7 Libs: -L${libdir} -lwolfssl Cflags: -I${includedir} diff --git a/wolfcrypt/src/chacha.c b/wolfcrypt/src/chacha.c index ab148597d..fb8ace64c 100644 --- a/wolfcrypt/src/chacha.c +++ b/wolfcrypt/src/chacha.c @@ -48,6 +48,7 @@ #ifdef BIG_ENDIAN_ORDER #define LITTLE32(x) ByteReverseWord32(x) + #error "CHACHA Not ready for Big Endian yet" #else #define LITTLE32(x) (x) #endif diff --git a/wolfssl/version.h b/wolfssl/version.h index ed8aadbf7..54e92ffc0 100644 --- a/wolfssl/version.h +++ b/wolfssl/version.h @@ -26,8 +26,8 @@ extern "C" { #endif -#define LIBWOLFSSL_VERSION_STRING "3.4.6" -#define LIBWOLFSSL_VERSION_HEX 0x03004006 +#define LIBWOLFSSL_VERSION_STRING "3.4.7" +#define LIBWOLFSSL_VERSION_HEX 0x03004007 #ifdef __cplusplus } From b1316796f9b0759b6899d0be19f9506c0d3e620b Mon Sep 17 00:00:00 2001 From: toddouska Date: Thu, 2 Apr 2015 11:54:16 -0700 Subject: [PATCH 015/350] allow CTX set tmp dh w/o asn and certs too --- src/ssl.c | 64 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index ff137967a..5902555c5 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -475,6 +475,39 @@ int wolfSSL_SetTmpDH(WOLFSSL* ssl, const unsigned char* p, int pSz, WOLFSSL_LEAVE("wolfSSL_SetTmpDH", 0); return SSL_SUCCESS; } + +/* server ctx Diffie-Hellman parameters, SSL_SUCCESS on ok */ +int wolfSSL_CTX_SetTmpDH(WOLFSSL_CTX* ctx, const unsigned char* p, int pSz, + const unsigned char* g, int gSz) +{ + WOLFSSL_ENTER("wolfSSL_CTX_SetTmpDH"); + if (ctx == NULL || p == NULL || g == NULL) return BAD_FUNC_ARG; + + XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_DH); + XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_DH); + + ctx->serverDH_P.buffer = (byte*)XMALLOC(pSz, ctx->heap,DYNAMIC_TYPE_DH); + if (ctx->serverDH_P.buffer == NULL) + return MEMORY_E; + + ctx->serverDH_G.buffer = (byte*)XMALLOC(gSz, ctx->heap,DYNAMIC_TYPE_DH); + if (ctx->serverDH_G.buffer == NULL) { + XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_DH); + return MEMORY_E; + } + + ctx->serverDH_P.length = pSz; + ctx->serverDH_G.length = gSz; + + XMEMCPY(ctx->serverDH_P.buffer, p, pSz); + XMEMCPY(ctx->serverDH_G.buffer, g, gSz); + + ctx->haveDH = 1; + + WOLFSSL_LEAVE("wolfSSL_CTX_SetTmpDH", 0); + return SSL_SUCCESS; +} + #endif /* !NO_DH */ @@ -3822,37 +3855,6 @@ int wolfSSL_CTX_SetTmpDH_file(WOLFSSL_CTX* ctx, const char* fname, int format) } - /* server ctx Diffie-Hellman parameters, SSL_SUCCESS on ok */ - int wolfSSL_CTX_SetTmpDH(WOLFSSL_CTX* ctx, const unsigned char* p, int pSz, - const unsigned char* g, int gSz) - { - WOLFSSL_ENTER("wolfSSL_CTX_SetTmpDH"); - if (ctx == NULL || p == NULL || g == NULL) return BAD_FUNC_ARG; - - XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_DH); - XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_DH); - - ctx->serverDH_P.buffer = (byte*)XMALLOC(pSz, ctx->heap,DYNAMIC_TYPE_DH); - if (ctx->serverDH_P.buffer == NULL) - return MEMORY_E; - - ctx->serverDH_G.buffer = (byte*)XMALLOC(gSz, ctx->heap,DYNAMIC_TYPE_DH); - if (ctx->serverDH_G.buffer == NULL) { - XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_DH); - return MEMORY_E; - } - - ctx->serverDH_P.length = pSz; - ctx->serverDH_G.length = gSz; - - XMEMCPY(ctx->serverDH_P.buffer, p, pSz); - XMEMCPY(ctx->serverDH_G.buffer, g, gSz); - - ctx->haveDH = 1; - - WOLFSSL_LEAVE("wolfSSL_CTX_SetTmpDH", 0); - return SSL_SUCCESS; - } #endif /* NO_DH */ From 523775fcd61c632f4528fea344159d5af96c84e0 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Fri, 3 Apr 2015 09:54:15 -0700 Subject: [PATCH 016/350] updated the iOS readme --- IDE/iOS/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/IDE/iOS/README.md b/IDE/iOS/README.md index 0c20d3fa7..e9e781b49 100644 --- a/IDE/iOS/README.md +++ b/IDE/iOS/README.md @@ -66,7 +66,6 @@ for "Preprocessor Macros" and add the following under both `Release` and * `HAVE_AESGCM` * `WOLFSSL_SHA512` * `WOLFSSL_SHA384` -* `NO_PWDBASED` -- for now, can drop later # Using the FIPS library @@ -80,3 +79,8 @@ libraries like this, so static builds are required. This creates a problem. Every time the application is changed, the FIPS checksum will change, because the FIPS library's position in the executable may change. +You need to add something to your application that will output the verifyCore +value to be used. The verifyCore in fips_test.c will need to be updated with this +value, the library rebuilt, and relinked into your application. The application +should not be changed during this process or the verifyCore check will fail again. + From 10f853ae4d4e5f94b7bb1388ac32a7c7370c476a Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Fri, 3 Apr 2015 12:19:40 -0600 Subject: [PATCH 017/350] adjustment to chacha for big endian --- configure.ac | 6 ------ wolfcrypt/src/chacha.c | 9 ++++----- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/configure.ac b/configure.ac index 566492b74..45a687368 100644 --- a/configure.ac +++ b/configure.ac @@ -1201,12 +1201,6 @@ AC_ARG_ENABLE([chacha], [ ENABLED_CHACHA=yes ] ) -# not ready for big endian yet -if test "x$ac_cv_c_bigendian" = "xyes" -then - ENABLED_CHACHA=no -fi - # lean psk does't need chacha if test "$ENABLED_LEANPSK" = "yes" then diff --git a/wolfcrypt/src/chacha.c b/wolfcrypt/src/chacha.c index fb8ace64c..4e95bdbd0 100644 --- a/wolfcrypt/src/chacha.c +++ b/wolfcrypt/src/chacha.c @@ -48,7 +48,6 @@ #ifdef BIG_ENDIAN_ORDER #define LITTLE32(x) ByteReverseWord32(x) - #error "CHACHA Not ready for Big Endian yet" #else #define LITTLE32(x) (x) #endif @@ -164,10 +163,10 @@ int wc_Chacha_SetKey(ChaCha* ctx, const byte* key, word32 keySz) ctx->X[ 9] = U8TO32_LITTLE(k + 4); ctx->X[10] = U8TO32_LITTLE(k + 8); ctx->X[11] = U8TO32_LITTLE(k + 12); - ctx->X[ 0] = U8TO32_LITTLE(constants + 0); - ctx->X[ 1] = U8TO32_LITTLE(constants + 1); - ctx->X[ 2] = U8TO32_LITTLE(constants + 2); - ctx->X[ 3] = U8TO32_LITTLE(constants + 3); + ctx->X[ 0] = constants[0]; + ctx->X[ 1] = constants[1]; + ctx->X[ 2] = constants[2]; + ctx->X[ 3] = constants[3]; return 0; } From e39abffc5eda18707584a519908509d790d75a68 Mon Sep 17 00:00:00 2001 From: toddouska Date: Fri, 3 Apr 2015 12:11:29 -0700 Subject: [PATCH 018/350] add GNU ld bug error and solution --- README | 3 +++ README.md | 3 +++ 2 files changed, 6 insertions(+) diff --git a/README b/README index 380575265..d9e982f38 100644 --- a/README +++ b/README @@ -34,6 +34,9 @@ before calling wolfSSL_new(); Though it's not recommended. *** end Notes *** +- GNU Binutils 2.24 ld has problems with some debug builds, to fix an ld error + add -fdebug-types-section to C_EXTRA_FLAGS + wolfSSL (Formerly CyaSSL) Release 3.4.6 (03/30/2015) Release 3.4.6 of wolfSSL has bug fixes and new features including: diff --git a/README.md b/README.md index 65be1b0f2..59c77e37c 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,9 @@ wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0); before calling wolfSSL_new(); Though it's not recommended. ``` +- GNU Binutils 2.24 ld has problems with some debug builds, to fix an ld error + add -fdebug-types-section to C_EXTRA_FLAGS + #wolfSSL (Formerly CyaSSL) Release 3.4.6 (03/30/2015) ##Release 3.4.6 of wolfSSL has bug fixes and new features including: From 44a3011328dc0c5f742eb426338dba3c0e280472 Mon Sep 17 00:00:00 2001 From: toddouska Date: Fri, 3 Apr 2015 13:25:51 -0700 Subject: [PATCH 019/350] fix STREAM_ALIGN consistency --- wolfssl/wolfcrypt/settings.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index 4a773844a..23c19486d 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -723,7 +723,7 @@ #ifndef WOLFSSL_GENERAL_ALIGNMENT #ifdef WOLFSSL_AESNI #define WOLFSSL_GENERAL_ALIGNMENT 16 - #elif defined(XSTREAM_ALIGNMENT) + #elif defined(XSTREAM_ALIGN) #define WOLFSSL_GENERAL_ALIGNMENT 4 #elif defined(FREESCALE_MMCAU) #define WOLFSSL_GENERAL_ALIGNMENT WOLFSSL_MMCAU_ALIGNMENT From a7d004e47ddcca633dad272468dc579bc864ec9c Mon Sep 17 00:00:00 2001 From: toddouska Date: Sat, 4 Apr 2015 09:49:34 -0700 Subject: [PATCH 020/350] add sha512 sig_algo processing for server_key_exchange and cert_verify messages --- src/internal.c | 203 +++++++++++++++++++++++++++++++++++++++++++++ src/ssl.c | 19 +++++ wolfssl/internal.h | 6 ++ 3 files changed, 228 insertions(+) diff --git a/src/internal.c b/src/internal.c index 176c98b3f..4f644fd2f 100644 --- a/src/internal.c +++ b/src/internal.c @@ -588,6 +588,10 @@ static void InitSuitesHashSigAlgo(Suites* suites, int haveECDSAsig, int idx = 0; if (haveECDSAsig) { + #ifdef WOLFSSL_SHA512 + suites->hashSigAlgo[idx++] = sha512_mac; + suites->hashSigAlgo[idx++] = ecc_dsa_sa_algo; + #endif #ifdef WOLFSSL_SHA384 suites->hashSigAlgo[idx++] = sha384_mac; suites->hashSigAlgo[idx++] = ecc_dsa_sa_algo; @@ -603,6 +607,10 @@ static void InitSuitesHashSigAlgo(Suites* suites, int haveECDSAsig, } if (haveRSAsig) { + #ifdef WOLFSSL_SHA512 + suites->hashSigAlgo[idx++] = sha512_mac; + suites->hashSigAlgo[idx++] = rsa_sa_algo; + #endif #ifdef WOLFSSL_SHA384 suites->hashSigAlgo[idx++] = sha384_mac; suites->hashSigAlgo[idx++] = rsa_sa_algo; @@ -1622,6 +1630,12 @@ int InitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx) return ret; } #endif +#ifdef WOLFSSL_SHA512 + ret = wc_InitSha512(&ssl->hsHashes->hashSha512); + if (ret != 0) { + return ret; + } +#endif /* increment CTX reference count */ if (LockMutex(&ctx->countMutex) != 0) { @@ -2427,6 +2441,11 @@ static int HashOutput(WOLFSSL* ssl, const byte* output, int sz, int ivSz) ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, adj, sz); if (ret != 0) return ret; +#endif +#ifdef WOLFSSL_SHA512 + ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, adj, sz); + if (ret != 0) + return ret; #endif } @@ -2468,6 +2487,11 @@ static int HashInput(WOLFSSL* ssl, const byte* input, int sz) ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, adj, sz); if (ret != 0) return ret; +#endif +#ifdef WOLFSSL_SHA512 + ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, adj, sz); + if (ret != 0) + return ret; #endif } @@ -3018,6 +3042,7 @@ static void BuildSHA(WOLFSSL* ssl, Hashes* hashes, const byte* sender) #endif +/* Finished doesn't support SHA512, not SHA512 cipher suites yet */ static int BuildFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender) { int ret = 0; @@ -6881,6 +6906,9 @@ static int BuildCertHashes(WOLFSSL* ssl, Hashes* hashes) #ifdef WOLFSSL_SHA384 Sha384 sha384 = ssl->hsHashes->hashSha384; #endif + #ifdef WOLFSSL_SHA512 + Sha512 sha512 = ssl->hsHashes->hashSha512; + #endif if (ssl->options.tls) { #if ! defined( NO_OLD_TLS ) @@ -6900,6 +6928,11 @@ static int BuildCertHashes(WOLFSSL* ssl, Hashes* hashes) if (ret != 0) return ret; #endif + #ifdef WOLFSSL_SHA512 + ret = wc_Sha512Final(&ssl->hsHashes->hashSha512,hashes->sha512); + if (ret != 0) + return ret; + #endif } } #if ! defined( NO_OLD_TLS ) @@ -6919,6 +6952,9 @@ static int BuildCertHashes(WOLFSSL* ssl, Hashes* hashes) #ifdef WOLFSSL_SHA384 ssl->hsHashes->hashSha384 = sha384; #endif + #ifdef WOLFSSL_SHA512 + ssl->hsHashes->hashSha512 = sha512; + #endif } return 0; @@ -8881,6 +8917,12 @@ static void PickHashSigAlgo(WOLFSSL* ssl, break; } #endif + #ifdef WOLFSSL_SHA512 + else if (hashSigAlgo[i] == sha512_mac) { + ssl->suites->hashAlgo = sha512_mac; + break; + } + #endif } } } @@ -9907,6 +9949,15 @@ static void PickHashSigAlgo(WOLFSSL* ssl, byte hash384[SHA384_DIGEST_SIZE]; #endif #endif +#ifdef WOLFSSL_SHA512 +#ifdef WOLFSSL_SMALL_STACK + Sha512* sha512 = NULL; + byte* hash512 = NULL; +#else + Sha512 sha512[1]; + byte hash512[SHA512_DIGEST_SIZE]; +#endif +#endif #ifdef WOLFSSL_SMALL_STACK byte* hash = NULL; byte* messageVerify = NULL; @@ -10026,6 +10077,24 @@ static void PickHashSigAlgo(WOLFSSL* ssl, goto done; #endif +#ifdef WOLFSSL_SHA512 + #ifdef WOLFSSL_SMALL_STACK + sha512 = (Sha512*)XMALLOC(sizeof(Sha512), NULL, + DYNAMIC_TYPE_TMP_BUFFER); + hash512 = (byte*)XMALLOC(SHA512_DIGEST_SIZE, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (sha512 == NULL || hash512 == NULL) + ERROR_OUT(MEMORY_E, done); + #endif + if (!(ret = wc_InitSha512(sha512)) + && !(ret = wc_Sha512Update(sha512, ssl->arrays->clientRandom, RAN_LEN)) + && !(ret = wc_Sha512Update(sha512, ssl->arrays->serverRandom, RAN_LEN)) + && !(ret = wc_Sha512Update(sha512, messageVerify, verifySz))) + ret = wc_Sha512Final(sha512, hash512); + if (ret != 0) + goto done; +#endif + #ifndef NO_RSA /* rsa */ if (sigAlgo == rsa_sa_algo) @@ -10094,6 +10163,13 @@ static void PickHashSigAlgo(WOLFSSL* ssl, digestSz = SHA384_DIGEST_SIZE; #endif } + else if (hashAlgo == sha512_mac) { + #ifdef WOLFSSL_SHA512 + digest = hash512; + typeH = SHA512h; + digestSz = SHA512_DIGEST_SIZE; + #endif + } #ifdef WOLFSSL_SMALL_STACK encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ, NULL, @@ -10159,6 +10235,12 @@ static void PickHashSigAlgo(WOLFSSL* ssl, digestSz = SHA384_DIGEST_SIZE; #endif } + else if (hashAlgo == sha512_mac) { + #ifdef WOLFSSL_SHA512 + digest = hash512; + digestSz = SHA512_DIGEST_SIZE; + #endif + } } if (doUserEcc) { #ifdef HAVE_PK_CALLBACKS @@ -10198,6 +10280,10 @@ static void PickHashSigAlgo(WOLFSSL* ssl, #ifdef WOLFSSL_SHA384 XFREE(sha384, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(hash384, NULL, DYNAMIC_TYPE_TMP_BUFFER); + #endif + #ifdef WOLFSSL_SHA512 + XFREE(sha512, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(hash512, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif XFREE(hash, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(messageVerify, NULL, DYNAMIC_TYPE_TMP_BUFFER); @@ -10887,6 +10973,12 @@ static void PickHashSigAlgo(WOLFSSL* ssl, digestSz = SHA384_DIGEST_SIZE; #endif } + else if (ssl->suites->hashAlgo == sha512_mac) { + #ifdef WOLFSSL_SHA512 + digest = ssl->hsHashes->certHashes.sha512; + digestSz = SHA512_DIGEST_SIZE; + #endif + } } if (doUserEcc) { @@ -10955,6 +11047,14 @@ static void PickHashSigAlgo(WOLFSSL* ssl, didSet = 1; #endif } + else if (ssl->suites->hashAlgo == sha512_mac) { + #ifdef WOLFSSL_SHA512 + digest = ssl->hsHashes->certHashes.sha512; + typeH = SHA512h; + digestSz = SHA512_DIGEST_SIZE; + didSet = 1; + #endif + } if (didSet == 0) { /* defaults */ @@ -11685,6 +11785,15 @@ int DoSessionTicket(WOLFSSL* ssl, byte hash384[SHA384_DIGEST_SIZE]; #endif #endif + #ifdef WOLFSSL_SHA512 + #ifdef WOLFSSL_SMALL_STACK + Sha512* sha512 = NULL; + byte* hash512 = NULL; + #else + Sha512 sha512[1]; + byte hash512[SHA512_DIGEST_SIZE]; + #endif + #endif #ifdef WOLFSSL_SMALL_STACK hash = (byte*)XMALLOC(FINISHED_SZ, NULL, @@ -11765,6 +11874,28 @@ int DoSessionTicket(WOLFSSL* ssl, goto done_a2; #endif + #ifdef WOLFSSL_SHA512 + #ifdef WOLFSSL_SMALL_STACK + sha512 = (Sha512*)XMALLOC(sizeof(Sha512), NULL, + DYNAMIC_TYPE_TMP_BUFFER); + hash512 = (byte*)XMALLOC(SHA512_DIGEST_SIZE, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (sha512 == NULL || hash512 == NULL) + ERROR_OUT(MEMORY_E, done_a2); + #endif + + if (!(ret = wc_InitSha512(sha512)) + && !(ret = wc_Sha512Update(sha512, ssl->arrays->clientRandom, + RAN_LEN)) + && !(ret = wc_Sha512Update(sha512, ssl->arrays->serverRandom, + RAN_LEN)) + && !(ret = wc_Sha512Update(sha512, output + preSigIdx, preSigSz))) + ret = wc_Sha512Final(sha512, hash512); + + if (ret != 0) + goto done_a2; + #endif + #ifndef NO_RSA if (ssl->suites->sigAlgo == rsa_sa_algo) { byte* signBuffer = hash; @@ -11807,6 +11938,13 @@ int DoSessionTicket(WOLFSSL* ssl, digestSz = SHA384_DIGEST_SIZE; #endif } + else if (ssl->suites->hashAlgo == sha512_mac) { + #ifdef WOLFSSL_SHA512 + digest = hash512; + typeH = SHA512h; + digestSz = SHA512_DIGEST_SIZE; + #endif + } signSz = wc_EncodeSignature(encodedSig, digest, digestSz, typeH); @@ -11877,6 +12015,12 @@ int DoSessionTicket(WOLFSSL* ssl, digestSz = SHA384_DIGEST_SIZE; #endif } + else if (ssl->suites->hashAlgo == sha512_mac) { + #ifdef WOLFSSL_SHA512 + digest = hash512; + digestSz = SHA512_DIGEST_SIZE; + #endif + } } if (doUserEcc) { @@ -11923,6 +12067,10 @@ int DoSessionTicket(WOLFSSL* ssl, XFREE(sha384, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(hash384, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif + #ifdef WOLFSSL_SHA512 + XFREE(sha512, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(hash512, NULL, DYNAMIC_TYPE_TMP_BUFFER); + #endif #endif if (ret < 0) @@ -12126,6 +12274,15 @@ int DoSessionTicket(WOLFSSL* ssl, byte hash384[SHA384_DIGEST_SIZE]; #endif #endif + #ifdef WOLFSSL_SHA512 + #ifdef WOLFSSL_SMALL_STACK + Sha512* sha512 = NULL; + byte* hash512 = NULL; + #else + Sha512 sha512[1]; + byte hash512[SHA512_DIGEST_SIZE]; + #endif + #endif /* Add hash/signature algo ID */ if (IsAtLeastTLSv1_2(ssl)) { @@ -12220,6 +12377,28 @@ int DoSessionTicket(WOLFSSL* ssl, goto done_b; #endif + #ifdef WOLFSSL_SHA512 + #ifdef WOLFSSL_SMALL_STACK + sha512 = (Sha512*)XMALLOC(sizeof(Sha512), NULL, + DYNAMIC_TYPE_TMP_BUFFER); + hash512 = (byte*)XMALLOC(SHA512_DIGEST_SIZE, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (sha512 == NULL || hash512 == NULL) + ERROR_OUT(MEMORY_E, done_b); + #endif + + if (!(ret = wc_InitSha512(sha512)) + && !(ret = wc_Sha512Update(sha512, ssl->arrays->clientRandom, + RAN_LEN)) + && !(ret = wc_Sha512Update(sha512, ssl->arrays->serverRandom, + RAN_LEN)) + && !(ret = wc_Sha512Update(sha512, output + preSigIdx, preSigSz))) + ret = wc_Sha512Final(sha512, hash512); + + if (ret != 0) + goto done_b; + #endif + #ifndef NO_RSA if (ssl->suites->sigAlgo == rsa_sa_algo) { byte* signBuffer = hash; @@ -12262,6 +12441,13 @@ int DoSessionTicket(WOLFSSL* ssl, digestSz = SHA384_DIGEST_SIZE; #endif } + else if (ssl->suites->hashAlgo == sha512_mac) { + #ifdef WOLFSSL_SHA512 + digest = hash512; + typeH = SHA512h; + digestSz = SHA512_DIGEST_SIZE; + #endif + } signSz = wc_EncodeSignature(encodedSig, digest, digestSz, typeH); @@ -12304,6 +12490,10 @@ int DoSessionTicket(WOLFSSL* ssl, XFREE(sha384, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(hash384, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif + #ifdef WOLFSSL_SHA512 + XFREE(sha512, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(hash512, NULL, DYNAMIC_TYPE_TMP_BUFFER); + #endif #endif if (ret < 0) return ret; @@ -13045,6 +13235,13 @@ int DoSessionTicket(WOLFSSL* ssl, digestSz = SHA384_DIGEST_SIZE; #endif } + else if (hashAlgo == sha512_mac) { + #ifdef WOLFSSL_SHA512 + digest = ssl->hsHashes->certHashes.sha512; + typeH = SHA512h; + digestSz = SHA512_DIGEST_SIZE; + #endif + } sigSz = wc_EncodeSignature(encodedSig, digest, digestSz, typeH); @@ -13097,6 +13294,12 @@ int DoSessionTicket(WOLFSSL* ssl, digestSz = SHA384_DIGEST_SIZE; #endif } + else if (hashAlgo == sha512_mac) { + #ifdef WOLFSSL_SHA512 + digest = ssl->hsHashes->certHashes.sha512; + digestSz = SHA512_DIGEST_SIZE; + #endif + } } if (doUserEcc) { diff --git a/src/ssl.c b/src/ssl.c index 5902555c5..d907f443a 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -849,6 +849,11 @@ int wolfSSL_Rehandshake(WOLFSSL* ssl) if (ret !=0) return ret; #endif +#ifdef WOLFSSL_SHA512 + ret = wc_InitSha512(&ssl->hsHashes->hashSha512); + if (ret !=0) + return ret; +#endif ret = wolfSSL_negotiate(ssl); return ret; @@ -5167,6 +5172,13 @@ int wolfSSL_dtls_got_timeout(WOLFSSL* ssl) return SSL_FATAL_ERROR; } #endif + #ifdef WOLFSSL_SHA512 + if ( (ssl->error = wc_InitSha512( + &ssl->hsHashes->hashSha512)) != 0) { + WOLFSSL_ERROR(ssl->error); + return SSL_FATAL_ERROR; + } + #endif } if ( (ssl->error = SendClientHello(ssl)) != 0) { WOLFSSL_ERROR(ssl->error); @@ -5446,6 +5458,13 @@ int wolfSSL_dtls_got_timeout(WOLFSSL* ssl) return SSL_FATAL_ERROR; } #endif + #ifdef WOLFSSL_SHA512 + if ( (ssl->error = wc_InitSha512( + &ssl->hsHashes->hashSha512)) != 0) { + WOLFSSL_ERROR(ssl->error); + return SSL_FATAL_ERROR; + } + #endif } while (ssl->options.clientState < CLIENT_HELLO_COMPLETE) diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 55af1d1b9..3ead47d88 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -1714,6 +1714,9 @@ typedef struct Hashes { #ifdef WOLFSSL_SHA384 byte sha384[SHA384_DIGEST_SIZE]; #endif + #ifdef WOLFSSL_SHA512 + byte sha512[SHA512_DIGEST_SIZE]; + #endif } Hashes; @@ -2090,6 +2093,9 @@ typedef struct HS_Hashes { #ifdef WOLFSSL_SHA384 Sha384 hashSha384; /* sha384 hash of handshake msgs */ #endif +#ifdef WOLFSSL_SHA512 + Sha512 hashSha512; /* sha512 hash of handshake msgs */ +#endif } HS_Hashes; From d67a031132b87fc01f0808f161eda0e3101dbba7 Mon Sep 17 00:00:00 2001 From: toddouska Date: Sun, 5 Apr 2015 09:13:11 -0700 Subject: [PATCH 021/350] fix scr gcm mode --- src/keys.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/keys.c b/src/keys.c index d83619681..b06debb28 100644 --- a/src/keys.c +++ b/src/keys.c @@ -2407,11 +2407,33 @@ int SetKeysSide(WOLFSSL* ssl, enum encrypt_side side) /* Initialize the AES-GCM/CCM explicit IV to a zero. */ XMEMCPY(ssl->keys.aead_exp_IV, keys->aead_exp_IV, AEAD_EXP_IV_SZ); + + /* Initialize encrypt implicit IV by encrypt side */ + if (ssl->options.side == WOLFSSL_CLIENT_END) { + XMEMCPY(ssl->keys.aead_enc_imp_IV, + keys->client_write_IV, AEAD_IMP_IV_SZ); + } else { + XMEMCPY(ssl->keys.aead_enc_imp_IV, + keys->server_write_IV, AEAD_IMP_IV_SZ); + } } #endif } - if (wc_decrypt) + if (wc_decrypt) { ssl->keys.peer_sequence_number = keys->peer_sequence_number; + #ifdef HAVE_AEAD + if (ssl->specs.cipher_type == aead) { + /* Initialize decrypt implicit IV by decrypt side */ + if (ssl->options.side == WOLFSSL_SERVER_END) { + XMEMCPY(ssl->keys.aead_dec_imp_IV, + keys->client_write_IV, AEAD_IMP_IV_SZ); + } else { + XMEMCPY(ssl->keys.aead_dec_imp_IV, + keys->server_write_IV, AEAD_IMP_IV_SZ); + } + } + #endif + } ssl->secure_renegotiation->cache_status++; } #endif /* HAVE_SECURE_RENEGOTIATION */ From d8a6d9cffc52d77776cf8529f1af08939bdd8120 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Mon, 6 Apr 2015 10:34:07 +0900 Subject: [PATCH 022/350] runtime cpuflag for Intel MULX, cleaned in tfm.c --- wolfcrypt/src/asm.c | 78 ++++++++++++++++++++++++++++++++++++++++ wolfcrypt/src/tfm.c | 87 +++------------------------------------------ 2 files changed, 82 insertions(+), 83 deletions(-) diff --git a/wolfcrypt/src/asm.c b/wolfcrypt/src/asm.c index 9dbf9a15a..016225df1 100755 --- a/wolfcrypt/src/asm.c +++ b/wolfcrypt/src/asm.c @@ -33,6 +33,84 @@ /******************************************************************/ /* fp_montgomery_reduce.c asm or generic */ + + +/* Each platform needs to query info type 1 from cpuid to see if aesni is + * supported. Also, let's setup a macro for proper linkage w/o ABI conflicts + */ + +#if defined(HAVE_INTEL_MULX) +#ifndef _MSC_VER + #define cpuid(reg, leaf, sub)\ + __asm__ __volatile__ ("cpuid":\ + "=a" (reg[0]), "=b" (reg[1]), "=c" (reg[2]), "=d" (reg[3]) :\ + "a" (leaf), "c"(sub)); + + #define XASM_LINK(f) asm(f) +#else + + #include + #define cpuid(a,b) __cpuid((int*)a,b) + + #define XASM_LINK(f) + +#endif /* _MSC_VER */ + +#define EAX 0 +#define EBX 1 +#define ECX 2 +#define EDX 3 + +#define CPUID_AVX1 0x1 +#define CPUID_AVX2 0x2 +#define CPUID_RDRAND 0x4 +#define CPUID_RDSEED 0x8 + +#define IS_INTEL_AVX1 (cpuid_flags&CPUID_AVX1) +#define IS_INTEL_AVX2 (cpuid_flags&CPUID_AVX2) +#define IS_INTEL_RDRAND (cpuid_flags&CPUID_RDRAND) +#define IS_INTEL_RDSEED (cpuid_flags&CPUID_RDSEED) +#define SET_FLAGS + +static word32 cpuid_check = 0 ; +static word32 cpuid_flags = 0 ; + +static word32 cpuid_flag(word32 leaf, word32 sub, word32 num, word32 bit) { + int got_intel_cpu=0; + unsigned int reg[5]; + + reg[4] = '\0' ; + cpuid(reg, 0, 0); + if(memcmp((char *)&(reg[EBX]), "Genu", 4) == 0 && + memcmp((char *)&(reg[EDX]), "ineI", 4) == 0 && + memcmp((char *)&(reg[ECX]), "ntel", 4) == 0) { + got_intel_cpu = 1; + } + if (got_intel_cpu) { + cpuid(reg, leaf, sub); + return((reg[num]>>bit)&0x1) ; + } + return 0 ; +} + +INLINE static int set_cpuid_flags(void) { + if(cpuid_check == 0) { + if(cpuid_flag(7, 0, EBX, 5)){ cpuid_flags |= CPUID_AVX2 ; } + cpuid_check = 1 ; + return 0 ; + } + return 1 ; +} + +#define RETURN return +#define IF_HAVE_INTEL_MULX(func, ret) \ + if(cpuid_check==0)set_cpuid_flags() ; \ + if(IS_INTEL_AVX2){ func; ret ; } + +#else + #define IF_HAVE_INTEL_MULX(func, ret) +#endif + #if defined(TFM_X86) && !defined(TFM_SSE2) /* x86-32 code */ diff --git a/wolfcrypt/src/tfm.c b/wolfcrypt/src/tfm.c index 132898962..994fcc9ae 100755 --- a/wolfcrypt/src/tfm.c +++ b/wolfcrypt/src/tfm.c @@ -403,72 +403,6 @@ void fp_mul_2d(fp_int *a, int b, fp_int *c) /* generic PxQ multiplier */ #if defined(HAVE_INTEL_MULX) -/* Each platform needs to query info type 1 from cpuid to see if aesni is - * supported. Also, let's setup a macro for proper linkage w/o ABI conflicts - */ - -#ifndef _MSC_VER - #define cpuid(reg, leaf, sub)\ - __asm__ __volatile__ ("cpuid":\ - "=a" (reg[0]), "=b" (reg[1]), "=c" (reg[2]), "=d" (reg[3]) :\ - "a" (leaf), "c"(sub)); - - #define XASM_LINK(f) asm(f) -#else - - #include - #define cpuid(a,b) __cpuid((int*)a,b) - - #define XASM_LINK(f) - -#endif /* _MSC_VER */ - -#define EAX 0 -#define EBX 1 -#define ECX 2 -#define EDX 3 - -#define CPUID_AVX1 0x1 -#define CPUID_AVX2 0x2 -#define CPUID_RDRAND 0x4 -#define CPUID_RDSEED 0x8 - -#define IS_INTEL_AVX1 (cpuid_flags&CPUID_AVX1) -#define IS_INTEL_AVX2 (cpuid_flags&CPUID_AVX2) -#define IS_INTEL_RDRAND (cpuid_flags&CPUID_RDRAND) -#define IS_INTEL_RDSEED (cpuid_flags&CPUID_RDSEED) -#define SET_FLAGS if(cpuid_check==0)set_cpuid_flags() - -static word32 cpuid_check = 0 ; -static word32 cpuid_flags = 0 ; - -static word32 cpuid_flag(word32 leaf, word32 sub, word32 num, word32 bit) { - int got_intel_cpu=0; - unsigned int reg[5]; - - reg[4] = '\0' ; - cpuid(reg, 0, 0); - if(memcmp((char *)&(reg[EBX]), "Genu", 4) == 0 && - memcmp((char *)&(reg[EDX]), "ineI", 4) == 0 && - memcmp((char *)&(reg[ECX]), "ntel", 4) == 0) { - got_intel_cpu = 1; - } - if (got_intel_cpu) { - cpuid(reg, leaf, sub); - return((reg[num]>>bit)&0x1) ; - } - return 0 ; -} - -INLINE static int set_cpuid_flags(void) { - if(cpuid_check == 0) { - if(cpuid_flag(7, 0, EBX, 5)){ cpuid_flags |= CPUID_AVX2 ; } - cpuid_check = 1 ; - return 0 ; - } - return 1 ; -} - INLINE static void fp_mul_comba_mulx(fp_int *A, fp_int *B, fp_int *C) { @@ -496,7 +430,6 @@ INLINE static void fp_mul_comba_mulx(fp_int *A, fp_int *B, fp_int *C) fp_clamp(dst); fp_copy(dst, C); } - #endif void fp_mul_comba(fp_int *A, fp_int *B, fp_int *C) @@ -505,13 +438,7 @@ void fp_mul_comba(fp_int *A, fp_int *B, fp_int *C) fp_digit c0, c1, c2, *tmpx, *tmpy; fp_int tmp, *dst; - #if defined(HAVE_INTEL_MULX) - SET_FLAGS ; - if(IS_INTEL_AVX2) { - fp_mul_comba_mulx(A, B, C) ; - return ; - } - #endif + IF_HAVE_INTEL_MULX(fp_mul_comba_mulx(A, B, C), return) ; COMBA_START; COMBA_CLEAR; @@ -1725,15 +1652,9 @@ void fp_montgomery_reduce(fp_int *a, fp_int *m, fp_digit mp) { fp_digit c[FP_SIZE], *_c, *tmpm, mu = 0; int oldused, x, y, pa; - - #ifdef HAVE_INTEL_MULX - SET_FLAGS ; - if(IS_INTEL_AVX2) { - fp_montgomery_reduce_mulx(a, m, mp) ; - return ; - } - #endif - + + IF_HAVE_INTEL_MULX(fp_montgomery_reduce_mulx(a, m, mp), return) ; + /* bail if too large */ if (m->used > (FP_SIZE/2)) { (void)mu; /* shut up compiler */ From 0519085c69c12b706588a88b34a1c78cdd49fdab Mon Sep 17 00:00:00 2001 From: toddouska Date: Mon, 6 Apr 2015 11:40:51 -0700 Subject: [PATCH 023/350] add SOCKET_PEER_CLOSED_E vs general SOCKET_E for case where peer closes underlying transport w/o close notify --- src/internal.c | 8 ++++++++ wolfssl/error-ssl.h | 1 + 2 files changed, 9 insertions(+) diff --git a/src/internal.c b/src/internal.c index 4f644fd2f..39e3beb90 100644 --- a/src/internal.c +++ b/src/internal.c @@ -7589,6 +7589,8 @@ startScr: if (ssl->error == SOCKET_ERROR_E) { if (ssl->options.connReset || ssl->options.isClosed) { WOLFSSL_MSG("Peer reset or closed, connection done"); + ssl->error = SOCKET_PEER_CLOSED_E; + WOLFSSL_ERROR(ssl->error); return 0; /* peer reset or closed */ } } @@ -8002,6 +8004,12 @@ const char* wolfSSL_ERR_reason_error_string(unsigned long e) case DUPLICATE_MSG_E: return "Duplicate HandShake message Error"; + case SNI_UNSUPPORTED: + return "Protocol version does not support SNI Error"; + + case SOCKET_PEER_CLOSED_E: + return "Peer closed underlying transport Error"; + default : return "unknown error number"; } diff --git a/wolfssl/error-ssl.h b/wolfssl/error-ssl.h index 732240382..0df2edb6e 100644 --- a/wolfssl/error-ssl.h +++ b/wolfssl/error-ssl.h @@ -127,6 +127,7 @@ enum wolfSSL_ErrorCodes { SANITY_MSG_E = -394, /* Sanity check on msg order error */ DUPLICATE_MSG_E = -395, /* Duplicate message error */ SNI_UNSUPPORTED = -396, /* SSL 3.0 does not support SNI */ + SOCKET_PEER_CLOSED_E = -397, /* Underlying transport closed */ /* add strings to SetErrorString !!!!! */ From aef879dc206ac5c0a171c6dfe43614b3ad963859 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Mon, 6 Apr 2015 15:06:56 -0700 Subject: [PATCH 024/350] Updated iOS FIPS project, bump version --- IDE/iOS/README.md | 3 +++ IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj | 2 ++ README | 15 ++++++++++++++- README.md | 13 +++++++++++++ configure.ac | 2 +- support/wolfssl.pc | 2 +- wolfssl/version.h | 4 ++-- 7 files changed, 36 insertions(+), 5 deletions(-) diff --git a/IDE/iOS/README.md b/IDE/iOS/README.md index e9e781b49..a81152fb0 100644 --- a/IDE/iOS/README.md +++ b/IDE/iOS/README.md @@ -67,6 +67,9 @@ for "Preprocessor Macros" and add the following under both `Release` and * `WOLFSSL_SHA512` * `WOLFSSL_SHA384` +The approved FIPS source files are from the CyaSSL project v3.4.8.fips. The FIPS +and FIPS-TEST files are from our FIPS project v3.4.8.fips. For the wolfCAVP test +the wolfSSL version used is v3.4.8. # Using the FIPS library diff --git a/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj b/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj index 001bdf155..be5f32085 100644 --- a/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj +++ b/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj @@ -917,6 +917,7 @@ $SRCROOT, $PROJECT_DIR/../.., ); + IPHONEOS_DEPLOYMENT_TARGET = 8.1; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = wolfssl; @@ -947,6 +948,7 @@ $SRCROOT, $PROJECT_DIR/../.., ); + IPHONEOS_DEPLOYMENT_TARGET = 8.1; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = wolfssl; diff --git a/README b/README index d9e982f38..f5c77acc5 100644 --- a/README +++ b/README @@ -37,7 +37,20 @@ before calling wolfSSL_new(); Though it's not recommended. - GNU Binutils 2.24 ld has problems with some debug builds, to fix an ld error add -fdebug-types-section to C_EXTRA_FLAGS -wolfSSL (Formerly CyaSSL) Release 3.4.6 (03/30/2015) +wolfSSL (Formerly CyaSSL) Release 3.4.8 (04/06/2015) + +Release 3.4.8 of wolfSSL has bug fixes and new features including: + +- FIPS version submitted for iOS. +- Max Strength build that only allows TLSv1.2, AEAD ciphers, and PFS. +- Improvements to usage of time code. +- Improvements to VS solution files. + +See INSTALL file for build instructions. +More info can be found on-line at //http://wolfssl.com/yaSSL/Docs.html + + + *****************wolfSSL (Formerly CyaSSL) Release 3.4.6 (03/30/2015) Release 3.4.6 of wolfSSL has bug fixes and new features including: diff --git a/README.md b/README.md index 59c77e37c..a490ac2ff 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,19 @@ before calling wolfSSL_new(); Though it's not recommended. - GNU Binutils 2.24 ld has problems with some debug builds, to fix an ld error add -fdebug-types-section to C_EXTRA_FLAGS +#wolfSSL (Formerly CyaSSL) Release 3.4.8 (04/06/2015) + +##Release 3.4.8 of wolfSSL has bug fixes and new features including: + +- FIPS version submitted for iOS. +- Max Strength build that only allows TLSv1.2, AEAD ciphers, and PFS. +- Improvements to usage of time code. +- Improvements to VS solution files. + +See INSTALL file for build instructions. +More info can be found on-line at //http://wolfssl.com/yaSSL/Docs.html + + #wolfSSL (Formerly CyaSSL) Release 3.4.6 (03/30/2015) ##Release 3.4.6 of wolfSSL has bug fixes and new features including: diff --git a/configure.ac b/configure.ac index 45a687368..cdad2c153 100644 --- a/configure.ac +++ b/configure.ac @@ -6,7 +6,7 @@ # # -AC_INIT([wolfssl],[3.4.7],[https://github.com/wolfssl/wolfssl/issues],[wolfssl],[http://www.wolfssl.com]) +AC_INIT([wolfssl],[3.4.8],[https://github.com/wolfssl/wolfssl/issues],[wolfssl],[http://www.wolfssl.com]) AC_CONFIG_AUX_DIR([build-aux]) diff --git a/support/wolfssl.pc b/support/wolfssl.pc index 1265e7ce0..c07ae3ea2 100644 --- a/support/wolfssl.pc +++ b/support/wolfssl.pc @@ -5,6 +5,6 @@ includedir=${prefix}/include Name: wolfssl Description: wolfssl C library. -Version: 3.4.7 +Version: 3.4.8 Libs: -L${libdir} -lwolfssl Cflags: -I${includedir} diff --git a/wolfssl/version.h b/wolfssl/version.h index 54e92ffc0..c76e07613 100644 --- a/wolfssl/version.h +++ b/wolfssl/version.h @@ -26,8 +26,8 @@ extern "C" { #endif -#define LIBWOLFSSL_VERSION_STRING "3.4.7" -#define LIBWOLFSSL_VERSION_HEX 0x03004007 +#define LIBWOLFSSL_VERSION_STRING "3.4.8" +#define LIBWOLFSSL_VERSION_HEX 0x03004008 #ifdef __cplusplus } From e17d452f9b70fc6718c03c0362dffc1cd96725f4 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Mon, 6 Apr 2015 16:12:50 -0700 Subject: [PATCH 025/350] Updated Xcode projects for missing headers --- IDE/iOS/README.md | 11 ++++------- IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj | 2 +- IDE/iOS/wolfssl.xcodeproj/project.pbxproj | 2 +- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/IDE/iOS/README.md b/IDE/iOS/README.md index a81152fb0..519520e56 100644 --- a/IDE/iOS/README.md +++ b/IDE/iOS/README.md @@ -28,13 +28,10 @@ order. # Building libwolfssl.a -## Debug build - -## Release build - -A release build requires an Apple Developer account, as far as I can tell. I -have not tried this yet. +There are several options of builds. You can make a simulator build, or a +device build. Both are debug builds. +You can make an archive for a device, as well. That is a release build. # Installing libwolfssl.a @@ -68,7 +65,7 @@ for "Preprocessor Macros" and add the following under both `Release` and * `WOLFSSL_SHA384` The approved FIPS source files are from the CyaSSL project v3.4.8.fips. The FIPS -and FIPS-TEST files are from our FIPS project v3.4.8.fips. For the wolfCAVP test +and FIPS-TEST files are from our FIPS project v3.4.8. For the wolfCAVP test the wolfSSL version used is v3.4.8. # Using the FIPS library diff --git a/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj b/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj index be5f32085..1f14345f9 100644 --- a/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj +++ b/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj @@ -295,7 +295,7 @@ isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = include/wolfssl; - dstSubfolderSpec = 16; + dstSubfolderSpec = 7; files = ( 521646C41A8A7FE10062516A /* callbacks.h in CopyFiles */, 521646C51A8A7FE10062516A /* certs_test.h in CopyFiles */, diff --git a/IDE/iOS/wolfssl.xcodeproj/project.pbxproj b/IDE/iOS/wolfssl.xcodeproj/project.pbxproj index 14fd4e4d6..0de405b73 100644 --- a/IDE/iOS/wolfssl.xcodeproj/project.pbxproj +++ b/IDE/iOS/wolfssl.xcodeproj/project.pbxproj @@ -283,7 +283,7 @@ isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = include/wolfssl; - dstSubfolderSpec = 16; + dstSubfolderSpec = 7; files = ( 521646C41A8A7FE10062516A /* callbacks.h in CopyFiles */, 521646C51A8A7FE10062516A /* certs_test.h in CopyFiles */, From 015b68e6fb797b0ee728bb6dc5cba67fecf80e27 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Tue, 7 Apr 2015 10:21:26 +0900 Subject: [PATCH 026/350] cpuflag BMI2 for Intel MULX --- IDE/iOS/README.md | 12 +- .../wolfssl-FIPS.xcodeproj/project.pbxproj | 4 +- IDE/iOS/wolfssl.xcodeproj/project.pbxproj | 2 +- README | 15 +- README.md | 13 ++ configure.ac | 2 +- examples/client/client.vcxproj | 159 ++++++++++++++++- examples/echoclient/echoclient.vcxproj | 159 ++++++++++++++++- examples/echoserver/echoserver.vcxproj | 159 ++++++++++++++++- examples/server/server.vcxproj | 159 ++++++++++++++++- src/internal.c | 8 + sslSniffer/sslSniffer.vcxproj | 10 +- support/wolfssl.pc | 2 +- testsuite/testsuite.vcxproj | 159 ++++++++++++++++- wolfcrypt/src/asm.c | 6 +- wolfssl.vcxproj | 166 +++++++++++++++++- wolfssl/error-ssl.h | 1 + wolfssl/version.h | 4 +- wolfssl/wolfcrypt/visibility.h | 4 +- wolfssl64.sln | 58 +++++- 20 files changed, 1063 insertions(+), 39 deletions(-) diff --git a/IDE/iOS/README.md b/IDE/iOS/README.md index e9e781b49..519520e56 100644 --- a/IDE/iOS/README.md +++ b/IDE/iOS/README.md @@ -28,13 +28,10 @@ order. # Building libwolfssl.a -## Debug build - -## Release build - -A release build requires an Apple Developer account, as far as I can tell. I -have not tried this yet. +There are several options of builds. You can make a simulator build, or a +device build. Both are debug builds. +You can make an archive for a device, as well. That is a release build. # Installing libwolfssl.a @@ -67,6 +64,9 @@ for "Preprocessor Macros" and add the following under both `Release` and * `WOLFSSL_SHA512` * `WOLFSSL_SHA384` +The approved FIPS source files are from the CyaSSL project v3.4.8.fips. The FIPS +and FIPS-TEST files are from our FIPS project v3.4.8. For the wolfCAVP test +the wolfSSL version used is v3.4.8. # Using the FIPS library diff --git a/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj b/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj index 001bdf155..1f14345f9 100644 --- a/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj +++ b/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj @@ -295,7 +295,7 @@ isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = include/wolfssl; - dstSubfolderSpec = 16; + dstSubfolderSpec = 7; files = ( 521646C41A8A7FE10062516A /* callbacks.h in CopyFiles */, 521646C51A8A7FE10062516A /* certs_test.h in CopyFiles */, @@ -917,6 +917,7 @@ $SRCROOT, $PROJECT_DIR/../.., ); + IPHONEOS_DEPLOYMENT_TARGET = 8.1; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = wolfssl; @@ -947,6 +948,7 @@ $SRCROOT, $PROJECT_DIR/../.., ); + IPHONEOS_DEPLOYMENT_TARGET = 8.1; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = wolfssl; diff --git a/IDE/iOS/wolfssl.xcodeproj/project.pbxproj b/IDE/iOS/wolfssl.xcodeproj/project.pbxproj index 14fd4e4d6..0de405b73 100644 --- a/IDE/iOS/wolfssl.xcodeproj/project.pbxproj +++ b/IDE/iOS/wolfssl.xcodeproj/project.pbxproj @@ -283,7 +283,7 @@ isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = include/wolfssl; - dstSubfolderSpec = 16; + dstSubfolderSpec = 7; files = ( 521646C41A8A7FE10062516A /* callbacks.h in CopyFiles */, 521646C51A8A7FE10062516A /* certs_test.h in CopyFiles */, diff --git a/README b/README index d9e982f38..f5c77acc5 100644 --- a/README +++ b/README @@ -37,7 +37,20 @@ before calling wolfSSL_new(); Though it's not recommended. - GNU Binutils 2.24 ld has problems with some debug builds, to fix an ld error add -fdebug-types-section to C_EXTRA_FLAGS -wolfSSL (Formerly CyaSSL) Release 3.4.6 (03/30/2015) +wolfSSL (Formerly CyaSSL) Release 3.4.8 (04/06/2015) + +Release 3.4.8 of wolfSSL has bug fixes and new features including: + +- FIPS version submitted for iOS. +- Max Strength build that only allows TLSv1.2, AEAD ciphers, and PFS. +- Improvements to usage of time code. +- Improvements to VS solution files. + +See INSTALL file for build instructions. +More info can be found on-line at //http://wolfssl.com/yaSSL/Docs.html + + + *****************wolfSSL (Formerly CyaSSL) Release 3.4.6 (03/30/2015) Release 3.4.6 of wolfSSL has bug fixes and new features including: diff --git a/README.md b/README.md index 59c77e37c..a490ac2ff 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,19 @@ before calling wolfSSL_new(); Though it's not recommended. - GNU Binutils 2.24 ld has problems with some debug builds, to fix an ld error add -fdebug-types-section to C_EXTRA_FLAGS +#wolfSSL (Formerly CyaSSL) Release 3.4.8 (04/06/2015) + +##Release 3.4.8 of wolfSSL has bug fixes and new features including: + +- FIPS version submitted for iOS. +- Max Strength build that only allows TLSv1.2, AEAD ciphers, and PFS. +- Improvements to usage of time code. +- Improvements to VS solution files. + +See INSTALL file for build instructions. +More info can be found on-line at //http://wolfssl.com/yaSSL/Docs.html + + #wolfSSL (Formerly CyaSSL) Release 3.4.6 (03/30/2015) ##Release 3.4.6 of wolfSSL has bug fixes and new features including: diff --git a/configure.ac b/configure.ac index 45a687368..cdad2c153 100644 --- a/configure.ac +++ b/configure.ac @@ -6,7 +6,7 @@ # # -AC_INIT([wolfssl],[3.4.7],[https://github.com/wolfssl/wolfssl/issues],[wolfssl],[http://www.wolfssl.com]) +AC_INIT([wolfssl],[3.4.8],[https://github.com/wolfssl/wolfssl/issues],[wolfssl],[http://www.wolfssl.com]) AC_CONFIG_AUX_DIR([build-aux]) diff --git a/examples/client/client.vcxproj b/examples/client/client.vcxproj index 4442c56fd..dec191d7a 100644 --- a/examples/client/client.vcxproj +++ b/examples/client/client.vcxproj @@ -9,6 +9,22 @@ Debug x64 + + DLL Debug + Win32 + + + DLL Debug + x64 + + + DLL Release + Win32 + + + DLL Release + x64 + Release Win32 @@ -30,56 +46,114 @@ Unicode true + + Application + v110 + Unicode + true + Application v110 Unicode true + + Application + v110 + Unicode + true + Application v110 Unicode + + Application + v110 + Unicode + Application v110 Unicode + + Application + v110 + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>11.0.61030.0 $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ true true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + false + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ false false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ @@ -101,6 +175,26 @@ false + + + Disabled + ../../;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + Disabled @@ -119,6 +213,24 @@ Console + + + Disabled + ../../;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + + MaxSpeed @@ -141,6 +253,28 @@ false + + + MaxSpeed + true + ../../;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + MaxSpeed @@ -162,6 +296,27 @@ true + + + MaxSpeed + true + ../../;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + true + true + + diff --git a/examples/echoclient/echoclient.vcxproj b/examples/echoclient/echoclient.vcxproj index 342bb9ca5..a3a60545a 100644 --- a/examples/echoclient/echoclient.vcxproj +++ b/examples/echoclient/echoclient.vcxproj @@ -9,6 +9,22 @@ Debug x64 + + DLL Debug + Win32 + + + DLL Debug + x64 + + + DLL Release + Win32 + + + DLL Release + x64 + Release Win32 @@ -30,56 +46,114 @@ Unicode true + + Application + v110 + Unicode + true + Application v110 Unicode true + + Application + v110 + Unicode + true + Application v110 Unicode + + Application + v110 + Unicode + Application v110 Unicode + + Application + v110 + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>11.0.61030.0 $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ true true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + false + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ false false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ @@ -102,6 +176,26 @@ + + + Disabled + ../../;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + Disabled @@ -120,6 +214,24 @@ Console + + + Disabled + ../../;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + + MaxSpeed @@ -143,6 +255,28 @@ + + + MaxSpeed + true + ../../;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + MaxSpeed @@ -164,6 +298,27 @@ true + + + MaxSpeed + true + ../../;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + true + true + + diff --git a/examples/echoserver/echoserver.vcxproj b/examples/echoserver/echoserver.vcxproj index a9c210cbd..096ba75c6 100644 --- a/examples/echoserver/echoserver.vcxproj +++ b/examples/echoserver/echoserver.vcxproj @@ -9,6 +9,22 @@ Debug x64 + + DLL Debug + Win32 + + + DLL Debug + x64 + + + DLL Release + Win32 + + + DLL Release + x64 + Release Win32 @@ -30,56 +46,114 @@ Unicode true + + Application + v110 + Unicode + true + Application v110 Unicode true + + Application + v110 + Unicode + true + Application v110 Unicode + + Application + v110 + Unicode + Application v110 Unicode + + Application + v110 + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>11.0.61030.0 $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ true true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + false + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ false false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ @@ -102,6 +176,26 @@ + + + Disabled + ../../;%(AdditionalIncludeDirectories) + USE_ANY_ADDR;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + Disabled @@ -120,6 +214,24 @@ Console + + + Disabled + ../../;%(AdditionalIncludeDirectories) + USE_ANY_ADDR;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + + MaxSpeed @@ -142,6 +254,28 @@ false + + + MaxSpeed + true + ../../;%(AdditionalIncludeDirectories) + USE_ANY_ADDR;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + MaxSpeed @@ -163,6 +297,27 @@ true + + + MaxSpeed + true + ../../;%(AdditionalIncludeDirectories) + USE_ANY_ADDR;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + true + true + + diff --git a/examples/server/server.vcxproj b/examples/server/server.vcxproj index dc31fd672..f6b53fc57 100644 --- a/examples/server/server.vcxproj +++ b/examples/server/server.vcxproj @@ -9,6 +9,22 @@ Debug x64 + + DLL Debug + Win32 + + + DLL Debug + x64 + + + DLL Release + Win32 + + + DLL Release + x64 + Release Win32 @@ -30,56 +46,114 @@ Unicode true + + Application + v110 + Unicode + true + Application v110 Unicode true + + Application + v110 + Unicode + true + Application v110 Unicode + + Application + v110 + Unicode + Application v110 Unicode + + Application + v110 + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>11.0.61030.0 $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ true true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + false + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ false false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ @@ -102,6 +176,26 @@ + + + Disabled + ../../;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + Disabled @@ -120,6 +214,24 @@ Console + + + Disabled + ../../;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + + MaxSpeed @@ -143,6 +255,28 @@ + + + MaxSpeed + true + ../../;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + MaxSpeed @@ -164,6 +298,27 @@ true + + + MaxSpeed + true + ../../;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + true + true + + diff --git a/src/internal.c b/src/internal.c index 4f644fd2f..39e3beb90 100644 --- a/src/internal.c +++ b/src/internal.c @@ -7589,6 +7589,8 @@ startScr: if (ssl->error == SOCKET_ERROR_E) { if (ssl->options.connReset || ssl->options.isClosed) { WOLFSSL_MSG("Peer reset or closed, connection done"); + ssl->error = SOCKET_PEER_CLOSED_E; + WOLFSSL_ERROR(ssl->error); return 0; /* peer reset or closed */ } } @@ -8002,6 +8004,12 @@ const char* wolfSSL_ERR_reason_error_string(unsigned long e) case DUPLICATE_MSG_E: return "Duplicate HandShake message Error"; + case SNI_UNSUPPORTED: + return "Protocol version does not support SNI Error"; + + case SOCKET_PEER_CLOSED_E: + return "Peer closed underlying transport Error"; + default : return "unknown error number"; } diff --git a/sslSniffer/sslSniffer.vcxproj b/sslSniffer/sslSniffer.vcxproj index 7419737c1..56404e997 100644 --- a/sslSniffer/sslSniffer.vcxproj +++ b/sslSniffer/sslSniffer.vcxproj @@ -67,19 +67,23 @@ $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ true true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ false false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ @@ -166,7 +170,7 @@ - + diff --git a/support/wolfssl.pc b/support/wolfssl.pc index 1265e7ce0..c07ae3ea2 100644 --- a/support/wolfssl.pc +++ b/support/wolfssl.pc @@ -5,6 +5,6 @@ includedir=${prefix}/include Name: wolfssl Description: wolfssl C library. -Version: 3.4.7 +Version: 3.4.8 Libs: -L${libdir} -lwolfssl Cflags: -I${includedir} diff --git a/testsuite/testsuite.vcxproj b/testsuite/testsuite.vcxproj index f7d5f16b5..484a87584 100644 --- a/testsuite/testsuite.vcxproj +++ b/testsuite/testsuite.vcxproj @@ -9,6 +9,22 @@ Debug x64 + + DLL Debug + Win32 + + + DLL Debug + x64 + + + DLL Release + Win32 + + + DLL Release + x64 + Release Win32 @@ -30,56 +46,114 @@ Unicode true + + Application + v110 + Unicode + true + Application v110 Unicode true + + Application + v110 + Unicode + true + Application v110 Unicode + + Application + v110 + Unicode + Application v110 Unicode + + Application + v110 + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>11.0.61030.0 $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + true + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ true true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + false + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ false false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ @@ -101,6 +175,26 @@ false + + + Disabled + ../;%(AdditionalIncludeDirectories) + NO_MAIN_DRIVER;WOLFSSL_RIPEMD;WOLFSSL_SHA512;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + MachineX86 + + Disabled @@ -119,6 +213,24 @@ Console + + + Disabled + ../;%(AdditionalIncludeDirectories) + NO_MAIN_DRIVER;WOLFSSL_RIPEMD;WOLFSSL_SHA512;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + + MaxSpeed @@ -141,6 +253,28 @@ false + + + MaxSpeed + true + ../;%(AdditionalIncludeDirectories) + NO_MAIN_DRIVER;WOLFSSL_RIPEMD;WOLFSSL_SHA512;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + + MaxSpeed @@ -162,6 +296,27 @@ true + + + MaxSpeed + true + ../;%(AdditionalIncludeDirectories) + NO_MAIN_DRIVER;WOLFSSL_RIPEMD;WOLFSSL_SHA512;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + Ws2_32.lib;%(AdditionalDependencies) + true + Console + true + true + + diff --git a/wolfcrypt/src/asm.c b/wolfcrypt/src/asm.c index 016225df1..08dc21d16 100755 --- a/wolfcrypt/src/asm.c +++ b/wolfcrypt/src/asm.c @@ -65,9 +65,11 @@ #define CPUID_AVX2 0x2 #define CPUID_RDRAND 0x4 #define CPUID_RDSEED 0x8 +#define CPUID_BMI2 0x10 #define IS_INTEL_AVX1 (cpuid_flags&CPUID_AVX1) #define IS_INTEL_AVX2 (cpuid_flags&CPUID_AVX2) +#define IS_INTEL_BMI2 (cpuid_flags&CPUID_BMI2) #define IS_INTEL_RDRAND (cpuid_flags&CPUID_RDRAND) #define IS_INTEL_RDSEED (cpuid_flags&CPUID_RDSEED) #define SET_FLAGS @@ -95,7 +97,7 @@ static word32 cpuid_flag(word32 leaf, word32 sub, word32 num, word32 bit) { INLINE static int set_cpuid_flags(void) { if(cpuid_check == 0) { - if(cpuid_flag(7, 0, EBX, 5)){ cpuid_flags |= CPUID_AVX2 ; } + if(cpuid_flag(7, 0, EBX, 8)){ cpuid_flags |= CPUID_BMI2 ; } cpuid_check = 1 ; return 0 ; } @@ -105,7 +107,7 @@ INLINE static int set_cpuid_flags(void) { #define RETURN return #define IF_HAVE_INTEL_MULX(func, ret) \ if(cpuid_check==0)set_cpuid_flags() ; \ - if(IS_INTEL_AVX2){ func; ret ; } + if(IS_INTEL_BMI2){ func; ret ; } #else #define IF_HAVE_INTEL_MULX(func, ret) diff --git a/wolfssl.vcxproj b/wolfssl.vcxproj index cf057198a..8a95297e1 100644 --- a/wolfssl.vcxproj +++ b/wolfssl.vcxproj @@ -9,6 +9,22 @@ Debug x64 + + DLL Debug + Win32 + + + DLL Debug + x64 + + + DLL Release + Win32 + + + DLL Release + x64 + Release Win32 @@ -30,51 +46,104 @@ Unicode true + + DynamicLibrary + v110 + Unicode + true + StaticLibrary v110 Unicode true + + DynamicLibrary + v110 + Unicode + true + StaticLibrary v110 Unicode + + DynamicLibrary + v110 + Unicode + StaticLibrary v110 Unicode + + DynamicLibrary + v110 + Unicode + + + + + + + + + + + + + - - <_ProjectFileVersion>11.0.61030.0 + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ + + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ - - + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + $(SolutionDir)$(Configuration)\ - $(Configuration)\ + $(Configuration)\obj\ + + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ - Disabled @@ -89,6 +158,26 @@ 4206;4214;4706;%(DisableSpecificWarnings) + + + Disabled + ./;%(AdditionalIncludeDirectories) + OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + 4206;4214;4706;%(DisableSpecificWarnings) + + + ws2_32.lib;%(AdditionalDependencies) + false + true + + Disabled @@ -103,6 +192,25 @@ 4206;4214;4706;%(DisableSpecificWarnings) + + + Disabled + ./;%(AdditionalIncludeDirectories) + OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + 4206;4214;4706;%(DisableSpecificWarnings) + + + ws2_32.lib;%(AdditionalDependencies) + false + true + + MaxSpeed @@ -116,6 +224,24 @@ ProgramDatabase + + + MaxSpeed + true + ./;%(AdditionalIncludeDirectories) + OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + ws2_32.lib;%(AdditionalDependencies) + true + + MaxSpeed @@ -130,6 +256,24 @@ ProgramDatabase + + + MaxSpeed + true + ./;%(AdditionalIncludeDirectories) + OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + ws2_32.lib;%(AdditionalDependencies) + true + + @@ -169,14 +313,20 @@ false + false ml64.exe /c /Zi /Fo"$(OutDir)%(Filename).obj" %(Identity) + ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) $(OutDir)%(Filename).obj + $(IntDir)%(Filename).obj false + false ml64.exe /c /Zi /Fo"$(OutDir)%(Filename).obj" %(Identity) + ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) $(OutDir)%(Filename).obj + $(IntDir)%(Filename).obj - + \ No newline at end of file diff --git a/wolfssl/error-ssl.h b/wolfssl/error-ssl.h index 732240382..0df2edb6e 100644 --- a/wolfssl/error-ssl.h +++ b/wolfssl/error-ssl.h @@ -127,6 +127,7 @@ enum wolfSSL_ErrorCodes { SANITY_MSG_E = -394, /* Sanity check on msg order error */ DUPLICATE_MSG_E = -395, /* Duplicate message error */ SNI_UNSUPPORTED = -396, /* SSL 3.0 does not support SNI */ + SOCKET_PEER_CLOSED_E = -397, /* Underlying transport closed */ /* add strings to SetErrorString !!!!! */ diff --git a/wolfssl/version.h b/wolfssl/version.h index 54e92ffc0..c76e07613 100644 --- a/wolfssl/version.h +++ b/wolfssl/version.h @@ -26,8 +26,8 @@ extern "C" { #endif -#define LIBWOLFSSL_VERSION_STRING "3.4.7" -#define LIBWOLFSSL_VERSION_HEX 0x03004007 +#define LIBWOLFSSL_VERSION_STRING "3.4.8" +#define LIBWOLFSSL_VERSION_HEX 0x03004008 #ifdef __cplusplus } diff --git a/wolfssl/wolfcrypt/visibility.h b/wolfssl/wolfcrypt/visibility.h index 05fd4754b..6e41d238f 100644 --- a/wolfssl/wolfcrypt/visibility.h +++ b/wolfssl/wolfcrypt/visibility.h @@ -47,7 +47,7 @@ #define WOLFSSL_LOCAL __hidden #elif defined(_MSC_VER) #ifdef WOLFSSL_DLL - #define WOLFSSL_API extern __declspec(dllexport) + #define WOLFSSL_API __declspec(dllexport) #else #define WOLFSSL_API #endif @@ -59,7 +59,7 @@ #else /* BUILDING_WOLFSSL */ #if defined(_MSC_VER) #ifdef WOLFSSL_DLL - #define WOLFSSL_API extern __declspec(dllimport) + #define WOLFSSL_API __declspec(dllimport) #else #define WOLFSSL_API #endif diff --git a/wolfssl64.sln b/wolfssl64.sln index 223ad75da..5e17787dc 100644 --- a/wolfssl64.sln +++ b/wolfssl64.sln @@ -1,6 +1,6 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Express 2012 for Windows Desktop +# Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wolfssl", "wolfssl.vcxproj", "{73973223-5EE8-41CA-8E88-1D60E89A237B}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testsuite", "testsuite\testsuite.vcxproj", "{611E8971-46E0-4D0A-B5A1-632C3B00CB80}" @@ -19,6 +19,10 @@ Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Debug|x64 = DLL Debug|x64 + DLL Release|Win32 = DLL Release|Win32 + DLL Release|x64 = DLL Release|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection @@ -27,6 +31,14 @@ Global {73973223-5EE8-41CA-8E88-1D60E89A237B}.Debug|Win32.Build.0 = Debug|Win32 {73973223-5EE8-41CA-8E88-1D60E89A237B}.Debug|x64.ActiveCfg = Debug|x64 {73973223-5EE8-41CA-8E88-1D60E89A237B}.Debug|x64.Build.0 = Debug|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|x64.Build.0 = DLL Release|x64 {73973223-5EE8-41CA-8E88-1D60E89A237B}.Release|Win32.ActiveCfg = Release|Win32 {73973223-5EE8-41CA-8E88-1D60E89A237B}.Release|Win32.Build.0 = Release|Win32 {73973223-5EE8-41CA-8E88-1D60E89A237B}.Release|x64.ActiveCfg = Release|x64 @@ -35,6 +47,14 @@ Global {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.Debug|Win32.Build.0 = Debug|Win32 {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.Debug|x64.ActiveCfg = Debug|x64 {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.Debug|x64.Build.0 = Debug|x64 + {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Release|x64.Build.0 = DLL Release|x64 {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.Release|Win32.ActiveCfg = Release|Win32 {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.Release|Win32.Build.0 = Release|Win32 {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.Release|x64.ActiveCfg = Release|x64 @@ -43,6 +63,10 @@ Global {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.Debug|Win32.Build.0 = Debug|Win32 {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.Debug|x64.ActiveCfg = Debug|x64 {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.Debug|x64.Build.0 = Debug|x64 + {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.DLL Debug|Win32.ActiveCfg = Debug|Win32 + {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.DLL Debug|x64.ActiveCfg = Debug|x64 + {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.DLL Release|Win32.ActiveCfg = Release|Win32 + {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.DLL Release|x64.ActiveCfg = Release|x64 {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.Release|Win32.ActiveCfg = Release|Win32 {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.Release|Win32.Build.0 = Release|Win32 {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.Release|x64.ActiveCfg = Release|x64 @@ -51,6 +75,14 @@ Global {07D97C48-E08F-4E34-9F67-3064039FF2CB}.Debug|Win32.Build.0 = Debug|Win32 {07D97C48-E08F-4E34-9F67-3064039FF2CB}.Debug|x64.ActiveCfg = Debug|x64 {07D97C48-E08F-4E34-9F67-3064039FF2CB}.Debug|x64.Build.0 = Debug|x64 + {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Release|x64.Build.0 = DLL Release|x64 {07D97C48-E08F-4E34-9F67-3064039FF2CB}.Release|Win32.ActiveCfg = Release|Win32 {07D97C48-E08F-4E34-9F67-3064039FF2CB}.Release|Win32.Build.0 = Release|Win32 {07D97C48-E08F-4E34-9F67-3064039FF2CB}.Release|x64.ActiveCfg = Release|x64 @@ -59,6 +91,14 @@ Global {8362A816-C5DC-4E22-B5C5-9E6806387073}.Debug|Win32.Build.0 = Debug|Win32 {8362A816-C5DC-4E22-B5C5-9E6806387073}.Debug|x64.ActiveCfg = Debug|x64 {8362A816-C5DC-4E22-B5C5-9E6806387073}.Debug|x64.Build.0 = Debug|x64 + {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Release|x64.Build.0 = DLL Release|x64 {8362A816-C5DC-4E22-B5C5-9E6806387073}.Release|Win32.ActiveCfg = Release|Win32 {8362A816-C5DC-4E22-B5C5-9E6806387073}.Release|Win32.Build.0 = Release|Win32 {8362A816-C5DC-4E22-B5C5-9E6806387073}.Release|x64.ActiveCfg = Release|x64 @@ -67,6 +107,14 @@ Global {3ADE9549-582D-4D8E-9826-B172197A7959}.Debug|Win32.Build.0 = Debug|Win32 {3ADE9549-582D-4D8E-9826-B172197A7959}.Debug|x64.ActiveCfg = Debug|x64 {3ADE9549-582D-4D8E-9826-B172197A7959}.Debug|x64.Build.0 = Debug|x64 + {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Release|x64.Build.0 = DLL Release|x64 {3ADE9549-582D-4D8E-9826-B172197A7959}.Release|Win32.ActiveCfg = Release|Win32 {3ADE9549-582D-4D8E-9826-B172197A7959}.Release|Win32.Build.0 = Release|Win32 {3ADE9549-582D-4D8E-9826-B172197A7959}.Release|x64.ActiveCfg = Release|x64 @@ -75,6 +123,14 @@ Global {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.Debug|Win32.Build.0 = Debug|Win32 {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.Debug|x64.ActiveCfg = Debug|x64 {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.Debug|x64.Build.0 = Debug|x64 + {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Release|x64.Build.0 = DLL Release|x64 {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.Release|Win32.ActiveCfg = Release|Win32 {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.Release|Win32.Build.0 = Release|Win32 {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.Release|x64.ActiveCfg = Release|x64 From 875ad2dc8ef33eb13090e46a82b37609945e66df Mon Sep 17 00:00:00 2001 From: John Safranek Date: Tue, 7 Apr 2015 13:41:29 -0700 Subject: [PATCH 027/350] forced iphone os deployment version to 8.1 in FIPS project --- IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj b/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj index 1f14345f9..d903641b8 100644 --- a/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj +++ b/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj @@ -865,7 +865,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; USER_HEADER_SEARCH_PATHS = "wolfssl/wolfcrypt wolfssl include"; @@ -888,7 +888,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; SDKROOT = iphoneos; USER_HEADER_SEARCH_PATHS = "wolfssl/wolfcrypt wolfssl include"; VALIDATE_PRODUCT = NO; From cf95bc23bb7db590bdc9accbb0444d8b4dd0f37a Mon Sep 17 00:00:00 2001 From: toddouska Date: Tue, 7 Apr 2015 14:57:40 -0700 Subject: [PATCH 028/350] on process server_key_exchange only do hash(es) required --- src/internal.c | 194 ++++++++++++++++++++++++++++++++------------ wolfcrypt/src/asn.c | 5 +- 2 files changed, 143 insertions(+), 56 deletions(-) diff --git a/src/internal.c b/src/internal.c index 39e3beb90..ab13a56a5 100644 --- a/src/internal.c +++ b/src/internal.c @@ -9977,6 +9977,20 @@ static void PickHashSigAlgo(WOLFSSL* ssl, byte sigAlgo = ssl->specs.sig_algo; word16 verifySz = (word16) (*inOutIdx - begin); +#ifndef NO_OLD_TLS + byte doMd5 = 0; + byte doSha = 0; +#endif +#ifndef NO_SHA256 + byte doSha256 = 0; +#endif +#ifdef WOLFSSL_SHA384 + byte doSha384 = 0; +#endif +#ifdef WOLFSSL_SHA512 + byte doSha512 = 0; +#endif + (void)hash; (void)sigAlgo; (void)hashAlgo; @@ -9995,11 +10009,60 @@ static void PickHashSigAlgo(WOLFSSL* ssl, XMEMCPY(messageVerify, input + begin, verifySz); if (IsAtLeastTLSv1_2(ssl)) { + byte setHash = 0; if ((*inOutIdx - begin) + ENUM_LEN + ENUM_LEN > size) ERROR_OUT(BUFFER_ERROR, done); hashAlgo = input[(*inOutIdx)++]; sigAlgo = input[(*inOutIdx)++]; + + switch (hashAlgo) { + case sha512_mac: + #ifdef WOLFSSL_SHA512 + doSha512 = 1; + setHash = 1; + #endif + break; + + case sha384_mac: + #ifdef WOLFSSL_SHA384 + doSha384 = 1; + setHash = 1; + #endif + break; + + case sha256_mac: + #ifndef NO_SHA256 + doSha256 = 1; + setHash = 1; + #endif + break; + + case sha_mac: + #ifndef NO_OLD_TLS + doSha = 1; + setHash = 1; + #endif + break; + + default: + ERROR_OUT(ALGO_ID_E, done); + } + + if (setHash == 0) { + ERROR_OUT(ALGO_ID_E, done); + } + + } else { + /* only using sha and md5 for rsa */ + #ifndef NO_OLD_TLS + doSha = 1; + if (sigAlgo == rsa_sa_algo) { + doMd5 = 1; + } + #else + ERROR_OUT(ALGO_ID_E, done); + #endif } /* signature */ @@ -10024,83 +10087,104 @@ static void PickHashSigAlgo(WOLFSSL* ssl, #ifndef NO_OLD_TLS /* md5 */ #ifdef WOLFSSL_SMALL_STACK - md5 = (Md5*)XMALLOC(sizeof(Md5), NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (md5 == NULL) - ERROR_OUT(MEMORY_E, done); + if (doMd5) { + md5 = (Md5*)XMALLOC(sizeof(Md5), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (md5 == NULL) + ERROR_OUT(MEMORY_E, done); + } #endif - wc_InitMd5(md5); - wc_Md5Update(md5, ssl->arrays->clientRandom, RAN_LEN); - wc_Md5Update(md5, ssl->arrays->serverRandom, RAN_LEN); - wc_Md5Update(md5, messageVerify, verifySz); - wc_Md5Final(md5, hash); - + if (doMd5) { + wc_InitMd5(md5); + wc_Md5Update(md5, ssl->arrays->clientRandom, RAN_LEN); + wc_Md5Update(md5, ssl->arrays->serverRandom, RAN_LEN); + wc_Md5Update(md5, messageVerify, verifySz); + wc_Md5Final(md5, hash); + } /* sha */ #ifdef WOLFSSL_SMALL_STACK - sha = (Sha*)XMALLOC(sizeof(Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (sha == NULL) - ERROR_OUT(MEMORY_E, done); + if (doSha) { + sha = (Sha*)XMALLOC(sizeof(Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (sha == NULL) + ERROR_OUT(MEMORY_E, done); + } #endif - ret = wc_InitSha(sha); - if (ret != 0) - goto done; - wc_ShaUpdate(sha, ssl->arrays->clientRandom, RAN_LEN); - wc_ShaUpdate(sha, ssl->arrays->serverRandom, RAN_LEN); - wc_ShaUpdate(sha, messageVerify, verifySz); - wc_ShaFinal(sha, hash + MD5_DIGEST_SIZE); + if (doSha) { + ret = wc_InitSha(sha); + if (ret != 0) goto done; + wc_ShaUpdate(sha, ssl->arrays->clientRandom, RAN_LEN); + wc_ShaUpdate(sha, ssl->arrays->serverRandom, RAN_LEN); + wc_ShaUpdate(sha, messageVerify, verifySz); + wc_ShaFinal(sha, hash + MD5_DIGEST_SIZE); + } #endif #ifndef NO_SHA256 #ifdef WOLFSSL_SMALL_STACK - sha256 = (Sha256*)XMALLOC(sizeof(Sha256), NULL, + if (doSha256) { + sha256 = (Sha256*)XMALLOC(sizeof(Sha256), NULL, DYNAMIC_TYPE_TMP_BUFFER); - hash256 = (byte*)XMALLOC(SHA256_DIGEST_SIZE, NULL, + hash256 = (byte*)XMALLOC(SHA256_DIGEST_SIZE, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (sha256 == NULL || hash256 == NULL) - ERROR_OUT(MEMORY_E, done); + if (sha256 == NULL || hash256 == NULL) + ERROR_OUT(MEMORY_E, done); + } #endif - if (!(ret = wc_InitSha256(sha256)) - && !(ret = wc_Sha256Update(sha256, ssl->arrays->clientRandom, RAN_LEN)) - && !(ret = wc_Sha256Update(sha256, ssl->arrays->serverRandom, RAN_LEN)) - && !(ret = wc_Sha256Update(sha256, messageVerify, verifySz))) - ret = wc_Sha256Final(sha256, hash256); - if (ret != 0) - goto done; + if (doSha256) { + if (!(ret = wc_InitSha256(sha256)) + && !(ret = wc_Sha256Update(sha256, ssl->arrays->clientRandom, + RAN_LEN)) + && !(ret = wc_Sha256Update(sha256, ssl->arrays->serverRandom, + RAN_LEN)) + && !(ret = wc_Sha256Update(sha256, messageVerify, verifySz))) + ret = wc_Sha256Final(sha256, hash256); + if (ret != 0) goto done; + } #endif #ifdef WOLFSSL_SHA384 #ifdef WOLFSSL_SMALL_STACK - sha384 = (Sha384*)XMALLOC(sizeof(Sha384), NULL, + if (doSha384) { + sha384 = (Sha384*)XMALLOC(sizeof(Sha384), NULL, DYNAMIC_TYPE_TMP_BUFFER); - hash384 = (byte*)XMALLOC(SHA384_DIGEST_SIZE, NULL, + hash384 = (byte*)XMALLOC(SHA384_DIGEST_SIZE, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (sha384 == NULL || hash384 == NULL) - ERROR_OUT(MEMORY_E, done); + if (sha384 == NULL || hash384 == NULL) + ERROR_OUT(MEMORY_E, done); + } #endif - if (!(ret = wc_InitSha384(sha384)) - && !(ret = wc_Sha384Update(sha384, ssl->arrays->clientRandom, RAN_LEN)) - && !(ret = wc_Sha384Update(sha384, ssl->arrays->serverRandom, RAN_LEN)) - && !(ret = wc_Sha384Update(sha384, messageVerify, verifySz))) - ret = wc_Sha384Final(sha384, hash384); - if (ret != 0) - goto done; + if (doSha384) { + if (!(ret = wc_InitSha384(sha384)) + && !(ret = wc_Sha384Update(sha384, ssl->arrays->clientRandom, + RAN_LEN)) + && !(ret = wc_Sha384Update(sha384, ssl->arrays->serverRandom, + RAN_LEN)) + && !(ret = wc_Sha384Update(sha384, messageVerify, verifySz))) + ret = wc_Sha384Final(sha384, hash384); + if (ret != 0) goto done; + } #endif #ifdef WOLFSSL_SHA512 #ifdef WOLFSSL_SMALL_STACK - sha512 = (Sha512*)XMALLOC(sizeof(Sha512), NULL, + if (doSha512) { + sha512 = (Sha512*)XMALLOC(sizeof(Sha512), NULL, DYNAMIC_TYPE_TMP_BUFFER); - hash512 = (byte*)XMALLOC(SHA512_DIGEST_SIZE, NULL, + hash512 = (byte*)XMALLOC(SHA512_DIGEST_SIZE, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (sha512 == NULL || hash512 == NULL) - ERROR_OUT(MEMORY_E, done); + if (sha512 == NULL || hash512 == NULL) + ERROR_OUT(MEMORY_E, done); + } #endif - if (!(ret = wc_InitSha512(sha512)) - && !(ret = wc_Sha512Update(sha512, ssl->arrays->clientRandom, RAN_LEN)) - && !(ret = wc_Sha512Update(sha512, ssl->arrays->serverRandom, RAN_LEN)) - && !(ret = wc_Sha512Update(sha512, messageVerify, verifySz))) - ret = wc_Sha512Final(sha512, hash512); - if (ret != 0) - goto done; + if (doSha512) { + if (!(ret = wc_InitSha512(sha512)) + && !(ret = wc_Sha512Update(sha512, ssl->arrays->clientRandom, + RAN_LEN)) + && !(ret = wc_Sha512Update(sha512, ssl->arrays->serverRandom, + RAN_LEN)) + && !(ret = wc_Sha512Update(sha512, messageVerify, verifySz))) + ret = wc_Sha512Final(sha512, hash512); + if (ret != 0) goto done; + } #endif #ifndef NO_RSA @@ -10186,8 +10270,10 @@ static void PickHashSigAlgo(WOLFSSL* ssl, ERROR_OUT(MEMORY_E, done); #endif - encSigSz = wc_EncodeSignature(encodedSig, digest, digestSz, typeH); - + if (digest == NULL) + ERROR_OUT(ALGO_ID_E, done); + encSigSz = wc_EncodeSignature(encodedSig, digest, digestSz, + typeH); if (encSigSz != verifiedSz || !out || XMEMCMP(out, encodedSig, min(encSigSz, MAX_ENCODED_SIG_SZ)) != 0) ret = VERIFY_SIGN_ERROR; diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 399753ab3..634623bee 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -2931,12 +2931,13 @@ WOLFSSL_LOCAL word32 SetAlgoID(int algoOID, byte* output, int type, int curveSz) } -word32 wc_EncodeSignature(byte* out, const byte* digest, word32 digSz, int hashOID) +word32 wc_EncodeSignature(byte* out, const byte* digest, word32 digSz, + int hashOID) { byte digArray[MAX_ENCODED_DIG_SZ]; byte algoArray[MAX_ALGO_SZ]; byte seqArray[MAX_SEQ_SZ]; - word32 encDigSz, algoSz, seqSz; + word32 encDigSz, algoSz, seqSz; encDigSz = SetDigest(digest, digSz, digArray); algoSz = SetAlgoID(hashOID, algoArray, hashType, 0); From ea585e9b1989643259dc9b738015e07a361913a0 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Tue, 7 Apr 2015 16:00:12 -0700 Subject: [PATCH 029/350] Updated iOS readme. Turned off unused wolfCrypt options in iOS FIPS build. --- IDE/iOS/README.md | 19 ++++++++++++------- .../wolfssl-FIPS.xcodeproj/project.pbxproj | 8 ++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/IDE/iOS/README.md b/IDE/iOS/README.md index 519520e56..f4525176c 100644 --- a/IDE/iOS/README.md +++ b/IDE/iOS/README.md @@ -63,10 +63,15 @@ for "Preprocessor Macros" and add the following under both `Release` and * `HAVE_AESGCM` * `WOLFSSL_SHA512` * `WOLFSSL_SHA384` +* `NO_MD4` +* `NO_HC128` +* `NO_RABBIT` +* `NO_DSA` +* `NO_PWDBASED` -The approved FIPS source files are from the CyaSSL project v3.4.8.fips. The FIPS -and FIPS-TEST files are from our FIPS project v3.4.8. For the wolfCAVP test -the wolfSSL version used is v3.4.8. +The approved FIPS source files are from the CyaSSL project tag v3.4.8.fips. The +files fips.c and fips_test.c, and the wolfCAVP test app are from the FIPS +project tag v3.4.8a. The wolfSSL/wolfCrypt files are from tag v3.4.8. # Using the FIPS library @@ -80,7 +85,7 @@ Every time the application is changed, the FIPS checksum will change, because the FIPS library's position in the executable may change. You need to add something to your application that will output the verifyCore -value to be used. The verifyCore in fips_test.c will need to be updated with this -value, the library rebuilt, and relinked into your application. The application -should not be changed during this process or the verifyCore check will fail again. - +value to be used. The verifyCore in fips_test.c will need to be updated with +this value, the library rebuilt, and relinked into your application. The +application should not be changed during this process or the verifyCore check +will fail again. diff --git a/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj b/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj index d903641b8..06011aecd 100644 --- a/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj +++ b/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj @@ -911,6 +911,10 @@ HAVE_AESGCM, WOLFSSL_SHA512, WOLFSSL_SHA384, + NO_MD4, + NO_HC128, + NO_RABBIT, + NO_DSA, NO_PWDBASED, ); HEADER_SEARCH_PATHS = ( @@ -942,6 +946,10 @@ HAVE_AESGCM, WOLFSSL_SHA512, WOLFSSL_SHA384, + NO_MD4, + NO_HC128, + NO_RABBIT, + NO_DSA, NO_PWDBASED, ); HEADER_SEARCH_PATHS = ( From 6728a18d7c6dc97c0872f4393c538a6ee7b9c5c2 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Wed, 8 Apr 2015 10:14:45 +0900 Subject: [PATCH 030/350] cpuflag ADX for Intel MULX in asm.c, BMI2 in sha256/512.c --- wolfcrypt/src/asm.c | 7 +++++-- wolfcrypt/src/sha256.c | 5 ++++- wolfcrypt/src/sha512.c | 7 +++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/wolfcrypt/src/asm.c b/wolfcrypt/src/asm.c index 08dc21d16..9f8458588 100755 --- a/wolfcrypt/src/asm.c +++ b/wolfcrypt/src/asm.c @@ -65,11 +65,13 @@ #define CPUID_AVX2 0x2 #define CPUID_RDRAND 0x4 #define CPUID_RDSEED 0x8 -#define CPUID_BMI2 0x10 +#define CPUID_BMI2 0x10 /* MULX, RORX */ +#define CPUID_ADX 0x20 /* ADCX, ADOX */ #define IS_INTEL_AVX1 (cpuid_flags&CPUID_AVX1) #define IS_INTEL_AVX2 (cpuid_flags&CPUID_AVX2) #define IS_INTEL_BMI2 (cpuid_flags&CPUID_BMI2) +#define IS_INTEL_ADX (cpuid_flags&CPUID_ADX) #define IS_INTEL_RDRAND (cpuid_flags&CPUID_RDRAND) #define IS_INTEL_RDSEED (cpuid_flags&CPUID_RDSEED) #define SET_FLAGS @@ -98,6 +100,7 @@ static word32 cpuid_flag(word32 leaf, word32 sub, word32 num, word32 bit) { INLINE static int set_cpuid_flags(void) { if(cpuid_check == 0) { if(cpuid_flag(7, 0, EBX, 8)){ cpuid_flags |= CPUID_BMI2 ; } + if(cpuid_flag(7, 0, EBX,19)){ cpuid_flags |= CPUID_ADX ; } cpuid_check = 1 ; return 0 ; } @@ -107,7 +110,7 @@ INLINE static int set_cpuid_flags(void) { #define RETURN return #define IF_HAVE_INTEL_MULX(func, ret) \ if(cpuid_check==0)set_cpuid_flags() ; \ - if(IS_INTEL_BMI2){ func; ret ; } + if(IS_INTEL_BMI2 && IS_INTEL_ADX){ func; ret ; } #else #define IF_HAVE_INTEL_MULX(func, ret) diff --git a/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c index 9993dcc88..6ab516347 100755 --- a/wolfcrypt/src/sha256.c +++ b/wolfcrypt/src/sha256.c @@ -176,9 +176,11 @@ int InitSha256(Sha256* sha256) { #define CPUID_AVX2 0x2 #define CPUID_RDRAND 0x4 #define CPUID_RDSEED 0x8 +#define CPUID_BMI2 0x10 /* MULX, RORX */ #define IS_INTEL_AVX1 (cpuid_flags&CPUID_AVX1) #define IS_INTEL_AVX2 (cpuid_flags&CPUID_AVX2) +#define IS_INTEL_BMI2 (cpuid_flags&CPUID_BMI2) #define IS_INTEL_RDRAND (cpuid_flags&CPUID_RDRAND) #define IS_INTEL_RDSEED (cpuid_flags&CPUID_RDSEED) @@ -207,6 +209,7 @@ static int set_cpuid_flags(void) { if(cpuid_check==0) { if(cpuid_flag(1, 0, ECX, 28)){ cpuid_flags |= CPUID_AVX1 ;} if(cpuid_flag(7, 0, EBX, 5)){ cpuid_flags |= CPUID_AVX2 ; } + if(cpuid_flag(7, 0, EBX, 8)) { cpuid_flags |= CPUID_BMI2 ; } if(cpuid_flag(1, 0, ECX, 30)){ cpuid_flags |= CPUID_RDRAND ; } if(cpuid_flag(7, 0, EBX, 18)){ cpuid_flags |= CPUID_RDSEED ; } cpuid_check = 1 ; @@ -235,7 +238,7 @@ static void set_Transform(void) { if(set_cpuid_flags())return ; #if defined(HAVE_INTEL_AVX2) - if(IS_INTEL_AVX2){ + if(IS_INTEL_AVX2 && IS_INTEL_BMI2){ Transform_p = Transform_AVX1_RORX; return ; Transform_p = Transform_AVX2 ; /* for avoiding warning,"not used" */ diff --git a/wolfcrypt/src/sha512.c b/wolfcrypt/src/sha512.c index f77c8a2cf..62457f891 100755 --- a/wolfcrypt/src/sha512.c +++ b/wolfcrypt/src/sha512.c @@ -208,9 +208,11 @@ int InitSha512(Sha512* sha512) { #define CPUID_AVX2 0x2 #define CPUID_RDRAND 0x4 #define CPUID_RDSEED 0x8 +#define CPUID_BMI2 0x10 /* MULX, RORX */ #define IS_INTEL_AVX1 (cpuid_flags&CPUID_AVX1) #define IS_INTEL_AVX2 (cpuid_flags&CPUID_AVX2) +#define IS_INTEL_BMI2 (cpuid_flags&CPUID_BMI2) #define IS_INTEL_RDRAND (cpuid_flags&CPUID_RDRAND) #define IS_INTEL_RDSEED (cpuid_flags&CPUID_RDSEED) @@ -242,6 +244,7 @@ static int set_cpuid_flags(int sha) { if((cpuid_check & sha) ==0) { if(cpuid_flag(1, 0, ECX, 28)){ cpuid_flags |= CPUID_AVX1 ;} if(cpuid_flag(7, 0, EBX, 5)){ cpuid_flags |= CPUID_AVX2 ; } + if(cpuid_flag(7, 0, EBX, 8)) { cpuid_flags |= CPUID_BMI2 ; } if(cpuid_flag(1, 0, ECX, 30)){ cpuid_flags |= CPUID_RDRAND ; } if(cpuid_flag(7, 0, EBX, 18)){ cpuid_flags |= CPUID_RDSEED ; } cpuid_check |= sha ; @@ -276,7 +279,7 @@ static void set_Transform(void) { if(set_cpuid_flags(CHECK_SHA512)) return ; #if defined(HAVE_INTEL_AVX2) - if(IS_INTEL_AVX2){ + if(IS_INTEL_AVX2 && IS_INTEL_BMI2){ Transform_p = Transform_AVX1_RORX; return ; Transform_p = Transform_AVX2 ; /* for avoiding warning,"not used" */ @@ -1352,7 +1355,7 @@ static void set_Transform384(void) { Transform384_p = ((IS_INTEL_AVX1) ? Transform384_AVX1 : _Transform384) ; #elif defined(HAVE_INTEL_AVX2) #if defined(HAVE_INTEL_AVX1) && defined(HAVE_INTEL_RORX) - if(IS_INTEL_AVX2) { Transform384_p = Transform384_AVX1_RORX ; return ; } + if(IS_INTEL_AVX2 && IS_INTEL_BMI2) { Transform384_p = Transform384_AVX1_RORX ; return ; } #endif if(IS_INTEL_AVX2) { Transform384_p = Transform384_AVX2 ; return ; } #if defined(HAVE_INTEL_AVX1) From 079c9908a39797dc5e484d651dbe7beff5ae2ecf Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Wed, 8 Apr 2015 11:09:57 +0900 Subject: [PATCH 031/350] Merged with 3.4.8 --- .../wolfssl-FIPS.xcodeproj/project.pbxproj | 12 +- src/internal.c | 194 +++++++++++++----- wolfcrypt/src/asn.c | 5 +- 3 files changed, 153 insertions(+), 58 deletions(-) diff --git a/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj b/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj index 1f14345f9..06011aecd 100644 --- a/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj +++ b/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj @@ -865,7 +865,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; USER_HEADER_SEARCH_PATHS = "wolfssl/wolfcrypt wolfssl include"; @@ -888,7 +888,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; SDKROOT = iphoneos; USER_HEADER_SEARCH_PATHS = "wolfssl/wolfcrypt wolfssl include"; VALIDATE_PRODUCT = NO; @@ -911,6 +911,10 @@ HAVE_AESGCM, WOLFSSL_SHA512, WOLFSSL_SHA384, + NO_MD4, + NO_HC128, + NO_RABBIT, + NO_DSA, NO_PWDBASED, ); HEADER_SEARCH_PATHS = ( @@ -942,6 +946,10 @@ HAVE_AESGCM, WOLFSSL_SHA512, WOLFSSL_SHA384, + NO_MD4, + NO_HC128, + NO_RABBIT, + NO_DSA, NO_PWDBASED, ); HEADER_SEARCH_PATHS = ( diff --git a/src/internal.c b/src/internal.c index 39e3beb90..ab13a56a5 100644 --- a/src/internal.c +++ b/src/internal.c @@ -9977,6 +9977,20 @@ static void PickHashSigAlgo(WOLFSSL* ssl, byte sigAlgo = ssl->specs.sig_algo; word16 verifySz = (word16) (*inOutIdx - begin); +#ifndef NO_OLD_TLS + byte doMd5 = 0; + byte doSha = 0; +#endif +#ifndef NO_SHA256 + byte doSha256 = 0; +#endif +#ifdef WOLFSSL_SHA384 + byte doSha384 = 0; +#endif +#ifdef WOLFSSL_SHA512 + byte doSha512 = 0; +#endif + (void)hash; (void)sigAlgo; (void)hashAlgo; @@ -9995,11 +10009,60 @@ static void PickHashSigAlgo(WOLFSSL* ssl, XMEMCPY(messageVerify, input + begin, verifySz); if (IsAtLeastTLSv1_2(ssl)) { + byte setHash = 0; if ((*inOutIdx - begin) + ENUM_LEN + ENUM_LEN > size) ERROR_OUT(BUFFER_ERROR, done); hashAlgo = input[(*inOutIdx)++]; sigAlgo = input[(*inOutIdx)++]; + + switch (hashAlgo) { + case sha512_mac: + #ifdef WOLFSSL_SHA512 + doSha512 = 1; + setHash = 1; + #endif + break; + + case sha384_mac: + #ifdef WOLFSSL_SHA384 + doSha384 = 1; + setHash = 1; + #endif + break; + + case sha256_mac: + #ifndef NO_SHA256 + doSha256 = 1; + setHash = 1; + #endif + break; + + case sha_mac: + #ifndef NO_OLD_TLS + doSha = 1; + setHash = 1; + #endif + break; + + default: + ERROR_OUT(ALGO_ID_E, done); + } + + if (setHash == 0) { + ERROR_OUT(ALGO_ID_E, done); + } + + } else { + /* only using sha and md5 for rsa */ + #ifndef NO_OLD_TLS + doSha = 1; + if (sigAlgo == rsa_sa_algo) { + doMd5 = 1; + } + #else + ERROR_OUT(ALGO_ID_E, done); + #endif } /* signature */ @@ -10024,83 +10087,104 @@ static void PickHashSigAlgo(WOLFSSL* ssl, #ifndef NO_OLD_TLS /* md5 */ #ifdef WOLFSSL_SMALL_STACK - md5 = (Md5*)XMALLOC(sizeof(Md5), NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (md5 == NULL) - ERROR_OUT(MEMORY_E, done); + if (doMd5) { + md5 = (Md5*)XMALLOC(sizeof(Md5), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (md5 == NULL) + ERROR_OUT(MEMORY_E, done); + } #endif - wc_InitMd5(md5); - wc_Md5Update(md5, ssl->arrays->clientRandom, RAN_LEN); - wc_Md5Update(md5, ssl->arrays->serverRandom, RAN_LEN); - wc_Md5Update(md5, messageVerify, verifySz); - wc_Md5Final(md5, hash); - + if (doMd5) { + wc_InitMd5(md5); + wc_Md5Update(md5, ssl->arrays->clientRandom, RAN_LEN); + wc_Md5Update(md5, ssl->arrays->serverRandom, RAN_LEN); + wc_Md5Update(md5, messageVerify, verifySz); + wc_Md5Final(md5, hash); + } /* sha */ #ifdef WOLFSSL_SMALL_STACK - sha = (Sha*)XMALLOC(sizeof(Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (sha == NULL) - ERROR_OUT(MEMORY_E, done); + if (doSha) { + sha = (Sha*)XMALLOC(sizeof(Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (sha == NULL) + ERROR_OUT(MEMORY_E, done); + } #endif - ret = wc_InitSha(sha); - if (ret != 0) - goto done; - wc_ShaUpdate(sha, ssl->arrays->clientRandom, RAN_LEN); - wc_ShaUpdate(sha, ssl->arrays->serverRandom, RAN_LEN); - wc_ShaUpdate(sha, messageVerify, verifySz); - wc_ShaFinal(sha, hash + MD5_DIGEST_SIZE); + if (doSha) { + ret = wc_InitSha(sha); + if (ret != 0) goto done; + wc_ShaUpdate(sha, ssl->arrays->clientRandom, RAN_LEN); + wc_ShaUpdate(sha, ssl->arrays->serverRandom, RAN_LEN); + wc_ShaUpdate(sha, messageVerify, verifySz); + wc_ShaFinal(sha, hash + MD5_DIGEST_SIZE); + } #endif #ifndef NO_SHA256 #ifdef WOLFSSL_SMALL_STACK - sha256 = (Sha256*)XMALLOC(sizeof(Sha256), NULL, + if (doSha256) { + sha256 = (Sha256*)XMALLOC(sizeof(Sha256), NULL, DYNAMIC_TYPE_TMP_BUFFER); - hash256 = (byte*)XMALLOC(SHA256_DIGEST_SIZE, NULL, + hash256 = (byte*)XMALLOC(SHA256_DIGEST_SIZE, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (sha256 == NULL || hash256 == NULL) - ERROR_OUT(MEMORY_E, done); + if (sha256 == NULL || hash256 == NULL) + ERROR_OUT(MEMORY_E, done); + } #endif - if (!(ret = wc_InitSha256(sha256)) - && !(ret = wc_Sha256Update(sha256, ssl->arrays->clientRandom, RAN_LEN)) - && !(ret = wc_Sha256Update(sha256, ssl->arrays->serverRandom, RAN_LEN)) - && !(ret = wc_Sha256Update(sha256, messageVerify, verifySz))) - ret = wc_Sha256Final(sha256, hash256); - if (ret != 0) - goto done; + if (doSha256) { + if (!(ret = wc_InitSha256(sha256)) + && !(ret = wc_Sha256Update(sha256, ssl->arrays->clientRandom, + RAN_LEN)) + && !(ret = wc_Sha256Update(sha256, ssl->arrays->serverRandom, + RAN_LEN)) + && !(ret = wc_Sha256Update(sha256, messageVerify, verifySz))) + ret = wc_Sha256Final(sha256, hash256); + if (ret != 0) goto done; + } #endif #ifdef WOLFSSL_SHA384 #ifdef WOLFSSL_SMALL_STACK - sha384 = (Sha384*)XMALLOC(sizeof(Sha384), NULL, + if (doSha384) { + sha384 = (Sha384*)XMALLOC(sizeof(Sha384), NULL, DYNAMIC_TYPE_TMP_BUFFER); - hash384 = (byte*)XMALLOC(SHA384_DIGEST_SIZE, NULL, + hash384 = (byte*)XMALLOC(SHA384_DIGEST_SIZE, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (sha384 == NULL || hash384 == NULL) - ERROR_OUT(MEMORY_E, done); + if (sha384 == NULL || hash384 == NULL) + ERROR_OUT(MEMORY_E, done); + } #endif - if (!(ret = wc_InitSha384(sha384)) - && !(ret = wc_Sha384Update(sha384, ssl->arrays->clientRandom, RAN_LEN)) - && !(ret = wc_Sha384Update(sha384, ssl->arrays->serverRandom, RAN_LEN)) - && !(ret = wc_Sha384Update(sha384, messageVerify, verifySz))) - ret = wc_Sha384Final(sha384, hash384); - if (ret != 0) - goto done; + if (doSha384) { + if (!(ret = wc_InitSha384(sha384)) + && !(ret = wc_Sha384Update(sha384, ssl->arrays->clientRandom, + RAN_LEN)) + && !(ret = wc_Sha384Update(sha384, ssl->arrays->serverRandom, + RAN_LEN)) + && !(ret = wc_Sha384Update(sha384, messageVerify, verifySz))) + ret = wc_Sha384Final(sha384, hash384); + if (ret != 0) goto done; + } #endif #ifdef WOLFSSL_SHA512 #ifdef WOLFSSL_SMALL_STACK - sha512 = (Sha512*)XMALLOC(sizeof(Sha512), NULL, + if (doSha512) { + sha512 = (Sha512*)XMALLOC(sizeof(Sha512), NULL, DYNAMIC_TYPE_TMP_BUFFER); - hash512 = (byte*)XMALLOC(SHA512_DIGEST_SIZE, NULL, + hash512 = (byte*)XMALLOC(SHA512_DIGEST_SIZE, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (sha512 == NULL || hash512 == NULL) - ERROR_OUT(MEMORY_E, done); + if (sha512 == NULL || hash512 == NULL) + ERROR_OUT(MEMORY_E, done); + } #endif - if (!(ret = wc_InitSha512(sha512)) - && !(ret = wc_Sha512Update(sha512, ssl->arrays->clientRandom, RAN_LEN)) - && !(ret = wc_Sha512Update(sha512, ssl->arrays->serverRandom, RAN_LEN)) - && !(ret = wc_Sha512Update(sha512, messageVerify, verifySz))) - ret = wc_Sha512Final(sha512, hash512); - if (ret != 0) - goto done; + if (doSha512) { + if (!(ret = wc_InitSha512(sha512)) + && !(ret = wc_Sha512Update(sha512, ssl->arrays->clientRandom, + RAN_LEN)) + && !(ret = wc_Sha512Update(sha512, ssl->arrays->serverRandom, + RAN_LEN)) + && !(ret = wc_Sha512Update(sha512, messageVerify, verifySz))) + ret = wc_Sha512Final(sha512, hash512); + if (ret != 0) goto done; + } #endif #ifndef NO_RSA @@ -10186,8 +10270,10 @@ static void PickHashSigAlgo(WOLFSSL* ssl, ERROR_OUT(MEMORY_E, done); #endif - encSigSz = wc_EncodeSignature(encodedSig, digest, digestSz, typeH); - + if (digest == NULL) + ERROR_OUT(ALGO_ID_E, done); + encSigSz = wc_EncodeSignature(encodedSig, digest, digestSz, + typeH); if (encSigSz != verifiedSz || !out || XMEMCMP(out, encodedSig, min(encSigSz, MAX_ENCODED_SIG_SZ)) != 0) ret = VERIFY_SIGN_ERROR; diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 399753ab3..634623bee 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -2931,12 +2931,13 @@ WOLFSSL_LOCAL word32 SetAlgoID(int algoOID, byte* output, int type, int curveSz) } -word32 wc_EncodeSignature(byte* out, const byte* digest, word32 digSz, int hashOID) +word32 wc_EncodeSignature(byte* out, const byte* digest, word32 digSz, + int hashOID) { byte digArray[MAX_ENCODED_DIG_SZ]; byte algoArray[MAX_ALGO_SZ]; byte seqArray[MAX_SEQ_SZ]; - word32 encDigSz, algoSz, seqSz; + word32 encDigSz, algoSz, seqSz; encDigSz = SetDigest(digest, digSz, digArray); algoSz = SetAlgoID(hashOID, algoArray, hashType, 0); From 3ff5e5402550aee9c4faae2d158ba2bdb9bfef80 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Wed, 8 Apr 2015 13:46:27 +0900 Subject: [PATCH 032/350] rollback files --- IDE/iOS/README.md | 12 +- .../wolfssl-FIPS.xcodeproj/project.pbxproj | 4 +- IDE/iOS/wolfssl.xcodeproj/project.pbxproj | 2 +- README | 15 +- README.md | 13 -- configure.ac | 2 +- examples/client/client.vcxproj | 159 +---------------- examples/echoclient/echoclient.vcxproj | 159 +---------------- examples/echoserver/echoserver.vcxproj | 159 +---------------- examples/server/server.vcxproj | 159 +---------------- src/internal.c | 8 - sslSniffer/sslSniffer.vcxproj | 10 +- support/wolfssl.pc | 2 +- testsuite/testsuite.vcxproj | 159 +---------------- wolfssl.vcxproj | 166 +----------------- wolfssl/error-ssl.h | 1 - wolfssl/version.h | 4 +- wolfssl/wolfcrypt/visibility.h | 4 +- wolfssl64.sln | 58 +----- 19 files changed, 37 insertions(+), 1059 deletions(-) diff --git a/IDE/iOS/README.md b/IDE/iOS/README.md index 519520e56..e9e781b49 100644 --- a/IDE/iOS/README.md +++ b/IDE/iOS/README.md @@ -28,10 +28,13 @@ order. # Building libwolfssl.a -There are several options of builds. You can make a simulator build, or a -device build. Both are debug builds. +## Debug build + +## Release build + +A release build requires an Apple Developer account, as far as I can tell. I +have not tried this yet. -You can make an archive for a device, as well. That is a release build. # Installing libwolfssl.a @@ -64,9 +67,6 @@ for "Preprocessor Macros" and add the following under both `Release` and * `WOLFSSL_SHA512` * `WOLFSSL_SHA384` -The approved FIPS source files are from the CyaSSL project v3.4.8.fips. The FIPS -and FIPS-TEST files are from our FIPS project v3.4.8. For the wolfCAVP test -the wolfSSL version used is v3.4.8. # Using the FIPS library diff --git a/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj b/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj index 1f14345f9..001bdf155 100644 --- a/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj +++ b/IDE/iOS/wolfssl-FIPS.xcodeproj/project.pbxproj @@ -295,7 +295,7 @@ isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = include/wolfssl; - dstSubfolderSpec = 7; + dstSubfolderSpec = 16; files = ( 521646C41A8A7FE10062516A /* callbacks.h in CopyFiles */, 521646C51A8A7FE10062516A /* certs_test.h in CopyFiles */, @@ -917,7 +917,6 @@ $SRCROOT, $PROJECT_DIR/../.., ); - IPHONEOS_DEPLOYMENT_TARGET = 8.1; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = wolfssl; @@ -948,7 +947,6 @@ $SRCROOT, $PROJECT_DIR/../.., ); - IPHONEOS_DEPLOYMENT_TARGET = 8.1; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = wolfssl; diff --git a/IDE/iOS/wolfssl.xcodeproj/project.pbxproj b/IDE/iOS/wolfssl.xcodeproj/project.pbxproj index 0de405b73..14fd4e4d6 100644 --- a/IDE/iOS/wolfssl.xcodeproj/project.pbxproj +++ b/IDE/iOS/wolfssl.xcodeproj/project.pbxproj @@ -283,7 +283,7 @@ isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = include/wolfssl; - dstSubfolderSpec = 7; + dstSubfolderSpec = 16; files = ( 521646C41A8A7FE10062516A /* callbacks.h in CopyFiles */, 521646C51A8A7FE10062516A /* certs_test.h in CopyFiles */, diff --git a/README b/README index f5c77acc5..d9e982f38 100644 --- a/README +++ b/README @@ -37,20 +37,7 @@ before calling wolfSSL_new(); Though it's not recommended. - GNU Binutils 2.24 ld has problems with some debug builds, to fix an ld error add -fdebug-types-section to C_EXTRA_FLAGS -wolfSSL (Formerly CyaSSL) Release 3.4.8 (04/06/2015) - -Release 3.4.8 of wolfSSL has bug fixes and new features including: - -- FIPS version submitted for iOS. -- Max Strength build that only allows TLSv1.2, AEAD ciphers, and PFS. -- Improvements to usage of time code. -- Improvements to VS solution files. - -See INSTALL file for build instructions. -More info can be found on-line at //http://wolfssl.com/yaSSL/Docs.html - - - *****************wolfSSL (Formerly CyaSSL) Release 3.4.6 (03/30/2015) +wolfSSL (Formerly CyaSSL) Release 3.4.6 (03/30/2015) Release 3.4.6 of wolfSSL has bug fixes and new features including: diff --git a/README.md b/README.md index a490ac2ff..59c77e37c 100644 --- a/README.md +++ b/README.md @@ -38,19 +38,6 @@ before calling wolfSSL_new(); Though it's not recommended. - GNU Binutils 2.24 ld has problems with some debug builds, to fix an ld error add -fdebug-types-section to C_EXTRA_FLAGS -#wolfSSL (Formerly CyaSSL) Release 3.4.8 (04/06/2015) - -##Release 3.4.8 of wolfSSL has bug fixes and new features including: - -- FIPS version submitted for iOS. -- Max Strength build that only allows TLSv1.2, AEAD ciphers, and PFS. -- Improvements to usage of time code. -- Improvements to VS solution files. - -See INSTALL file for build instructions. -More info can be found on-line at //http://wolfssl.com/yaSSL/Docs.html - - #wolfSSL (Formerly CyaSSL) Release 3.4.6 (03/30/2015) ##Release 3.4.6 of wolfSSL has bug fixes and new features including: diff --git a/configure.ac b/configure.ac index cdad2c153..45a687368 100644 --- a/configure.ac +++ b/configure.ac @@ -6,7 +6,7 @@ # # -AC_INIT([wolfssl],[3.4.8],[https://github.com/wolfssl/wolfssl/issues],[wolfssl],[http://www.wolfssl.com]) +AC_INIT([wolfssl],[3.4.7],[https://github.com/wolfssl/wolfssl/issues],[wolfssl],[http://www.wolfssl.com]) AC_CONFIG_AUX_DIR([build-aux]) diff --git a/examples/client/client.vcxproj b/examples/client/client.vcxproj index dec191d7a..4442c56fd 100644 --- a/examples/client/client.vcxproj +++ b/examples/client/client.vcxproj @@ -9,22 +9,6 @@ Debug x64 - - DLL Debug - Win32 - - - DLL Debug - x64 - - - DLL Release - Win32 - - - DLL Release - x64 - Release Win32 @@ -46,114 +30,56 @@ Unicode true - - Application - v110 - Unicode - true - Application v110 Unicode true - - Application - v110 - Unicode - true - Application v110 Unicode - - Application - v110 - Unicode - Application v110 Unicode - - Application - v110 - Unicode - - - - - - - - - - - - - <_ProjectFileVersion>11.0.61030.0 $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ - true - - - $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ + $(Configuration)\ true true - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ - - - true - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ - false - - - $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ + $(Configuration)\ false false - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ - - - false - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ @@ -175,26 +101,6 @@ false - - - Disabled - ../../;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - - - Level3 - EditAndContinue - - - Ws2_32.lib;%(AdditionalDependencies) - true - Console - MachineX86 - - Disabled @@ -213,24 +119,6 @@ Console - - - Disabled - ../../;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebugDLL - - - Level3 - ProgramDatabase - - - Ws2_32.lib;%(AdditionalDependencies) - true - Console - - MaxSpeed @@ -253,28 +141,6 @@ false - - - MaxSpeed - true - ../../;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - - Level3 - ProgramDatabase - - - Ws2_32.lib;%(AdditionalDependencies) - true - Console - true - true - MachineX86 - - MaxSpeed @@ -296,27 +162,6 @@ true - - - MaxSpeed - true - ../../;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - - Level3 - ProgramDatabase - - - Ws2_32.lib;%(AdditionalDependencies) - true - Console - true - true - - diff --git a/examples/echoclient/echoclient.vcxproj b/examples/echoclient/echoclient.vcxproj index a3a60545a..342bb9ca5 100644 --- a/examples/echoclient/echoclient.vcxproj +++ b/examples/echoclient/echoclient.vcxproj @@ -9,22 +9,6 @@ Debug x64 - - DLL Debug - Win32 - - - DLL Debug - x64 - - - DLL Release - Win32 - - - DLL Release - x64 - Release Win32 @@ -46,114 +30,56 @@ Unicode true - - Application - v110 - Unicode - true - Application v110 Unicode true - - Application - v110 - Unicode - true - Application v110 Unicode - - Application - v110 - Unicode - Application v110 Unicode - - Application - v110 - Unicode - - - - - - - - - - - - - <_ProjectFileVersion>11.0.61030.0 $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ - true - - - $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ + $(Configuration)\ true true - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ - - - true - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ - false - - - $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ + $(Configuration)\ false false - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ - - - false - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ @@ -176,26 +102,6 @@ - - - Disabled - ../../;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - - - Level3 - EditAndContinue - - - Ws2_32.lib;%(AdditionalDependencies) - true - Console - MachineX86 - - Disabled @@ -214,24 +120,6 @@ Console - - - Disabled - ../../;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebugDLL - - - Level3 - ProgramDatabase - - - Ws2_32.lib;%(AdditionalDependencies) - true - Console - - MaxSpeed @@ -255,28 +143,6 @@ - - - MaxSpeed - true - ../../;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - - Level3 - ProgramDatabase - - - Ws2_32.lib;%(AdditionalDependencies) - true - Console - true - true - MachineX86 - - MaxSpeed @@ -298,27 +164,6 @@ true - - - MaxSpeed - true - ../../;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - - Level3 - ProgramDatabase - - - Ws2_32.lib;%(AdditionalDependencies) - true - Console - true - true - - diff --git a/examples/echoserver/echoserver.vcxproj b/examples/echoserver/echoserver.vcxproj index 096ba75c6..a9c210cbd 100644 --- a/examples/echoserver/echoserver.vcxproj +++ b/examples/echoserver/echoserver.vcxproj @@ -9,22 +9,6 @@ Debug x64 - - DLL Debug - Win32 - - - DLL Debug - x64 - - - DLL Release - Win32 - - - DLL Release - x64 - Release Win32 @@ -46,114 +30,56 @@ Unicode true - - Application - v110 - Unicode - true - Application v110 Unicode true - - Application - v110 - Unicode - true - Application v110 Unicode - - Application - v110 - Unicode - Application v110 Unicode - - Application - v110 - Unicode - - - - - - - - - - - - - <_ProjectFileVersion>11.0.61030.0 $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ - true - - - $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ + $(Configuration)\ true true - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ - - - true - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ - false - - - $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ + $(Configuration)\ false false - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ - - - false - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ @@ -176,26 +102,6 @@ - - - Disabled - ../../;%(AdditionalIncludeDirectories) - USE_ANY_ADDR;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - - - Level3 - EditAndContinue - - - Ws2_32.lib;%(AdditionalDependencies) - true - Console - MachineX86 - - Disabled @@ -214,24 +120,6 @@ Console - - - Disabled - ../../;%(AdditionalIncludeDirectories) - USE_ANY_ADDR;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebugDLL - - - Level3 - ProgramDatabase - - - Ws2_32.lib;%(AdditionalDependencies) - true - Console - - MaxSpeed @@ -254,28 +142,6 @@ false - - - MaxSpeed - true - ../../;%(AdditionalIncludeDirectories) - USE_ANY_ADDR;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - - Level3 - ProgramDatabase - - - Ws2_32.lib;%(AdditionalDependencies) - true - Console - true - true - MachineX86 - - MaxSpeed @@ -297,27 +163,6 @@ true - - - MaxSpeed - true - ../../;%(AdditionalIncludeDirectories) - USE_ANY_ADDR;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - - Level3 - ProgramDatabase - - - Ws2_32.lib;%(AdditionalDependencies) - true - Console - true - true - - diff --git a/examples/server/server.vcxproj b/examples/server/server.vcxproj index f6b53fc57..dc31fd672 100644 --- a/examples/server/server.vcxproj +++ b/examples/server/server.vcxproj @@ -9,22 +9,6 @@ Debug x64 - - DLL Debug - Win32 - - - DLL Debug - x64 - - - DLL Release - Win32 - - - DLL Release - x64 - Release Win32 @@ -46,114 +30,56 @@ Unicode true - - Application - v110 - Unicode - true - Application v110 Unicode true - - Application - v110 - Unicode - true - Application v110 Unicode - - Application - v110 - Unicode - Application v110 Unicode - - Application - v110 - Unicode - - - - - - - - - - - - - <_ProjectFileVersion>11.0.61030.0 $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ - true - - - $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ + $(Configuration)\ true true - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ - - - true - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ - false - - - $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ + $(Configuration)\ false false - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ - - - false - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ @@ -176,26 +102,6 @@ - - - Disabled - ../../;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - - - Level3 - EditAndContinue - - - Ws2_32.lib;%(AdditionalDependencies) - true - Console - MachineX86 - - Disabled @@ -214,24 +120,6 @@ Console - - - Disabled - ../../;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebugDLL - - - Level3 - ProgramDatabase - - - Ws2_32.lib;%(AdditionalDependencies) - true - Console - - MaxSpeed @@ -255,28 +143,6 @@ - - - MaxSpeed - true - ../../;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - - Level3 - ProgramDatabase - - - Ws2_32.lib;%(AdditionalDependencies) - true - Console - true - true - MachineX86 - - MaxSpeed @@ -298,27 +164,6 @@ true - - - MaxSpeed - true - ../../;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - - Level3 - ProgramDatabase - - - Ws2_32.lib;%(AdditionalDependencies) - true - Console - true - true - - diff --git a/src/internal.c b/src/internal.c index 39e3beb90..4f644fd2f 100644 --- a/src/internal.c +++ b/src/internal.c @@ -7589,8 +7589,6 @@ startScr: if (ssl->error == SOCKET_ERROR_E) { if (ssl->options.connReset || ssl->options.isClosed) { WOLFSSL_MSG("Peer reset or closed, connection done"); - ssl->error = SOCKET_PEER_CLOSED_E; - WOLFSSL_ERROR(ssl->error); return 0; /* peer reset or closed */ } } @@ -8004,12 +8002,6 @@ const char* wolfSSL_ERR_reason_error_string(unsigned long e) case DUPLICATE_MSG_E: return "Duplicate HandShake message Error"; - case SNI_UNSUPPORTED: - return "Protocol version does not support SNI Error"; - - case SOCKET_PEER_CLOSED_E: - return "Peer closed underlying transport Error"; - default : return "unknown error number"; } diff --git a/sslSniffer/sslSniffer.vcxproj b/sslSniffer/sslSniffer.vcxproj index 56404e997..7419737c1 100644 --- a/sslSniffer/sslSniffer.vcxproj +++ b/sslSniffer/sslSniffer.vcxproj @@ -67,23 +67,19 @@ $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ + $(Configuration)\ true true - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ + $(Configuration)\ false false - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ @@ -170,7 +166,7 @@ - + diff --git a/support/wolfssl.pc b/support/wolfssl.pc index c07ae3ea2..1265e7ce0 100644 --- a/support/wolfssl.pc +++ b/support/wolfssl.pc @@ -5,6 +5,6 @@ includedir=${prefix}/include Name: wolfssl Description: wolfssl C library. -Version: 3.4.8 +Version: 3.4.7 Libs: -L${libdir} -lwolfssl Cflags: -I${includedir} diff --git a/testsuite/testsuite.vcxproj b/testsuite/testsuite.vcxproj index 484a87584..f7d5f16b5 100644 --- a/testsuite/testsuite.vcxproj +++ b/testsuite/testsuite.vcxproj @@ -9,22 +9,6 @@ Debug x64 - - DLL Debug - Win32 - - - DLL Debug - x64 - - - DLL Release - Win32 - - - DLL Release - x64 - Release Win32 @@ -46,114 +30,56 @@ Unicode true - - Application - v110 - Unicode - true - Application v110 Unicode true - - Application - v110 - Unicode - true - Application v110 Unicode - - Application - v110 - Unicode - Application v110 Unicode - - Application - v110 - Unicode - - - - - - - - - - - - - <_ProjectFileVersion>11.0.61030.0 $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ - true - - - $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ + $(Configuration)\ true true - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ - - - true - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ - false - - - $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ + $(Configuration)\ false false - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ - - - false - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ @@ -175,26 +101,6 @@ false - - - Disabled - ../;%(AdditionalIncludeDirectories) - NO_MAIN_DRIVER;WOLFSSL_RIPEMD;WOLFSSL_SHA512;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - - - Level3 - EditAndContinue - - - Ws2_32.lib;%(AdditionalDependencies) - true - Console - MachineX86 - - Disabled @@ -213,24 +119,6 @@ Console - - - Disabled - ../;%(AdditionalIncludeDirectories) - NO_MAIN_DRIVER;WOLFSSL_RIPEMD;WOLFSSL_SHA512;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebugDLL - - - Level3 - ProgramDatabase - - - Ws2_32.lib;%(AdditionalDependencies) - true - Console - - MaxSpeed @@ -253,28 +141,6 @@ false - - - MaxSpeed - true - ../;%(AdditionalIncludeDirectories) - NO_MAIN_DRIVER;WOLFSSL_RIPEMD;WOLFSSL_SHA512;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - - Level3 - ProgramDatabase - - - Ws2_32.lib;%(AdditionalDependencies) - true - Console - true - true - MachineX86 - - MaxSpeed @@ -296,27 +162,6 @@ true - - - MaxSpeed - true - ../;%(AdditionalIncludeDirectories) - NO_MAIN_DRIVER;WOLFSSL_RIPEMD;WOLFSSL_SHA512;OPENSSL_EXTRA;NO_PSK;WOLFSSL_DLL;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - - Level3 - ProgramDatabase - - - Ws2_32.lib;%(AdditionalDependencies) - true - Console - true - true - - diff --git a/wolfssl.vcxproj b/wolfssl.vcxproj index 8a95297e1..cf057198a 100644 --- a/wolfssl.vcxproj +++ b/wolfssl.vcxproj @@ -9,22 +9,6 @@ Debug x64 - - DLL Debug - Win32 - - - DLL Debug - x64 - - - DLL Release - Win32 - - - DLL Release - x64 - Release Win32 @@ -46,104 +30,51 @@ Unicode true - - DynamicLibrary - v110 - Unicode - true - StaticLibrary v110 Unicode true - - DynamicLibrary - v110 - Unicode - true - StaticLibrary v110 Unicode - - DynamicLibrary - v110 - Unicode - StaticLibrary v110 Unicode - - DynamicLibrary - v110 - Unicode - - - - - - - - - - - - - - - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ - - - $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ - - - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ + + <_ProjectFileVersion>11.0.61030.0 $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ + $(Configuration)\ - - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ - - + + $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ - - - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ - - - $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ + $(Configuration)\ + Disabled @@ -158,26 +89,6 @@ 4206;4214;4706;%(DisableSpecificWarnings) - - - Disabled - ./;%(AdditionalIncludeDirectories) - OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - - - Level4 - EditAndContinue - 4206;4214;4706;%(DisableSpecificWarnings) - - - ws2_32.lib;%(AdditionalDependencies) - false - true - - Disabled @@ -192,25 +103,6 @@ 4206;4214;4706;%(DisableSpecificWarnings) - - - Disabled - ./;%(AdditionalIncludeDirectories) - OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebugDLL - - - Level4 - ProgramDatabase - 4206;4214;4706;%(DisableSpecificWarnings) - - - ws2_32.lib;%(AdditionalDependencies) - false - true - - MaxSpeed @@ -224,24 +116,6 @@ ProgramDatabase - - - MaxSpeed - true - ./;%(AdditionalIncludeDirectories) - OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - - Level3 - ProgramDatabase - - - ws2_32.lib;%(AdditionalDependencies) - true - - MaxSpeed @@ -256,24 +130,6 @@ ProgramDatabase - - - MaxSpeed - true - ./;%(AdditionalIncludeDirectories) - OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - - Level3 - ProgramDatabase - - - ws2_32.lib;%(AdditionalDependencies) - true - - @@ -313,20 +169,14 @@ false - false ml64.exe /c /Zi /Fo"$(OutDir)%(Filename).obj" %(Identity) - ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) $(OutDir)%(Filename).obj - $(IntDir)%(Filename).obj false - false ml64.exe /c /Zi /Fo"$(OutDir)%(Filename).obj" %(Identity) - ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) $(OutDir)%(Filename).obj - $(IntDir)%(Filename).obj - \ No newline at end of file + diff --git a/wolfssl/error-ssl.h b/wolfssl/error-ssl.h index 0df2edb6e..732240382 100644 --- a/wolfssl/error-ssl.h +++ b/wolfssl/error-ssl.h @@ -127,7 +127,6 @@ enum wolfSSL_ErrorCodes { SANITY_MSG_E = -394, /* Sanity check on msg order error */ DUPLICATE_MSG_E = -395, /* Duplicate message error */ SNI_UNSUPPORTED = -396, /* SSL 3.0 does not support SNI */ - SOCKET_PEER_CLOSED_E = -397, /* Underlying transport closed */ /* add strings to SetErrorString !!!!! */ diff --git a/wolfssl/version.h b/wolfssl/version.h index c76e07613..54e92ffc0 100644 --- a/wolfssl/version.h +++ b/wolfssl/version.h @@ -26,8 +26,8 @@ extern "C" { #endif -#define LIBWOLFSSL_VERSION_STRING "3.4.8" -#define LIBWOLFSSL_VERSION_HEX 0x03004008 +#define LIBWOLFSSL_VERSION_STRING "3.4.7" +#define LIBWOLFSSL_VERSION_HEX 0x03004007 #ifdef __cplusplus } diff --git a/wolfssl/wolfcrypt/visibility.h b/wolfssl/wolfcrypt/visibility.h index 6e41d238f..05fd4754b 100644 --- a/wolfssl/wolfcrypt/visibility.h +++ b/wolfssl/wolfcrypt/visibility.h @@ -47,7 +47,7 @@ #define WOLFSSL_LOCAL __hidden #elif defined(_MSC_VER) #ifdef WOLFSSL_DLL - #define WOLFSSL_API __declspec(dllexport) + #define WOLFSSL_API extern __declspec(dllexport) #else #define WOLFSSL_API #endif @@ -59,7 +59,7 @@ #else /* BUILDING_WOLFSSL */ #if defined(_MSC_VER) #ifdef WOLFSSL_DLL - #define WOLFSSL_API __declspec(dllimport) + #define WOLFSSL_API extern __declspec(dllimport) #else #define WOLFSSL_API #endif diff --git a/wolfssl64.sln b/wolfssl64.sln index 5e17787dc..223ad75da 100644 --- a/wolfssl64.sln +++ b/wolfssl64.sln @@ -1,6 +1,6 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2010 +# Visual Studio Express 2012 for Windows Desktop Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wolfssl", "wolfssl.vcxproj", "{73973223-5EE8-41CA-8E88-1D60E89A237B}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testsuite", "testsuite\testsuite.vcxproj", "{611E8971-46E0-4D0A-B5A1-632C3B00CB80}" @@ -19,10 +19,6 @@ Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 - DLL Debug|Win32 = DLL Debug|Win32 - DLL Debug|x64 = DLL Debug|x64 - DLL Release|Win32 = DLL Release|Win32 - DLL Release|x64 = DLL Release|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection @@ -31,14 +27,6 @@ Global {73973223-5EE8-41CA-8E88-1D60E89A237B}.Debug|Win32.Build.0 = Debug|Win32 {73973223-5EE8-41CA-8E88-1D60E89A237B}.Debug|x64.ActiveCfg = Debug|x64 {73973223-5EE8-41CA-8E88-1D60E89A237B}.Debug|x64.Build.0 = Debug|x64 - {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|x64.Build.0 = DLL Release|x64 {73973223-5EE8-41CA-8E88-1D60E89A237B}.Release|Win32.ActiveCfg = Release|Win32 {73973223-5EE8-41CA-8E88-1D60E89A237B}.Release|Win32.Build.0 = Release|Win32 {73973223-5EE8-41CA-8E88-1D60E89A237B}.Release|x64.ActiveCfg = Release|x64 @@ -47,14 +35,6 @@ Global {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.Debug|Win32.Build.0 = Debug|Win32 {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.Debug|x64.ActiveCfg = Debug|x64 {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.Debug|x64.Build.0 = Debug|x64 - {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.DLL Release|x64.Build.0 = DLL Release|x64 {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.Release|Win32.ActiveCfg = Release|Win32 {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.Release|Win32.Build.0 = Release|Win32 {611E8971-46E0-4D0A-B5A1-632C3B00CB80}.Release|x64.ActiveCfg = Release|x64 @@ -63,10 +43,6 @@ Global {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.Debug|Win32.Build.0 = Debug|Win32 {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.Debug|x64.ActiveCfg = Debug|x64 {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.Debug|x64.Build.0 = Debug|x64 - {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.DLL Debug|Win32.ActiveCfg = Debug|Win32 - {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.DLL Debug|x64.ActiveCfg = Debug|x64 - {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.DLL Release|Win32.ActiveCfg = Release|Win32 - {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.DLL Release|x64.ActiveCfg = Release|x64 {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.Release|Win32.ActiveCfg = Release|Win32 {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.Release|Win32.Build.0 = Release|Win32 {34FAE5A6-2B0F-4B55-86FE-0C43E4810F4D}.Release|x64.ActiveCfg = Release|x64 @@ -75,14 +51,6 @@ Global {07D97C48-E08F-4E34-9F67-3064039FF2CB}.Debug|Win32.Build.0 = Debug|Win32 {07D97C48-E08F-4E34-9F67-3064039FF2CB}.Debug|x64.ActiveCfg = Debug|x64 {07D97C48-E08F-4E34-9F67-3064039FF2CB}.Debug|x64.Build.0 = Debug|x64 - {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {07D97C48-E08F-4E34-9F67-3064039FF2CB}.DLL Release|x64.Build.0 = DLL Release|x64 {07D97C48-E08F-4E34-9F67-3064039FF2CB}.Release|Win32.ActiveCfg = Release|Win32 {07D97C48-E08F-4E34-9F67-3064039FF2CB}.Release|Win32.Build.0 = Release|Win32 {07D97C48-E08F-4E34-9F67-3064039FF2CB}.Release|x64.ActiveCfg = Release|x64 @@ -91,14 +59,6 @@ Global {8362A816-C5DC-4E22-B5C5-9E6806387073}.Debug|Win32.Build.0 = Debug|Win32 {8362A816-C5DC-4E22-B5C5-9E6806387073}.Debug|x64.ActiveCfg = Debug|x64 {8362A816-C5DC-4E22-B5C5-9E6806387073}.Debug|x64.Build.0 = Debug|x64 - {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {8362A816-C5DC-4E22-B5C5-9E6806387073}.DLL Release|x64.Build.0 = DLL Release|x64 {8362A816-C5DC-4E22-B5C5-9E6806387073}.Release|Win32.ActiveCfg = Release|Win32 {8362A816-C5DC-4E22-B5C5-9E6806387073}.Release|Win32.Build.0 = Release|Win32 {8362A816-C5DC-4E22-B5C5-9E6806387073}.Release|x64.ActiveCfg = Release|x64 @@ -107,14 +67,6 @@ Global {3ADE9549-582D-4D8E-9826-B172197A7959}.Debug|Win32.Build.0 = Debug|Win32 {3ADE9549-582D-4D8E-9826-B172197A7959}.Debug|x64.ActiveCfg = Debug|x64 {3ADE9549-582D-4D8E-9826-B172197A7959}.Debug|x64.Build.0 = Debug|x64 - {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {3ADE9549-582D-4D8E-9826-B172197A7959}.DLL Release|x64.Build.0 = DLL Release|x64 {3ADE9549-582D-4D8E-9826-B172197A7959}.Release|Win32.ActiveCfg = Release|Win32 {3ADE9549-582D-4D8E-9826-B172197A7959}.Release|Win32.Build.0 = Release|Win32 {3ADE9549-582D-4D8E-9826-B172197A7959}.Release|x64.ActiveCfg = Release|x64 @@ -123,14 +75,6 @@ Global {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.Debug|Win32.Build.0 = Debug|Win32 {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.Debug|x64.ActiveCfg = Debug|x64 {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.Debug|x64.Build.0 = Debug|x64 - {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 - {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 - {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 - {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Debug|x64.Build.0 = DLL Debug|x64 - {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 - {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Release|Win32.Build.0 = DLL Release|Win32 - {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Release|x64.ActiveCfg = DLL Release|x64 - {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.DLL Release|x64.Build.0 = DLL Release|x64 {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.Release|Win32.ActiveCfg = Release|Win32 {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.Release|Win32.Build.0 = Release|Win32 {E9FB0BA5-BA46-4A59-A953-39C18CD1DCB1}.Release|x64.ActiveCfg = Release|x64 From b59d922d51b6926188b5a342485ef3eed3ef432a Mon Sep 17 00:00:00 2001 From: toddouska Date: Wed, 8 Apr 2015 11:22:22 -0700 Subject: [PATCH 033/350] on send echde server_key_exchange only do hash(es) required --- src/internal.c | 231 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 165 insertions(+), 66 deletions(-) diff --git a/src/internal.c b/src/internal.c index ab13a56a5..a4ac9ddda 100644 --- a/src/internal.c +++ b/src/internal.c @@ -11704,6 +11704,20 @@ int DoSessionTicket(WOLFSSL* ssl, #endif word32 expSz = MAX_EXPORT_ECC_SZ; + #ifndef NO_OLD_TLS + byte doMd5 = 0; + byte doSha = 0; + #endif + #ifndef NO_SHA256 + byte doSha256 = 0; + #endif + #ifdef WOLFSSL_SHA384 + byte doSha384 = 0; + #endif + #ifdef WOLFSSL_SHA512 + byte doSha512 = 0; + #endif + if (ssl->specs.static_ecdh) { WOLFSSL_MSG("Using Static ECDH, not sending ServerKeyExchagne"); return 0; @@ -11832,8 +11846,66 @@ int DoSessionTicket(WOLFSSL* ssl, XMEMCPY(output + idx, exportBuf, expSz); idx += expSz; if (IsAtLeastTLSv1_2(ssl)) { + byte setHash = 0; + output[idx++] = ssl->suites->hashAlgo; output[idx++] = ssl->suites->sigAlgo; + + switch (ssl->suites->hashAlgo) { + case sha512_mac: + #ifdef WOLFSSL_SHA512 + doSha512 = 1; + setHash = 1; + #endif + break; + + case sha384_mac: + #ifdef WOLFSSL_SHA384 + doSha384 = 1; + setHash = 1; + #endif + break; + + case sha256_mac: + #ifndef NO_SHA256 + doSha256 = 1; + setHash = 1; + #endif + break; + + case sha_mac: + #ifndef NO_OLD_TLS + doSha = 1; + setHash = 1; + #endif + break; + + default: + WOLFSSL_MSG("Bad hash sig algo"); + break; + } + + if (setHash == 0) { + #ifndef NO_RSA + wc_FreeRsaKey(&rsaKey); + #endif + wc_ecc_free(&dsaKey); + ERROR_OUT(ALGO_ID_E, done_a); + } + } else { + /* only using sha and md5 for rsa */ + #ifndef NO_OLD_TLS + doSha = 1; + if (ssl->suites->sigAlgo == rsa_sa_algo) { + doMd5 = 1; + } + #else + #ifndef NO_RSA + wc_FreeRsaKey(&rsaKey); + #endif + wc_ecc_free(&dsaKey); + ERROR_OUT(ALGO_ID_E, done_a); + #endif } /* Signtaure length will be written later, when we're sure what it @@ -11899,95 +11971,115 @@ int DoSessionTicket(WOLFSSL* ssl, #ifndef NO_OLD_TLS /* md5 */ #ifdef WOLFSSL_SMALL_STACK - md5 = (Md5*)XMALLOC(sizeof(Md5), NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (md5 == NULL) - ERROR_OUT(MEMORY_E, done_a2); + if (doMd5) { + md5 = (Md5*)XMALLOC(sizeof(Md5), NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (md5 == NULL) + ERROR_OUT(MEMORY_E, done_a2); + } #endif - wc_InitMd5(md5); - wc_Md5Update(md5, ssl->arrays->clientRandom, RAN_LEN); - wc_Md5Update(md5, ssl->arrays->serverRandom, RAN_LEN); - wc_Md5Update(md5, output + preSigIdx, preSigSz); - wc_Md5Final(md5, hash); - + if (doMd5) { + wc_InitMd5(md5); + wc_Md5Update(md5, ssl->arrays->clientRandom, RAN_LEN); + wc_Md5Update(md5, ssl->arrays->serverRandom, RAN_LEN); + wc_Md5Update(md5, output + preSigIdx, preSigSz); + wc_Md5Final(md5, hash); + } /* sha */ #ifdef WOLFSSL_SMALL_STACK - sha = (Sha*)XMALLOC(sizeof(Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (sha == NULL) - ERROR_OUT(MEMORY_E, done_a2); + if (doSha) { + sha = (Sha*)XMALLOC(sizeof(Sha), NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (sha == NULL) + ERROR_OUT(MEMORY_E, done_a2); + } #endif - ret = wc_InitSha(sha); - if (ret != 0) - goto done_a2; - wc_ShaUpdate(sha, ssl->arrays->clientRandom, RAN_LEN); - wc_ShaUpdate(sha, ssl->arrays->serverRandom, RAN_LEN); - wc_ShaUpdate(sha, output + preSigIdx, preSigSz); - wc_ShaFinal(sha, &hash[MD5_DIGEST_SIZE]); + if (doSha) { + ret = wc_InitSha(sha); + if (ret != 0) goto done_a2; + wc_ShaUpdate(sha, ssl->arrays->clientRandom, RAN_LEN); + wc_ShaUpdate(sha, ssl->arrays->serverRandom, RAN_LEN); + wc_ShaUpdate(sha, output + preSigIdx, preSigSz); + wc_ShaFinal(sha, &hash[MD5_DIGEST_SIZE]); + } #endif #ifndef NO_SHA256 #ifdef WOLFSSL_SMALL_STACK - sha256 = (Sha256*)XMALLOC(sizeof(Sha256), NULL, - DYNAMIC_TYPE_TMP_BUFFER); - hash256 = (byte*)XMALLOC(SHA256_DIGEST_SIZE, NULL, - DYNAMIC_TYPE_TMP_BUFFER); - if (sha256 == NULL || hash256 == NULL) - ERROR_OUT(MEMORY_E, done_a2); + if (doSha256) { + sha256 = (Sha256*)XMALLOC(sizeof(Sha256), NULL, + DYNAMIC_TYPE_TMP_BUFFER); + hash256 = (byte*)XMALLOC(SHA256_DIGEST_SIZE, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (sha256 == NULL || hash256 == NULL) + ERROR_OUT(MEMORY_E, done_a2); + } #endif - if (!(ret = wc_InitSha256(sha256)) - && !(ret = wc_Sha256Update(sha256, ssl->arrays->clientRandom, - RAN_LEN)) - && !(ret = wc_Sha256Update(sha256, ssl->arrays->serverRandom, - RAN_LEN)) - && !(ret = wc_Sha256Update(sha256, output + preSigIdx, preSigSz))) - ret = wc_Sha256Final(sha256, hash256); + if (doSha256) { + if (!(ret = wc_InitSha256(sha256)) + && !(ret = wc_Sha256Update(sha256, + ssl->arrays->clientRandom, RAN_LEN)) + && !(ret = wc_Sha256Update(sha256, + ssl->arrays->serverRandom, RAN_LEN)) + && !(ret = wc_Sha256Update(sha256, + output + preSigIdx, preSigSz))) + ret = wc_Sha256Final(sha256, hash256); - if (ret != 0) - goto done_a2; + if (ret != 0) goto done_a2; + } #endif #ifdef WOLFSSL_SHA384 #ifdef WOLFSSL_SMALL_STACK - sha384 = (Sha384*)XMALLOC(sizeof(Sha384), NULL, - DYNAMIC_TYPE_TMP_BUFFER); - hash384 = (byte*)XMALLOC(SHA384_DIGEST_SIZE, NULL, - DYNAMIC_TYPE_TMP_BUFFER); - if (sha384 == NULL || hash384 == NULL) - ERROR_OUT(MEMORY_E, done_a2); + if (doSha384) { + sha384 = (Sha384*)XMALLOC(sizeof(Sha384), NULL, + DYNAMIC_TYPE_TMP_BUFFER); + hash384 = (byte*)XMALLOC(SHA384_DIGEST_SIZE, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (sha384 == NULL || hash384 == NULL) + ERROR_OUT(MEMORY_E, done_a2); + } #endif - if (!(ret = wc_InitSha384(sha384)) - && !(ret = wc_Sha384Update(sha384, ssl->arrays->clientRandom, - RAN_LEN)) - && !(ret = wc_Sha384Update(sha384, ssl->arrays->serverRandom, - RAN_LEN)) - && !(ret = wc_Sha384Update(sha384, output + preSigIdx, preSigSz))) - ret = wc_Sha384Final(sha384, hash384); + if (doSha384) { + if (!(ret = wc_InitSha384(sha384)) + && !(ret = wc_Sha384Update(sha384, + ssl->arrays->clientRandom, RAN_LEN)) + && !(ret = wc_Sha384Update(sha384, + ssl->arrays->serverRandom, RAN_LEN)) + && !(ret = wc_Sha384Update(sha384, + output + preSigIdx, preSigSz))) + ret = wc_Sha384Final(sha384, hash384); - if (ret != 0) - goto done_a2; + if (ret != 0) goto done_a2; + } #endif #ifdef WOLFSSL_SHA512 #ifdef WOLFSSL_SMALL_STACK - sha512 = (Sha512*)XMALLOC(sizeof(Sha512), NULL, - DYNAMIC_TYPE_TMP_BUFFER); - hash512 = (byte*)XMALLOC(SHA512_DIGEST_SIZE, NULL, - DYNAMIC_TYPE_TMP_BUFFER); - if (sha512 == NULL || hash512 == NULL) - ERROR_OUT(MEMORY_E, done_a2); + if (doSha512) { + sha512 = (Sha512*)XMALLOC(sizeof(Sha512), NULL, + DYNAMIC_TYPE_TMP_BUFFER); + hash512 = (byte*)XMALLOC(SHA512_DIGEST_SIZE, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (sha512 == NULL || hash512 == NULL) + ERROR_OUT(MEMORY_E, done_a2); + } #endif - if (!(ret = wc_InitSha512(sha512)) - && !(ret = wc_Sha512Update(sha512, ssl->arrays->clientRandom, - RAN_LEN)) - && !(ret = wc_Sha512Update(sha512, ssl->arrays->serverRandom, - RAN_LEN)) - && !(ret = wc_Sha512Update(sha512, output + preSigIdx, preSigSz))) - ret = wc_Sha512Final(sha512, hash512); + if (doSha512) { + if (!(ret = wc_InitSha512(sha512)) + && !(ret = wc_Sha512Update(sha512, + ssl->arrays->clientRandom, RAN_LEN)) + && !(ret = wc_Sha512Update(sha512, + ssl->arrays->serverRandom, RAN_LEN)) + && !(ret = wc_Sha512Update(sha512, + output + preSigIdx, preSigSz))) + ret = wc_Sha512Final(sha512, hash512); - if (ret != 0) - goto done_a2; + if (ret != 0) goto done_a2; + } #endif #ifndef NO_RSA @@ -12040,8 +12132,15 @@ int DoSessionTicket(WOLFSSL* ssl, #endif } - signSz = wc_EncodeSignature(encodedSig, digest, digestSz, - typeH); + if (digest == NULL) { + #ifndef NO_RSA + wc_FreeRsaKey(&rsaKey); + #endif + wc_ecc_free(&dsaKey); + ERROR_OUT(ALGO_ID_E, done_a2); + } + signSz = wc_EncodeSignature(encodedSig, digest, + digestSz, typeH); signBuffer = encodedSig; } /* write sig size here */ From 86f2b9a98f2f07eef47594f257cf65889f0c956a Mon Sep 17 00:00:00 2001 From: toddouska Date: Wed, 8 Apr 2015 13:29:25 -0700 Subject: [PATCH 034/350] turn off DTLSv1 functions for disable old tls --- examples/client/client.c | 2 ++ examples/echoclient/echoclient.c | 2 +- examples/echoserver/echoserver.c | 2 +- examples/server/server.c | 2 ++ src/ssl.c | 14 ++++++++++---- tests/api.c | 6 ++++-- 6 files changed, 20 insertions(+), 8 deletions(-) diff --git a/examples/client/client.c b/examples/client/client.c index d7a5e82e9..cee776f57 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -495,9 +495,11 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) #endif #ifdef WOLFSSL_DTLS + #ifndef NO_OLD_TLS case -1: method = wolfDTLSv1_client_method(); break; + #endif case -2: method = wolfDTLSv1_2_client_method(); diff --git a/examples/echoclient/echoclient.c b/examples/echoclient/echoclient.c index ff754b7e8..594d146cf 100644 --- a/examples/echoclient/echoclient.c +++ b/examples/echoclient/echoclient.c @@ -108,7 +108,7 @@ void echoclient_test(void* args) #endif #if defined(CYASSL_DTLS) - method = DTLSv1_client_method(); + method = DTLSv1_2_client_method(); #elif !defined(NO_TLS) method = CyaSSLv23_client_method(); #else diff --git a/examples/echoserver/echoserver.c b/examples/echoserver/echoserver.c index 49b3933d2..a8b1600dc 100644 --- a/examples/echoserver/echoserver.c +++ b/examples/echoserver/echoserver.c @@ -134,7 +134,7 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args) tcp_listen(&sockfd, &port, useAnyAddr, doDTLS); #if defined(CYASSL_DTLS) - method = CyaDTLSv1_server_method(); + method = CyaDTLSv1_2_server_method(); #elif !defined(NO_TLS) method = CyaSSLv23_server_method(); #else diff --git a/examples/server/server.c b/examples/server/server.c index df248dd6e..17ad6ed48 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -379,9 +379,11 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args) #endif #ifdef CYASSL_DTLS + #ifndef NO_OLD_TLS case -1: method = DTLSv1_server_method(); break; + #endif case -2: method = DTLSv1_2_server_method(); diff --git a/src/ssl.c b/src/ssl.c index d907f443a..f6903707c 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -5037,6 +5037,8 @@ int wolfSSL_dtls_got_timeout(WOLFSSL* ssl) #endif #ifdef WOLFSSL_DTLS + + #ifndef NO_OLD_TLS WOLFSSL_METHOD* wolfDTLSv1_client_method(void) { WOLFSSL_METHOD* method = @@ -5047,6 +5049,7 @@ int wolfSSL_dtls_got_timeout(WOLFSSL* ssl) InitSSL_Method(method, MakeDTLSv1()); return method; } + #endif /* NO_OLD_TLS */ WOLFSSL_METHOD* wolfDTLSv1_2_client_method(void) { @@ -5315,11 +5318,13 @@ int wolfSSL_dtls_got_timeout(WOLFSSL* ssl) #ifdef WOLFSSL_DTLS + + #ifndef NO_OLD_TLS WOLFSSL_METHOD* wolfDTLSv1_server_method(void) { WOLFSSL_METHOD* method = - (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD), 0, - DYNAMIC_TYPE_METHOD); + (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD), + 0, DYNAMIC_TYPE_METHOD); WOLFSSL_ENTER("DTLSv1_server_method"); if (method) { InitSSL_Method(method, MakeDTLSv1()); @@ -5327,12 +5332,13 @@ int wolfSSL_dtls_got_timeout(WOLFSSL* ssl) } return method; } + #endif /* NO_OLD_TLS */ WOLFSSL_METHOD* wolfDTLSv1_2_server_method(void) { WOLFSSL_METHOD* method = - (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD), 0, - DYNAMIC_TYPE_METHOD); + (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD), + 0, DYNAMIC_TYPE_METHOD); WOLFSSL_ENTER("DTLSv1_2_server_method"); if (method) { InitSSL_Method(method, MakeDTLSv1_2()); diff --git a/tests/api.c b/tests/api.c index 6ccd80b7d..216a9addf 100644 --- a/tests/api.c +++ b/tests/api.c @@ -113,8 +113,10 @@ static void test_wolfSSL_Method_Allocators(void) TEST_VALID_METHOD_ALLOCATOR(wolfSSLv23_client_method); #ifdef WOLFSSL_DTLS - TEST_VALID_METHOD_ALLOCATOR(wolfDTLSv1_server_method); - TEST_VALID_METHOD_ALLOCATOR(wolfDTLSv1_client_method); + #ifndef NO_OLD_TLS + TEST_VALID_METHOD_ALLOCATOR(wolfDTLSv1_server_method); + TEST_VALID_METHOD_ALLOCATOR(wolfDTLSv1_client_method); + #endif TEST_VALID_METHOD_ALLOCATOR(wolfDTLSv1_2_server_method); TEST_VALID_METHOD_ALLOCATOR(wolfDTLSv1_2_client_method); #endif From edd6b91b56a4a9dbab8b7932b3bd1b7101f8e14c Mon Sep 17 00:00:00 2001 From: toddouska Date: Thu, 9 Apr 2015 09:58:16 -0700 Subject: [PATCH 035/350] on send dhe server_key_exchange only do hash(es) required --- src/internal.c | 229 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 160 insertions(+), 69 deletions(-) diff --git a/src/internal.c b/src/internal.c index a4ac9ddda..bf89d54a2 100644 --- a/src/internal.c +++ b/src/internal.c @@ -12477,10 +12477,76 @@ int DoSessionTicket(WOLFSSL* ssl, #endif #endif + #ifndef NO_OLD_TLS + byte doMd5 = 0; + byte doSha = 0; + #endif + #ifndef NO_SHA256 + byte doSha256 = 0; + #endif + #ifdef WOLFSSL_SHA384 + byte doSha384 = 0; + #endif + #ifdef WOLFSSL_SHA512 + byte doSha512 = 0; + #endif + /* Add hash/signature algo ID */ if (IsAtLeastTLSv1_2(ssl)) { + byte setHash = 0; + output[idx++] = ssl->suites->hashAlgo; output[idx++] = ssl->suites->sigAlgo; + + switch (ssl->suites->hashAlgo) { + case sha512_mac: + #ifdef WOLFSSL_SHA512 + doSha512 = 1; + setHash = 1; + #endif + break; + + case sha384_mac: + #ifdef WOLFSSL_SHA384 + doSha384 = 1; + setHash = 1; + #endif + break; + + case sha256_mac: + #ifndef NO_SHA256 + doSha256 = 1; + setHash = 1; + #endif + break; + + case sha_mac: + #ifndef NO_OLD_TLS + doSha = 1; + setHash = 1; + #endif + break; + + default: + WOLFSSL_MSG("Bad hash sig algo"); + break; + } + + if (setHash == 0) { + wc_FreeRsaKey(&rsaKey); + return ALGO_ID_E; + } + } else { + /* only using sha and md5 for rsa */ + #ifndef NO_OLD_TLS + doSha = 1; + if (ssl->suites->sigAlgo == rsa_sa_algo) { + doMd5 = 1; + } + #else + wc_FreeRsaKey(&rsaKey); + return ALGO_ID_E; + #endif } /* signature size */ @@ -12500,96 +12566,117 @@ int DoSessionTicket(WOLFSSL* ssl, #ifndef NO_OLD_TLS /* md5 */ #ifdef WOLFSSL_SMALL_STACK - md5 = (Md5*)XMALLOC(sizeof(Md5), NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (md5 == NULL) - ERROR_OUT(MEMORY_E, done_b); + if (doMd5) { + md5 = (Md5*)XMALLOC(sizeof(Md5), NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (md5 == NULL) + ERROR_OUT(MEMORY_E, done_b); + } #endif - wc_InitMd5(md5); - wc_Md5Update(md5, ssl->arrays->clientRandom, RAN_LEN); - wc_Md5Update(md5, ssl->arrays->serverRandom, RAN_LEN); - wc_Md5Update(md5, output + preSigIdx, preSigSz); - wc_Md5Final(md5, hash); + if (doMd5) { + wc_InitMd5(md5); + wc_Md5Update(md5, ssl->arrays->clientRandom, RAN_LEN); + wc_Md5Update(md5, ssl->arrays->serverRandom, RAN_LEN); + wc_Md5Update(md5, output + preSigIdx, preSigSz); + wc_Md5Final(md5, hash); + } /* sha */ #ifdef WOLFSSL_SMALL_STACK - sha = (Sha*)XMALLOC(sizeof(Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (sha == NULL) - ERROR_OUT(MEMORY_E, done_b); + if (doSha) { + sha = (Sha*)XMALLOC(sizeof(Sha), NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (sha == NULL) + ERROR_OUT(MEMORY_E, done_b); + } #endif - if ((ret = wc_InitSha(sha)) != 0) - goto done_b; - - wc_ShaUpdate(sha, ssl->arrays->clientRandom, RAN_LEN); - wc_ShaUpdate(sha, ssl->arrays->serverRandom, RAN_LEN); - wc_ShaUpdate(sha, output + preSigIdx, preSigSz); - wc_ShaFinal(sha, &hash[MD5_DIGEST_SIZE]); + if (doSha) { + if ((ret = wc_InitSha(sha)) != 0) + goto done_b; + wc_ShaUpdate(sha, ssl->arrays->clientRandom, RAN_LEN); + wc_ShaUpdate(sha, ssl->arrays->serverRandom, RAN_LEN); + wc_ShaUpdate(sha, output + preSigIdx, preSigSz); + wc_ShaFinal(sha, &hash[MD5_DIGEST_SIZE]); + } #endif #ifndef NO_SHA256 #ifdef WOLFSSL_SMALL_STACK - sha256 = (Sha256*)XMALLOC(sizeof(Sha256), NULL, - DYNAMIC_TYPE_TMP_BUFFER); - hash256 = (byte*)XMALLOC(SHA256_DIGEST_SIZE, NULL, - DYNAMIC_TYPE_TMP_BUFFER); - if (sha256 == NULL || hash256 == NULL) - ERROR_OUT(MEMORY_E, done_b); + if (doSha256) { + sha256 = (Sha256*)XMALLOC(sizeof(Sha256), NULL, + DYNAMIC_TYPE_TMP_BUFFER); + hash256 = (byte*)XMALLOC(SHA256_DIGEST_SIZE, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (sha256 == NULL || hash256 == NULL) + ERROR_OUT(MEMORY_E, done_b); + } #endif - if (!(ret = wc_InitSha256(sha256)) - && !(ret = wc_Sha256Update(sha256, ssl->arrays->clientRandom, - RAN_LEN)) - && !(ret = wc_Sha256Update(sha256, ssl->arrays->serverRandom, - RAN_LEN)) - && !(ret = wc_Sha256Update(sha256, output + preSigIdx, preSigSz))) - ret = wc_Sha256Final(sha256, hash256); + if (doSha256) { + if (!(ret = wc_InitSha256(sha256)) + && !(ret = wc_Sha256Update(sha256, + ssl->arrays->clientRandom, RAN_LEN)) + && !(ret = wc_Sha256Update(sha256, + ssl->arrays->serverRandom, RAN_LEN)) + && !(ret = wc_Sha256Update(sha256, + output + preSigIdx, preSigSz))) + ret = wc_Sha256Final(sha256, hash256); - if (ret != 0) - goto done_b; + if (ret != 0) goto done_b; + } #endif #ifdef WOLFSSL_SHA384 #ifdef WOLFSSL_SMALL_STACK - sha384 = (Sha384*)XMALLOC(sizeof(Sha384), NULL, - DYNAMIC_TYPE_TMP_BUFFER); - hash384 = (byte*)XMALLOC(SHA384_DIGEST_SIZE, NULL, - DYNAMIC_TYPE_TMP_BUFFER); - if (sha384 == NULL || hash384 == NULL) - ERROR_OUT(MEMORY_E, done_b); + if (doSha384) { + sha384 = (Sha384*)XMALLOC(sizeof(Sha384), NULL, + DYNAMIC_TYPE_TMP_BUFFER); + hash384 = (byte*)XMALLOC(SHA384_DIGEST_SIZE, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (sha384 == NULL || hash384 == NULL) + ERROR_OUT(MEMORY_E, done_b); + } #endif - if (!(ret = wc_InitSha384(sha384)) - && !(ret = wc_Sha384Update(sha384, ssl->arrays->clientRandom, - RAN_LEN)) - && !(ret = wc_Sha384Update(sha384, ssl->arrays->serverRandom, - RAN_LEN)) - && !(ret = wc_Sha384Update(sha384, output + preSigIdx, preSigSz))) - ret = wc_Sha384Final(sha384, hash384); + if (doSha384) { + if (!(ret = wc_InitSha384(sha384)) + && !(ret = wc_Sha384Update(sha384, + ssl->arrays->clientRandom, RAN_LEN)) + && !(ret = wc_Sha384Update(sha384, + ssl->arrays->serverRandom, RAN_LEN)) + && !(ret = wc_Sha384Update(sha384, + output + preSigIdx, preSigSz))) + ret = wc_Sha384Final(sha384, hash384); - if (ret != 0) - goto done_b; + if (ret != 0) goto done_b; + } #endif #ifdef WOLFSSL_SHA512 #ifdef WOLFSSL_SMALL_STACK - sha512 = (Sha512*)XMALLOC(sizeof(Sha512), NULL, - DYNAMIC_TYPE_TMP_BUFFER); - hash512 = (byte*)XMALLOC(SHA512_DIGEST_SIZE, NULL, - DYNAMIC_TYPE_TMP_BUFFER); - if (sha512 == NULL || hash512 == NULL) - ERROR_OUT(MEMORY_E, done_b); + if (doSha512) { + sha512 = (Sha512*)XMALLOC(sizeof(Sha512), NULL, + DYNAMIC_TYPE_TMP_BUFFER); + hash512 = (byte*)XMALLOC(SHA512_DIGEST_SIZE, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (sha512 == NULL || hash512 == NULL) + ERROR_OUT(MEMORY_E, done_b); + } #endif - if (!(ret = wc_InitSha512(sha512)) - && !(ret = wc_Sha512Update(sha512, ssl->arrays->clientRandom, - RAN_LEN)) - && !(ret = wc_Sha512Update(sha512, ssl->arrays->serverRandom, - RAN_LEN)) - && !(ret = wc_Sha512Update(sha512, output + preSigIdx, preSigSz))) - ret = wc_Sha512Final(sha512, hash512); + if (doSha512) { + if (!(ret = wc_InitSha512(sha512)) + && !(ret = wc_Sha512Update(sha512, + ssl->arrays->clientRandom, RAN_LEN)) + && !(ret = wc_Sha512Update(sha512, + ssl->arrays->serverRandom, RAN_LEN)) + && !(ret = wc_Sha512Update(sha512, + output + preSigIdx, preSigSz))) + ret = wc_Sha512Final(sha512, hash512); - if (ret != 0) - goto done_b; + if (ret != 0) goto done_b; + } #endif #ifndef NO_RSA @@ -12642,11 +12729,15 @@ int DoSessionTicket(WOLFSSL* ssl, #endif } - signSz = wc_EncodeSignature(encodedSig, digest, digestSz, - typeH); - signBuffer = encodedSig; + if (digest == NULL) { + ret = ALGO_ID_E; + } else { + signSz = wc_EncodeSignature(encodedSig, digest, + digestSz, typeH); + signBuffer = encodedSig; + } } - if (doUserRsa) { + if (doUserRsa && ret == 0) { #ifdef HAVE_PK_CALLBACKS word32 ioLen = sigSz; ret = ssl->ctx->RsaSignCb(ssl, signBuffer, signSz, @@ -12655,10 +12746,10 @@ int DoSessionTicket(WOLFSSL* ssl, ssl->buffers.key.length, ssl->RsaSignCtx); #endif - } - else + } else if (ret == 0) { ret = wc_RsaSSL_Sign(signBuffer, signSz, output + idx, sigSz, &rsaKey, ssl->rng); + } wc_FreeRsaKey(&rsaKey); From c1adae2fe42e7eb563d259d8c69a8cb202e64d86 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Fri, 10 Apr 2015 08:06:59 -0700 Subject: [PATCH 036/350] moved FOURK_BUF constant to top of file --- wolfcrypt/test/test.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 02518c06b..ab617ca47 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -210,6 +210,9 @@ int pbkdf2_test(void); #endif +/* General big buffer size for many tests. */ +#define FOURK_BUF 4096 + static int err_sys(const char* msg, int es) @@ -3303,9 +3306,6 @@ byte GetEntropy(ENTROPY_CMD cmd, byte* out) #endif - -#define FOURK_BUF 4096 - int rsa_test(void) { byte* tmp; From d40fbd58f42e472c0e114de8b21a2f230c4cd5ab Mon Sep 17 00:00:00 2001 From: toddouska Date: Fri, 10 Apr 2015 10:37:25 -0700 Subject: [PATCH 037/350] fix pkcs7 warning --- wolfcrypt/src/pkcs7.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wolfcrypt/src/pkcs7.c b/wolfcrypt/src/pkcs7.c index babb7b9dd..84f5e3885 100644 --- a/wolfcrypt/src/pkcs7.c +++ b/wolfcrypt/src/pkcs7.c @@ -1016,7 +1016,7 @@ WOLFSSL_LOCAL int wc_CreateRecipientInfo(const byte* cert, word32 certSz, issuerSz = decoded->issuerRawLen; issuerSeqSz = SetSequence(issuerSz, issuerSeq); - if (decoded->serial == NULL || decoded->serialSz == 0) { + if (decoded->serialSz == 0) { WOLFSSL_MSG("DecodedCert missing serial number"); FreeDecodedCert(decoded); #ifdef WOLFSSL_SMALL_STACK From ecfcc533c8bb391db374a9ab5204ec97cdcf9afe Mon Sep 17 00:00:00 2001 From: toddouska Date: Fri, 10 Apr 2015 10:38:31 -0700 Subject: [PATCH 038/350] add library version getters --- src/ssl.c | 15 +++++++++++++++ wolfssl/ssl.h | 5 +++++ 2 files changed, 20 insertions(+) diff --git a/src/ssl.c b/src/ssl.c index f6903707c..d91092294 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -9139,6 +9139,21 @@ const char* wolfSSL_get_version(WOLFSSL* ssl) return "unknown"; } + +/* current library version */ +const char* wolfSSL_lib_version(void) +{ + return LIBWOLFSSL_VERSION_STRING; +} + + +/* current library version in hex */ +word32 wolfSSL_lib_version_hex(void) +{ + return LIBWOLFSSL_VERSION_HEX; +} + + int wolfSSL_get_current_cipher_suite(WOLFSSL* ssl) { WOLFSSL_ENTER("SSL_get_current_cipher_suite"); diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index a5e0a64d8..8c8adf280 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -813,6 +813,11 @@ WOLFSSL_API int wolfSSL_Init(void); /* call when done to cleanup/free session cache mutex / resources */ WOLFSSL_API int wolfSSL_Cleanup(void); +/* which library version do we have */ +WOLFSSL_API const char* wolfSSL_lib_version(void); +/* which library version do we have in hex */ +WOLFSSL_API unsigned int wolfSSL_lib_version_hex(void); + /* turn logging on, only if compiled in */ WOLFSSL_API int wolfSSL_Debugging_ON(void); /* turn logging off */ From 7d213011c13af4918742d4714c0158c39d675b52 Mon Sep 17 00:00:00 2001 From: toddouska Date: Sat, 11 Apr 2015 08:47:13 -0700 Subject: [PATCH 039/350] fix fips make dist for misc.c --- cyassl/ctaocrypt/include.am | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cyassl/ctaocrypt/include.am b/cyassl/ctaocrypt/include.am index 23d393db8..c30b26fa7 100644 --- a/cyassl/ctaocrypt/include.am +++ b/cyassl/ctaocrypt/include.am @@ -1,6 +1,8 @@ # vim:ft=automake # All paths should be given relative to the root +EXTRA_DIST+= ctaocrypt/src/misc.c + nobase_include_HEADERS+= \ cyassl/ctaocrypt/aes.h \ cyassl/ctaocrypt/arc4.h \ From 7e9a5fb8ee9ab4df2acfb3efbfb3dc7db7752ded Mon Sep 17 00:00:00 2001 From: toddouska Date: Sun, 12 Apr 2015 11:01:16 -0700 Subject: [PATCH 040/350] remove poly/chacha from fips build --- configure.ac | 100 +++++++++++++++++++++++++++++---------------------- 1 file changed, 58 insertions(+), 42 deletions(-) diff --git a/configure.ac b/configure.ac index cdad2c153..d6e803416 100644 --- a/configure.ac +++ b/configure.ac @@ -437,27 +437,6 @@ fi AM_CONDITIONAL([BUILD_AESNI], [test "x$ENABLED_AESNI" = "xyes"]) -# POLY1305 -AC_ARG_ENABLE([poly1305], - [AS_HELP_STRING([--enable-poly1305],[Enable wolfSSL POLY1305 support (default: enabled)])], - [ ENABLED_POLY1305=$enableval ], - [ ENABLED_POLY1305=yes ] - ) - -# lean psk does't need poly1305 -if test "$ENABLED_LEANPSK" = "yes" -then - ENABLED_POLY1305=no -fi - -if test "$ENABLED_POLY1305" = "yes" -then - AM_CFLAGS="$AM_CFLAGS -DHAVE_POLY1305 -DHAVE_ONE_TIME_AUTH" -fi - -AM_CONDITIONAL([BUILD_POLY1305], [test "x$ENABLED_POLY1305" = "xyes"]) - - # Camellia AC_ARG_ENABLE([camellia], [ --enable-camellia Enable wolfSSL Camellia support (default: disabled)], @@ -1194,27 +1173,6 @@ fi AM_CONDITIONAL([BUILD_RABBIT], [test "x$ENABLED_RABBIT" = "xyes"]) -# CHACHA -AC_ARG_ENABLE([chacha], - [ --enable-chacha Enable CHACHA (default: enabled)], - [ ENABLED_CHACHA=$enableval ], - [ ENABLED_CHACHA=yes ] - ) - -# lean psk does't need chacha -if test "$ENABLED_LEANPSK" = "yes" -then - ENABLED_CHACHA=no -fi - -if test "$ENABLED_CHACHA" = "yes" -then - AM_CFLAGS="$AM_CFLAGS -DHAVE_CHACHA" -fi - -AM_CONDITIONAL([BUILD_CHACHA], [test "x$ENABLED_CHACHA" = "xyes"]) - - # FIPS AC_ARG_ENABLE([fips], [AS_HELP_STRING([--enable-fips],[Enable FIPS 140-2, Will NOT work w/o FIPS license (default: disabled)])], @@ -1249,6 +1207,64 @@ fi AM_CONDITIONAL([BUILD_FIPS], [test "x$ENABLED_FIPS" = "xyes"]) +# set POLY1305 default +POLY1305_DEFAULT=yes + +if test "x$ENABLED_FIPS" = "xyes" +then +POLY1305_DEFAULT=no +fi + +# POLY1305 +AC_ARG_ENABLE([poly1305], + [AS_HELP_STRING([--enable-poly1305],[Enable wolfSSL POLY1305 support (default: enabled)])], + [ ENABLED_POLY1305=$enableval ], + [ ENABLED_POLY1305=$POLY1305_DEFAULT] + ) + +# lean psk does't need poly1305 +if test "$ENABLED_LEANPSK" = "yes" +then + ENABLED_POLY1305=no +fi + +if test "$ENABLED_POLY1305" = "yes" +then + AM_CFLAGS="$AM_CFLAGS -DHAVE_POLY1305 -DHAVE_ONE_TIME_AUTH" +fi + +AM_CONDITIONAL([BUILD_POLY1305], [test "x$ENABLED_POLY1305" = "xyes"]) + + +# set CHACHA default +CHACHA_DEFAULT=yes + +if test "x$ENABLED_FIPS" = "xyes" +then +CHACHA_DEFAULT=no +fi + +# CHACHA +AC_ARG_ENABLE([chacha], + [ --enable-chacha Enable CHACHA (default: enabled)], + [ ENABLED_CHACHA=$enableval ], + [ ENABLED_CHACHA=$CHACHA_DEFAULT] + ) + +# lean psk does't need chacha +if test "$ENABLED_LEANPSK" = "yes" +then + ENABLED_CHACHA=no +fi + +if test "$ENABLED_CHACHA" = "yes" +then + AM_CFLAGS="$AM_CFLAGS -DHAVE_CHACHA" +fi + +AM_CONDITIONAL([BUILD_CHACHA], [test "x$ENABLED_CHACHA" = "xyes"]) + + # Hash DRBG AC_ARG_ENABLE([hashdrbg], [ --enable-hashdrbg Enable Hash DRBG support (default: enabled)], From ceeb3d007e65c9eca2e0725b927f44cddb5ccf07 Mon Sep 17 00:00:00 2001 From: toddouska Date: Mon, 13 Apr 2015 12:01:21 -0700 Subject: [PATCH 041/350] fix github issue #65, don't output (N)DEBUG to options.h --- configure.ac | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/configure.ac b/configure.ac index d6e803416..2a5c63911 100644 --- a/configure.ac +++ b/configure.ac @@ -2000,6 +2000,12 @@ for option in $OPTION_FLAGS; do if test "$defonly" != "$option" then noequalsign=`echo $defonly | sed 's/=/ /'` + if test "$noequalsign" = "NDEBUG" || test "$noequalsign" = "DEBUG" + then + echo "not outputing (N)DEBUG to $OPTION_FILE" + continue + fi + echo "#undef $noequalsign" >> $OPTION_FILE echo "#define $noequalsign" >> $OPTION_FILE echo "" >> $OPTION_FILE From 1f8701540d854f70975c32091fab1372dcacaf58 Mon Sep 17 00:00:00 2001 From: toddouska Date: Tue, 14 Apr 2015 12:35:24 -0700 Subject: [PATCH 042/350] change SESSION_STATS to PRINT_SESSION_STATS, will add WOLFSSL_SESSION_STATS --- cyassl/ssl.h | 1 + examples/echoserver/echoserver.c | 8 ++------ src/ssl.c | 4 ++-- wolfssl/ssl.h | 2 ++ 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/cyassl/ssl.h b/cyassl/ssl.h index 2fced9224..eadf29681 100644 --- a/cyassl/ssl.h +++ b/cyassl/ssl.h @@ -615,6 +615,7 @@ #define CyaSSL_connect_cert wolfSSL_connect_cert #define CyaSSL_flush_sessions wolfSSL_flush_sessions #define CyaSSL_get_using_nonblock wolfSSL_get_using_nonblock +#define CyaSSL_PrintSessionStats wolfSSL_PrintSessionStats /* DTLS Specific */ #define CyaSSL_dtls wolfSSL_dtls diff --git a/examples/echoserver/echoserver.c b/examples/echoserver/echoserver.c index a8b1600dc..c71ee3400 100644 --- a/examples/echoserver/echoserver.c +++ b/examples/echoserver/echoserver.c @@ -54,10 +54,6 @@ #include "examples/echoserver/echoserver.h" -#ifdef SESSION_STATS - CYASSL_API void PrintSessionStats(void); -#endif - #define SVR_COMMAND_SIZE 256 static void SignalReady(void* args, word16 port) @@ -275,9 +271,9 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args) printf("client sent break command: closing session!\n"); break; } -#ifdef SESSION_STATS +#ifdef PRINT_SESSION_STATS if ( strncmp(command, "printstats", 10) == 0) { - PrintSessionStats(); + CyaSSL_PrintSessionStats(); break; } #endif diff --git a/src/ssl.c b/src/ssl.c index d91092294..04a130a57 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -5979,10 +5979,10 @@ WOLFSSL_X509_CHAIN* wolfSSL_SESSION_get_peer_chain(WOLFSSL_SESSION* session) #endif /* SESSION_INDEX && SESSION_CERTS */ - #ifdef SESSION_STATS + #ifdef PRINT_SESSION_STATS WOLFSSL_API - void PrintSessionStats(void) + void wolfSSL_PrintSessionStats(void) { word32 totalSessionsSeen = 0; word32 totalSessionsNow = 0; diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 8c8adf280..dafa4b16b 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -1375,6 +1375,8 @@ WOLFSSL_API int wolfSSL_set_SessionTicket_cb(WOLFSSL*, #define WOLFSSL_CRL_MONITOR 0x01 /* monitor this dir flag */ #define WOLFSSL_CRL_START_MON 0x02 /* start monitoring flag */ +WOLFSSL_API +void wolfSSL_PrintSessionStats(void); /* External facing KDF */ WOLFSSL_API From 3a6f08b04a73b36f56d7bcae96a33c38eb701553 Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Tue, 14 Apr 2015 13:48:57 -0600 Subject: [PATCH 043/350] update old CYASSL comment --- wolfssl/certs_test.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wolfssl/certs_test.h b/wolfssl/certs_test.h index c7ac60370..f6c9d17ab 100644 --- a/wolfssl/certs_test.h +++ b/wolfssl/certs_test.h @@ -1215,5 +1215,5 @@ static const unsigned char dh_g[] = }; -#endif /* CYASSL_CERTS_TEST_H */ +#endif /* WOLFSSL_CERTS_TEST_H */ From 05b8e1274dda430640ac12be4238730528867801 Mon Sep 17 00:00:00 2001 From: toddouska Date: Wed, 15 Apr 2015 13:17:33 -0700 Subject: [PATCH 044/350] add WOLFSSL_SESSION_STATS and optionally WOLFSSL_PEAK_SESSIONS which will slow down servers under load --- src/ssl.c | 148 ++++++++++++++++++++++++++++++++++++++++++++------ wolfssl/ssl.h | 8 ++- 2 files changed, 137 insertions(+), 19 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 04a130a57..d6cdaff33 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -2003,6 +2003,10 @@ int AddCA(WOLFSSL_CERT_MANAGER* cm, buffer der, int type, int verify) static SessionRow SessionCache[SESSION_ROWS]; + #if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS) + static word32 PeakSessions; + #endif + static wolfSSL_Mutex session_mutex; /* SessionCache mutex */ #ifndef NO_CLIENT_CACHE @@ -5833,6 +5837,11 @@ int SetSession(WOLFSSL* ssl, WOLFSSL_SESSION* session) } +#ifdef WOLFSSL_SESSION_STATS +static int get_locked_session_stats(word32* active, word32* total, + word32* peak); +#endif + int AddSession(WOLFSSL* ssl) { word32 row, idx; @@ -5916,6 +5925,20 @@ int AddSession(WOLFSSL* ssl) SessionCache[row].Sessions[idx].idLen = 0; #endif /* NO_CLIENT_CACHE */ +#if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS) + if (error == 0) { + word32 active = 0; + + error = get_locked_session_stats(&active, NULL, NULL); + if (error == SSL_SUCCESS) { + error = 0; /* back to this function ok */ + + if (active > PeakSessions) + PeakSessions = active; + } + } +#endif /* defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS) */ + if (UnLockMutex(&session_mutex) != 0) return BAD_MUTEX_E; @@ -5979,33 +6002,124 @@ WOLFSSL_X509_CHAIN* wolfSSL_SESSION_get_peer_chain(WOLFSSL_SESSION* session) #endif /* SESSION_INDEX && SESSION_CERTS */ +#ifdef WOLFSSL_SESSION_STATS + +/* requires session_mutex lock held, SSL_SUCCESS on ok */ +static int get_locked_session_stats(word32* active, word32* total, word32* peak){ + int result = SSL_SUCCESS; + int i; + int count; + int idx; + word32 now = 0; + word32 seen = 0; + word32 ticks = LowResTimer(); + + (void)peak; + + WOLFSSL_ENTER("get_locked_session_stats"); + + for (i = 0; i < SESSION_ROWS; i++) { + seen += SessionCache[i].totalCount; + + if (active == NULL) + continue; /* no need to calculate what we can't set */ + + count = min((word32)SessionCache[i].totalCount, SESSIONS_PER_ROW); + idx = SessionCache[i].nextIdx - 1; + if (idx < 0) + idx = SESSIONS_PER_ROW - 1; /* if back to front previous was end */ + + for(; count > 0; --count, idx = idx ? idx - 1 : SESSIONS_PER_ROW - 1) { + if (idx >= SESSIONS_PER_ROW || idx < 0) { /* sanity check */ + WOLFSSL_MSG("Bad idx"); + break; + } + + /* if not expried then good */ + if (ticks < (SessionCache[i].Sessions[idx].bornOn + + SessionCache[i].Sessions[idx].timeout) ) { + now++; + } + } + } + + if (active) + *active = now; + + if (total) + *total = seen; + +#ifdef WOLFSSL_PEAK_SESSIONS + if (peak) + *peak = PeakSessions; +#endif + + WOLFSSL_LEAVE("get_locked_session_stats", result); + + return result; +} + + +/* return SSL_SUCCESS on ok */ +int wolfSSL_get_session_stats(word32* active, word32* total, word32* peak, + word32* maxSessions) +{ + int result = SSL_SUCCESS; + + WOLFSSL_ENTER("wolfSSL_get_session_stats"); + + if (maxSessions) { + *maxSessions = SESSIONS_PER_ROW * SESSION_ROWS; + + if (active == NULL && total == NULL && peak == NULL) + return result; /* we're done */ + } + + /* user must provide at least one query value */ + if (active == NULL && total == NULL && peak == NULL) + return BAD_FUNC_ARG; + + if (LockMutex(&session_mutex) != 0) { + return BAD_MUTEX_E; + } + + result = get_locked_session_stats(active, total, peak); + + if (UnLockMutex(&session_mutex) != 0) + result = BAD_MUTEX_E; + + WOLFSSL_LEAVE("wolfSSL_get_session_stats", result); + + return result; +} + +#endif /* WOLFSSL_SESSION_STATS */ + + #ifdef PRINT_SESSION_STATS - WOLFSSL_API - void wolfSSL_PrintSessionStats(void) + /* SSL_SUCCESS on ok */ + int wolfSSL_PrintSessionStats(void) { word32 totalSessionsSeen = 0; word32 totalSessionsNow = 0; - word32 rowNow; + word32 peak = 0; + word32 maxSessions = 0; int i; + int ret; double E; /* expected freq */ double chiSquare = 0; - for (i = 0; i < SESSION_ROWS; i++) { - totalSessionsSeen += SessionCache[i].totalCount; - - if (SessionCache[i].totalCount >= SESSIONS_PER_ROW) - rowNow = SESSIONS_PER_ROW; - else if (SessionCache[i].nextIdx == 0) - rowNow = 0; - else - rowNow = SessionCache[i].nextIdx; - - totalSessionsNow += rowNow; - } - + ret = wolfSSL_get_session_stats(&totalSessionsNow, &totalSessionsSeen, + &peak, &maxSessions); + if (ret != SSL_SUCCESS) + return ret; printf("Total Sessions Seen = %d\n", totalSessionsSeen); printf("Total Sessions Now = %d\n", totalSessionsNow); +#ifdef WOLFSSL_PEAK_SESSIONS + printf("Peak Sessions = %d\n", peak); +#endif + printf("Max Sessions = %d\n", maxSessions); E = (double)totalSessionsSeen / SESSION_ROWS; @@ -6029,6 +6143,8 @@ WOLFSSL_X509_CHAIN* wolfSSL_SESSION_get_peer_chain(WOLFSSL_SESSION* session) else if (SESSION_ROWS == 2861) printf(".05 p value = 2985.5, chi-square should be less\n"); printf("\n"); + + return ret; } #endif /* SESSION_STATS */ diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index dafa4b16b..2f72c4c65 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -1375,9 +1375,11 @@ WOLFSSL_API int wolfSSL_set_SessionTicket_cb(WOLFSSL*, #define WOLFSSL_CRL_MONITOR 0x01 /* monitor this dir flag */ #define WOLFSSL_CRL_START_MON 0x02 /* start monitoring flag */ -WOLFSSL_API -void wolfSSL_PrintSessionStats(void); - +WOLFSSL_API int wolfSSL_PrintSessionStats(void); +WOLFSSL_API int wolfSSL_get_session_stats(unsigned int* active, + unsigned int* total, + unsigned int* peak, + unsigned int* maxSessions); /* External facing KDF */ WOLFSSL_API int wolfSSL_MakeTlsMasterSecret(unsigned char* ms, unsigned int msLen, From 281decae4681e6f3952efa27476d9a0cdc7a244e Mon Sep 17 00:00:00 2001 From: toddouska Date: Thu, 16 Apr 2015 10:36:51 -0700 Subject: [PATCH 045/350] fix github issue #65, don't undef with arg to options.h --- configure.ac | 3 ++- src/ssl.c | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 2a5c63911..36ebe60ea 100644 --- a/configure.ac +++ b/configure.ac @@ -2006,7 +2006,8 @@ for option in $OPTION_FLAGS; do continue fi - echo "#undef $noequalsign" >> $OPTION_FILE + noarg=`echo $defonly | sed 's/=.*//'` + echo "#undef $noarg" >> $OPTION_FILE echo "#define $noequalsign" >> $OPTION_FILE echo "" >> $OPTION_FILE else diff --git a/src/ssl.c b/src/ssl.c index d6cdaff33..ee0d473f0 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -6005,7 +6005,8 @@ WOLFSSL_X509_CHAIN* wolfSSL_SESSION_get_peer_chain(WOLFSSL_SESSION* session) #ifdef WOLFSSL_SESSION_STATS /* requires session_mutex lock held, SSL_SUCCESS on ok */ -static int get_locked_session_stats(word32* active, word32* total, word32* peak){ +static int get_locked_session_stats(word32* active, word32* total, word32* peak) +{ int result = SSL_SUCCESS; int i; int count; @@ -6029,7 +6030,7 @@ static int get_locked_session_stats(word32* active, word32* total, word32* peak) if (idx < 0) idx = SESSIONS_PER_ROW - 1; /* if back to front previous was end */ - for(; count > 0; --count, idx = idx ? idx - 1 : SESSIONS_PER_ROW - 1) { + for (; count > 0; --count, idx = idx ? idx - 1 : SESSIONS_PER_ROW - 1) { if (idx >= SESSIONS_PER_ROW || idx < 0) { /* sanity check */ WOLFSSL_MSG("Bad idx"); break; From 7536cec0d6941ae3c2feb0319b5aae38c7538f77 Mon Sep 17 00:00:00 2001 From: toddouska Date: Fri, 17 Apr 2015 09:23:43 -0700 Subject: [PATCH 046/350] fix github issue #65, ignore sys options --- configure.ac | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 36ebe60ea..148fbc3db 100644 --- a/configure.ac +++ b/configure.ac @@ -2006,10 +2006,24 @@ for option in $OPTION_FLAGS; do continue fi + # allow user to igonore system options + ignoresys=no + if [[[ $noequalsign == _* ]]] ; + then + ignoresys=yes + echo "#ifndef WOLFSSL_OPTIONS_IGNORE_SYS" >> $OPTION_FILE + fi + noarg=`echo $defonly | sed 's/=.*//'` - echo "#undef $noarg" >> $OPTION_FILE - echo "#define $noequalsign" >> $OPTION_FILE - echo "" >> $OPTION_FILE + echo "#undef $noarg" >> $OPTION_FILE + echo "#define $noequalsign" >> $OPTION_FILE + + if test "$ignoresys" = "yes" + then + echo "#endif" >> $OPTION_FILE + fi + + echo "" >> $OPTION_FILE else echo "option w/o begin -D is $option, not saving to $OPTION_FILE" fi From 99a9d221bc8af8794a4a3216742bb368f770d7b7 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Fri, 17 Apr 2015 13:42:08 -0700 Subject: [PATCH 047/350] in sniffer, free handshake resources in the right order --- src/sniffer.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/sniffer.c b/src/sniffer.c index 58dfa4b0b..50f044498 100644 --- a/src/sniffer.c +++ b/src/sniffer.c @@ -1780,7 +1780,12 @@ static int ProcessFinished(const byte* input, int size, int* sslBytes, } } - FreeHandshakeResources(ssl); + /* If receiving a finished message from one side, free the resources + * from the other side's tracker. */ + if (session->flags.side == WOLFSSL_SERVER_END) + FreeHandshakeResources(session->sslClient); + else + FreeHandshakeResources(session->sslServer); return ret; } From 1e9647023c2db49dfcbf30f7c3fcc40c031bcebf Mon Sep 17 00:00:00 2001 From: toddouska Date: Sat, 18 Apr 2015 08:35:47 -0700 Subject: [PATCH 048/350] add snifftest script check to make check --- .gitignore | 1 + Makefile.am | 7 +++++++ scripts/include.am | 9 +++++++++ scripts/sniffer-testsuite.test | 13 +++++++++++++ scripts/testsuite.pcap | Bin 0 -> 52480 bytes sslSniffer/sslSnifferTest/snifftest.c | 7 +++++-- 6 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 scripts/include.am create mode 100755 scripts/sniffer-testsuite.test create mode 100644 scripts/testsuite.pcap diff --git a/.gitignore b/.gitignore index e712a00ef..dfedec021 100644 --- a/.gitignore +++ b/.gitignore @@ -78,6 +78,7 @@ pkcs7signedData.der pkcs7envelopedData.der diff sslSniffer/sslSnifferTest/tracefile.txt +tracefile.txt *.gz *.zip *.bak diff --git a/Makefile.am b/Makefile.am index 2cbb27616..a47f19bf4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -16,6 +16,8 @@ EXTRA_HEADERS = BUILT_SOURCES= EXTRA_DIST= dist_doc_DATA= +dist_noinst_SCRIPTS = +check_SCRIPTS = #includes additional rules from aminclude.am @INC_AMINCLUDE@ @@ -94,6 +96,7 @@ include mcapi/wolfcrypt_test.X/nbproject/include.am include mcapi/wolfssl.X/nbproject/include.am include mcapi/zlib.X/nbproject/include.am include tirtos/include.am +include scripts/include.am if USE_VALGRIND TESTS_ENVIRONMENT=./valgrind-error.sh @@ -101,6 +104,10 @@ endif TEST_EXTENSIONS=.test TESTS += $(check_PROGRAMS) + +check_SCRIPTS+= $(dist_noinst_SCRIPTS) +TESTS += $(check_SCRIPTS) + test: check tests/unit.log: testsuite/testsuite.log diff --git a/scripts/include.am b/scripts/include.am new file mode 100644 index 000000000..971954376 --- /dev/null +++ b/scripts/include.am @@ -0,0 +1,9 @@ +# vim:ft=automake +# included from Top Level Makefile.am +# All paths should be given relative to the root + + +if BUILD_SNIFFTEST +dist_noinst_SCRIPTS+= scripts/sniffer-testsuite.test +endif +EXTRA_DIST += scripts/testsuite.pcap diff --git a/scripts/sniffer-testsuite.test b/scripts/sniffer-testsuite.test new file mode 100755 index 000000000..5dbaf86bc --- /dev/null +++ b/scripts/sniffer-testsuite.test @@ -0,0 +1,13 @@ +#!/bin/bash + +#sniffer-testsuite.test + +echo -e "\nStaring snifftest on testsuite.pcap...\n" +./sslSniffer/sslSnifferTest/snifftest ./scripts/testsuite.pcap ./certs/server-key.pem 127.0.0.1 11111 + +RESULT=$? +[ $RESULT -ne 0 ] && echo -e "\nsnifftest failed\n" && exit 1 + +echo -e "\nSuccess!\n" + +exit 0 diff --git a/scripts/testsuite.pcap b/scripts/testsuite.pcap new file mode 100644 index 0000000000000000000000000000000000000000..a39ad39163e491b079e34a54e95df88ef78e817d GIT binary patch literal 52480 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 literal 0 HcmV?d00001 diff --git a/sslSniffer/sslSnifferTest/snifftest.c b/sslSniffer/sslSnifferTest/snifftest.c index 724b1d895..8ffe24d5a 100755 --- a/sslSniffer/sslSnifferTest/snifftest.c +++ b/sslSniffer/sslSnifferTest/snifftest.c @@ -123,6 +123,7 @@ static char* iptos(unsigned int addr) int main(int argc, char** argv) { int ret = 0; + int hadBadPacket = 0; int inum; int port; int saveFile = 0; @@ -303,8 +304,10 @@ int main(int argc, char** argv) continue; ret = ssl_DecodePacket(packet, header.caplen, data, err); - if (ret < 0) + if (ret < 0) { printf("ssl_Decode ret = %d, %s\n", ret, err); + hadBadPacket = 1; + } if (ret > 0) { data[ret] = 0; printf("SSL App Data(%d:%d):%s\n", packetNumber, ret, data); @@ -315,7 +318,7 @@ int main(int argc, char** argv) } FreeAll(); - return EXIT_SUCCESS; + return hadBadPacket ? EXIT_FAILURE : EXIT_SUCCESS; } #endif /* full build */ From 96bb6e8cd742c104ad6bbee67ec6b75fdfba53bf Mon Sep 17 00:00:00 2001 From: Daniele Lacamera Date: Thu, 23 Apr 2015 12:35:05 +0200 Subject: [PATCH 049/350] Improved support for PicoTCP on embedded devices --- src/io.c | 2 +- wolfssl/ssl.h | 2 +- wolfssl/wolfcrypt/settings.h | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/io.c b/src/io.c index c5fdcd815..195056665 100644 --- a/src/io.c +++ b/src/io.c @@ -83,7 +83,7 @@ #endif #include #if !(defined(DEVKITPRO) || defined(HAVE_RTP_SYS) || defined(EBSNET)) \ - || defined(WOLFSSL_PICOTCP) + && !(defined(WOLFSSL_PICOTCP)) #include #include #include diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 2f72c4c65..1652fa2c5 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -923,7 +923,7 @@ WOLFSSL_API int wolfSSL_make_eap_keys(WOLFSSL*, void* key, unsigned int len, #ifdef __PPU #include #include - #elif !defined(WOLFSSL_MDK_ARM) && !defined(WOLFSSL_IAR_ARM) + #elif !defined(WOLFSSL_MDK_ARM) && !defined(WOLFSSL_IAR_ARM) && !defined(WOLFSSL_PICOTCP) #include #endif /* allow writev style writing */ diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index 23c19486d..a3b6a6551 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -244,10 +244,13 @@ #endif #ifdef WOLFSSL_PICOTCP - #define errno pico_err + #ifndef errno + #define errno pico_err + #endif #include "pico_defines.h" #include "pico_stack.h" #include "pico_constants.h" + #include "pico_protocol.h" #define CUSTOM_RAND_GENERATE pico_rand #endif From d927aa43345f363d7f07e07308eed2c1f4d6b7bb Mon Sep 17 00:00:00 2001 From: toddouska Date: Tue, 28 Apr 2015 12:21:54 -0700 Subject: [PATCH 050/350] add resume test to example server and script test --- examples/client/client.c | 10 ++---- examples/server/server.c | 66 ++++++++++++++++++++++++++++++++-------- scripts/include.am | 6 ++++ scripts/resume.test | 63 ++++++++++++++++++++++++++++++++++++++ wolfssl/test.h | 6 +++- 5 files changed, 130 insertions(+), 21 deletions(-) create mode 100755 scripts/resume.test diff --git a/examples/client/client.c b/examples/client/client.c index cee776f57..f2081ddc7 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -813,12 +813,6 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) #ifndef NO_SESSION_CACHE if (resumeSession) { - if (doDTLS) { - strncpy(msg, "break", 6); - msgSz = (int)strlen(msg); - /* try to send session close */ - wolfSSL_write(ssl, msg, msgSz); - } session = wolfSSL_get_session(ssl); sslResume = wolfSSL_new(ctx); } @@ -950,7 +944,9 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) #if defined(DEBUG_WOLFSSL) && !defined(WOLFSSL_MDK_SHELL) && !defined(STACK_TRAP) wolfSSL_Debugging_ON(); #endif - if (CurrentDir("client")) + if (CurrentDir("_build")) + ChangeDirBack(1); + else if (CurrentDir("client")) ChangeDirBack(2); else if (CurrentDir("Debug") || CurrentDir("Release")) ChangeDirBack(3); diff --git a/examples/server/server.c b/examples/server/server.c index 17ad6ed48..50fb5a389 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -60,6 +60,7 @@ Timeval srvTo; #endif + static void NonBlockingSSL_Accept(SSL* ssl) { #ifndef CYASSL_CALLBACKS @@ -132,7 +133,8 @@ static void Usage(void) printf("-u Use UDP DTLS," " add -v 2 for DTLSv1 (default), -v 3 for DTLSv1.2\n"); printf("-f Fewer packets/group messages\n"); - printf("-r Create server ready file, for external monitor\n"); + printf("-R Create server ready file, for external monitor\n"); + printf("-r Allow one client Resumption\n"); printf("-N Use Non-blocking sockets\n"); printf("-S Use Host Name Indication\n"); printf("-w Wait for bidirectional shutdown\n"); @@ -175,7 +177,8 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args) int fewerPackets = 0; int pkCallbacks = 0; int serverReadyFile = 0; - int wc_shutdown = 0; + int wc_shutdown = 0; + int resume = 0; /* do resume, and resume count */ int ret; char* cipherList = NULL; const char* verifyCert = cliCert; @@ -213,7 +216,8 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args) fdOpenSession(Task_self()); #endif - while ((ch = mygetopt(argc, argv, "?dbstnNufrawPp:v:l:A:c:k:S:oO:")) != -1) { + while ((ch = mygetopt(argc, argv, "?dbstnNufrRawPp:v:l:A:c:k:S:oO:")) + != -1) { switch (ch) { case '?' : Usage(); @@ -249,10 +253,16 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args) fewerPackets = 1; break; - case 'r' : + case 'R' : serverReadyFile = 1; break; + case 'r' : + #ifndef NO_SESSION_CACHE + resume = 1; + #endif + break; + case 'P' : #ifdef HAVE_PK_CALLBACKS pkCallbacks = 1; @@ -502,6 +512,24 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args) err_sys("UseSNI failed"); #endif +while (1) { /* allow resume option */ + if (resume > 1) { /* already did listen, just do accept */ + if (doDTLS == 0) { + SOCKADDR_IN_T client; + socklen_t client_len = sizeof(client); + clientfd = accept(sockfd, (struct sockaddr*)&client, + (ACCEPT_THIRD_T)&client_len); + } else { + tcp_listen(&sockfd, &port, useAnyAddr, doDTLS); + clientfd = udp_read_connect(sockfd); + } + #ifdef USE_WINDOWS_API + if (clientfd == INVALID_SOCKET) err_sys("tcp accept failed"); + #else + if (clientfd == -1) err_sys("tcp accept failed"); + #endif + } + ssl = SSL_new(ctx); if (ssl == NULL) err_sys("unable to get SSL"); @@ -528,10 +556,10 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args) SetupPkCallbacks(ctx, ssl); #endif - tcp_accept(&sockfd, &clientfd, (func_args*)args, port, useAnyAddr, doDTLS, - serverReadyFile); - if (!doDTLS) - CloseSocket(sockfd); + if (resume < 2) { /* do listen and accept */ + tcp_accept(&sockfd, &clientfd, (func_args*)args, port, useAnyAddr, + doDTLS, serverReadyFile); + } SSL_set_fd(ssl, clientfd); if (usePsk == 0 || useAnon == 1 || cipherList != NULL || needDH == 1) { @@ -579,13 +607,23 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args) Task_yield(); #endif - ret = SSL_shutdown(ssl); - if (wc_shutdown && ret == SSL_SHUTDOWN_NOT_DONE) - SSL_shutdown(ssl); /* bidirectional shutdown */ + if (doDTLS == 0) { + ret = SSL_shutdown(ssl); + if (wc_shutdown && ret == SSL_SHUTDOWN_NOT_DONE) + SSL_shutdown(ssl); /* bidirectional shutdown */ + } SSL_free(ssl); + if (resume == 1) { + CloseSocket(clientfd); + resume++; /* only do one resume for testing */ + continue; + } + break; /* out of while loop, done with normal and resume option */ +} SSL_CTX_free(ctx); - + CloseSocket(clientfd); + CloseSocket(sockfd); ((func_args*)args)->return_code = 0; @@ -631,7 +669,9 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args) #if defined(DEBUG_CYASSL) && !defined(CYASSL_MDK_SHELL) CyaSSL_Debugging_ON(); #endif - if (CurrentDir("server")) + if (CurrentDir("_build")) + ChangeDirBack(1); + else if (CurrentDir("server")) ChangeDirBack(2); else if (CurrentDir("Debug") || CurrentDir("Release")) ChangeDirBack(3); diff --git a/scripts/include.am b/scripts/include.am index 971954376..2a98f97e0 100644 --- a/scripts/include.am +++ b/scripts/include.am @@ -3,7 +3,13 @@ # All paths should be given relative to the root + if BUILD_SNIFFTEST dist_noinst_SCRIPTS+= scripts/sniffer-testsuite.test endif + +if BUILD_EXAMPLES +dist_noinst_SCRIPTS+= scripts/resume.test +endif + EXTRA_DIST += scripts/testsuite.pcap diff --git a/scripts/resume.test b/scripts/resume.test new file mode 100755 index 000000000..19817234b --- /dev/null +++ b/scripts/resume.test @@ -0,0 +1,63 @@ +#!/bin/bash + +#reusme.test + +# need a unique resume port since may run the same time as testsuite +resume_port=11112 +no_pid=-1 +server_pid=$no_pid + +do_cleanup() { + echo "in cleanup" + + if [[ $server_pid != $no_pid ]] + then + echo "killing server" + kill -9 $server_pid + fi +} + +do_trap() { + echo "got trap" + do_cleanup + exit -1 +} + +trap do_trap INT TERM + +echo -e "\nStarting example server for resume test...\n" + +if test -e /tmp/wolfssl_server_ready; then + echo -e "removing exisitng server_ready file" + rm /tmp/wolfssl_server_ready +fi +./examples/server/server -r -R -p $resume_port & +server_pid=$! + +while [ ! -s /tmp/wolfssl_server_ready ]; do + echo -e "waiting for server_ready file..." + sleep 0.1 +done + +./examples/client/client -r -p $resume_port +client_result=$? + +if [[ $client_result != 0 ]] ; +then + echo -e "client failed!" + do_cleanup + exit 1 +fi + +wait $server_pid +server_result=$? + +if [[ $server_result != 0 ]] ; +then + echo -e "client failed!" + exit 1 +fi + +echo -e "\nSuccess!\n" + +exit 0 diff --git a/wolfssl/test.h b/wolfssl/test.h index 104b3f73d..837924258 100644 --- a/wolfssl/test.h +++ b/wolfssl/test.h @@ -728,7 +728,11 @@ static INLINE void tcp_accept(SOCKET_T* sockfd, SOCKET_T* clientfd, if (ready_file) { #ifndef NO_FILESYSTEM - FILE* srf = fopen("./server_ready", "w+"); + #ifndef USE_WINDOWS_API + FILE* srf = fopen("/tmp/wolfssl_server_ready", "w"); + #else + FILE* srf = fopen("wolfssl_server_ready", "w"); + #endif if (srf) { fputs("ready", srf); From 47ba1368c26bc9e0de875c04a0a8c9c3236c0d0a Mon Sep 17 00:00:00 2001 From: toddouska Date: Tue, 28 Apr 2015 14:15:31 -0700 Subject: [PATCH 051/350] add wolfssl website ca, go daddy class2 CA --- certs/include.am | 4 +- certs/wolfssl-website-ca.pem | 83 ++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 certs/wolfssl-website-ca.pem diff --git a/certs/include.am b/certs/include.am index 42a936435..b5192043e 100644 --- a/certs/include.am +++ b/certs/include.am @@ -24,8 +24,8 @@ EXTRA_DIST += \ certs/server-keyPkcs8Enc12.pem \ certs/server-keyPkcs8Enc2.pem \ certs/server-keyPkcs8Enc.pem \ - certs/server-keyPkcs8.pem - + certs/server-keyPkcs8.pem \ + certs/wolfssl-website-ca.pem EXTRA_DIST += \ certs/ca-key.der \ certs/ca-cert.der \ diff --git a/certs/wolfssl-website-ca.pem b/certs/wolfssl-website-ca.pem new file mode 100644 index 000000000..704a29fb3 --- /dev/null +++ b/certs/wolfssl-website-ca.pem @@ -0,0 +1,83 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 0 (0x0) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority + Validity + Not Before: Jun 29 17:06:20 2004 GMT + Not After : Jun 29 17:06:20 2034 GMT + Subject: C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:de:9d:d7:ea:57:18:49:a1:5b:eb:d7:5f:48:86: + ea:be:dd:ff:e4:ef:67:1c:f4:65:68:b3:57:71:a0: + 5e:77:bb:ed:9b:49:e9:70:80:3d:56:18:63:08:6f: + da:f2:cc:d0:3f:7f:02:54:22:54:10:d8:b2:81:d4: + c0:75:3d:4b:7f:c7:77:c3:3e:78:ab:1a:03:b5:20: + 6b:2f:6a:2b:b1:c5:88:7e:c4:bb:1e:b0:c1:d8:45: + 27:6f:aa:37:58:f7:87:26:d7:d8:2d:f6:a9:17:b7: + 1f:72:36:4e:a6:17:3f:65:98:92:db:2a:6e:5d:a2: + fe:88:e0:0b:de:7f:e5:8d:15:e1:eb:cb:3a:d5:e2: + 12:a2:13:2d:d8:8e:af:5f:12:3d:a0:08:05:08:b6: + 5c:a5:65:38:04:45:99:1e:a3:60:60:74:c5:41:a5: + 72:62:1b:62:c5:1f:6f:5f:1a:42:be:02:51:65:a8: + ae:23:18:6a:fc:78:03:a9:4d:7f:80:c3:fa:ab:5a: + fc:a1:40:a4:ca:19:16:fe:b2:c8:ef:5e:73:0d:ee: + 77:bd:9a:f6:79:98:bc:b1:07:67:a2:15:0d:dd:a0: + 58:c6:44:7b:0a:3e:62:28:5f:ba:41:07:53:58:cf: + 11:7e:38:74:c5:f8:ff:b5:69:90:8f:84:74:ea:97: + 1b:af + Exponent: 3 (0x3) + X509v3 extensions: + X509v3 Subject Key Identifier: + D2:C4:B0:D2:91:D4:4C:11:71:B3:61:CB:3D:A1:FE:DD:A8:6A:D4:E3 + X509v3 Authority Key Identifier: + keyid:D2:C4:B0:D2:91:D4:4C:11:71:B3:61:CB:3D:A1:FE:DD:A8:6A:D4:E3 + DirName:/C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority + serial:00 + + X509v3 Basic Constraints: + CA:TRUE + Signature Algorithm: sha1WithRSAEncryption + 32:4b:f3:b2:ca:3e:91:fc:12:c6:a1:07:8c:8e:77:a0:33:06: + 14:5c:90:1e:18:f7:08:a6:3d:0a:19:f9:87:80:11:6e:69:e4: + 96:17:30:ff:34:91:63:72:38:ee:cc:1c:01:a3:1d:94:28:a4: + 31:f6:7a:c4:54:d7:f6:e5:31:58:03:a2:cc:ce:62:db:94:45: + 73:b5:bf:45:c9:24:b5:d5:82:02:ad:23:79:69:8d:b8:b6:4d: + ce:cf:4c:ca:33:23:e8:1c:88:aa:9d:8b:41:6e:16:c9:20:e5: + 89:9e:cd:3b:da:70:f7:7e:99:26:20:14:54:25:ab:6e:73:85: + e6:9b:21:9d:0a:6c:82:0e:a8:f8:c2:0c:fa:10:1e:6c:96:ef: + 87:0d:c4:0f:61:8b:ad:ee:83:2b:95:f8:8e:92:84:72:39:eb: + 20:ea:83:ed:83:cd:97:6e:08:bc:eb:4e:26:b6:73:2b:e4:d3: + f6:4c:fe:26:71:e2:61:11:74:4a:ff:57:1a:87:0f:75:48:2e: + cf:51:69:17:a0:02:12:61:95:d5:d1:40:b2:10:4c:ee:c4:ac: + 10:43:a6:a5:9e:0a:d5:95:62:9a:0d:cf:88:82:c5:32:0c:e4: + 2b:9f:45:e6:0d:9f:28:9c:b1:b9:2a:5a:57:ad:37:0f:af:1d: + 7f:db:bd:9f +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- From c04de5ba82604b0115b441dec38bde4ed79befec Mon Sep 17 00:00:00 2001 From: toddouska Date: Tue, 28 Apr 2015 18:04:11 -0700 Subject: [PATCH 052/350] add resume to example client benchmarking --- examples/client/client.c | 41 ++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/examples/client/client.c b/examples/client/client.c index f2081ddc7..92aa658d9 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -653,26 +653,39 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) if (benchmark) { /* time passed in number of connects give average */ int times = benchmark; + int loops = resumeSession ? 2 : 1; int i = 0; + WOLFSSL_SESSION* benchSession = NULL; - double start = current_time(), avg; + while (loops--) { + int benchResume = resumeSession && loops == 0; + double start = current_time(), avg; - for (i = 0; i < times; i++) { - tcp_connect(&sockfd, host, port, doDTLS); + for (i = 0; i < times; i++) { + tcp_connect(&sockfd, host, port, doDTLS); - ssl = wolfSSL_new(ctx); - wolfSSL_set_fd(ssl, sockfd); - if (wolfSSL_connect(ssl) != SSL_SUCCESS) - err_sys("SSL_connect failed"); + ssl = wolfSSL_new(ctx); + if (benchResume) + wolfSSL_set_session(ssl, benchSession); + wolfSSL_set_fd(ssl, sockfd); + if (wolfSSL_connect(ssl) != SSL_SUCCESS) + err_sys("SSL_connect failed"); - wolfSSL_shutdown(ssl); - wolfSSL_free(ssl); - CloseSocket(sockfd); + wolfSSL_shutdown(ssl); + if (i == (times-1) && resumeSession) { + benchSession = wolfSSL_get_session(ssl); + } + wolfSSL_free(ssl); + CloseSocket(sockfd); + } + avg = current_time() - start; + avg /= times; + avg *= 1000; /* milliseconds */ + if (benchResume) + printf("wolfSSL_resume avg took: %8.3f milliseconds\n", avg); + else + printf("wolfSSL_connect avg took: %8.3f milliseconds\n", avg); } - avg = current_time() - start; - avg /= times; - avg *= 1000; /* milliseconds */ - printf("wolfSSL_connect avg took: %8.3f milliseconds\n", avg); wolfSSL_CTX_free(ctx); ((func_args*)args)->return_code = 0; From ada5ff876a7e9ecee27941491f8eb9247669edda Mon Sep 17 00:00:00 2001 From: toddouska Date: Wed, 29 Apr 2015 17:06:57 -0700 Subject: [PATCH 053/350] allow example client to do resume with scr --- examples/client/client.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/examples/client/client.c b/examples/client/client.c index 92aa658d9..cc49afe85 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -774,13 +774,6 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) printf("not doing secure renegotiation on example with" " nonblocking yet"); } else { - #ifndef NO_SESSION_CACHE - if (resumeSession) { - session = wolfSSL_get_session(ssl); - wolfSSL_set_session(ssl, session); - resumeSession = 0; /* only resume once */ - } - #endif if (wolfSSL_Rehandshake(ssl) != SSL_SUCCESS) { int err = wolfSSL_get_error(ssl, 0); char buffer[WOLFSSL_MAX_ERROR_SZ]; @@ -862,6 +855,12 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) tcp_connect(&sockfd, host, port, 0); } wolfSSL_set_fd(sslResume, sockfd); +#ifdef HAVE_SECURE_RENEGOTIATION + if (scr) { + if (wolfSSL_UseSecureRenegotiation(sslResume) != SSL_SUCCESS) + err_sys("can't enable secure renegotiation"); + } +#endif wolfSSL_set_session(sslResume, session); #ifdef HAVE_SESSION_TICKET wolfSSL_set_SessionTicket_cb(sslResume, sessionTicketCB, From 162214924fd484dff6af36cdc90607c09ef30dca Mon Sep 17 00:00:00 2001 From: toddouska Date: Thu, 30 Apr 2015 09:22:25 -0700 Subject: [PATCH 054/350] simplify build verify hashes to one spot --- src/internal.c | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/src/internal.c b/src/internal.c index bf89d54a2..a398bf412 100644 --- a/src/internal.c +++ b/src/internal.c @@ -6631,16 +6631,9 @@ int ProcessReply(WOLFSSL* ssl) if ( (ret = InitStreams(ssl)) != 0) return ret; #endif - if (ssl->options.resuming && - ssl->options.side == WOLFSSL_CLIENT_END) { - ret = BuildFinished(ssl, &ssl->hsHashes->verifyHashes, - server); - } - else if (!ssl->options.resuming && - ssl->options.side == WOLFSSL_SERVER_END) { - ret = BuildFinished(ssl, &ssl->hsHashes->verifyHashes, - client); - } + ret = BuildFinished(ssl, &ssl->hsHashes->verifyHashes, + ssl->options.side == WOLFSSL_CLIENT_END ? + server : client); if (ret != 0) return ret; break; @@ -7146,7 +7139,7 @@ int SendFinished(WOLFSSL* ssl) /* make finished hashes */ hashes = (Hashes*)&input[headerSz]; ret = BuildFinished(ssl, hashes, - ssl->options.side == WOLFSSL_CLIENT_END ? client : server); + ssl->options.side == WOLFSSL_CLIENT_END ? client : server); if (ret != 0) return ret; #ifdef HAVE_SECURE_RENEGOTIATION @@ -7176,11 +7169,7 @@ int SendFinished(WOLFSSL* ssl) #ifndef NO_SESSION_CACHE AddSession(ssl); /* just try */ #endif - if (ssl->options.side == WOLFSSL_CLIENT_END) { - ret = BuildFinished(ssl, &ssl->hsHashes->verifyHashes, server); - if (ret != 0) return ret; - } - else { + if (ssl->options.side == WOLFSSL_SERVER_END) { ssl->options.handShakeState = HANDSHAKE_DONE; ssl->options.handShakeDone = 1; #ifdef WOLFSSL_DTLS @@ -7206,10 +7195,6 @@ int SendFinished(WOLFSSL* ssl) } #endif } - else { - ret = BuildFinished(ssl, &ssl->hsHashes->verifyHashes, client); - if (ret != 0) return ret; - } } #ifdef WOLFSSL_DTLS if (ssl->options.dtls) { @@ -11327,7 +11312,7 @@ int DoSessionTicket(WOLFSSL* ssl, ssl->expect_session_ticket = 0; - return BuildFinished(ssl, &ssl->hsHashes->verifyHashes, server); + return 0; } #endif /* HAVE_SESSION_TICKET */ From 1771fea17d443d6492aa57cb63fe11891d9bc578 Mon Sep 17 00:00:00 2001 From: toddouska Date: Thu, 30 Apr 2015 16:50:02 -0700 Subject: [PATCH 055/350] fix ecc_make_key cleanup on rng failure --- wolfcrypt/src/ecc.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index d98479060..a4c8adc5a 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -1554,6 +1554,7 @@ int wc_ecc_make_key_ex(RNG* rng, ecc_key* key, const ecc_set_type* dp) byte buf[ECC_MAXSIZE]; #endif int keysize; + int po_init = 0; /* prime order Init flag for clear */ if (key == NULL || rng == NULL || dp == NULL) return ECC_BAD_ARG_E; @@ -1592,6 +1593,8 @@ int wc_ecc_make_key_ex(RNG* rng, ecc_key* key, const ecc_set_type* dp) #endif if (err != MP_OKAY) err = MEMORY_E; + else + po_init = 1; } if (err == MP_OKAY) { @@ -1634,8 +1637,10 @@ int wc_ecc_make_key_ex(RNG* rng, ecc_key* key, const ecc_set_type* dp) mp_clear(&key->k); } ecc_del_point(base); - mp_clear(&prime); - mp_clear(&order); + if (po_init) { + mp_clear(&prime); + mp_clear(&order); + } ForceZero(buf, ECC_MAXSIZE); #ifdef WOLFSSL_SMALL_STACK From 114fc18c33e7f2a5f29852874f0344c36a5d0b96 Mon Sep 17 00:00:00 2001 From: toddouska Date: Thu, 30 Apr 2015 17:10:33 -0700 Subject: [PATCH 056/350] add alignment to benchmark key/iv --- wolfcrypt/benchmark/benchmark.c | 4 ++-- wolfssl/wolfcrypt/settings.h | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/wolfcrypt/benchmark/benchmark.c b/wolfcrypt/benchmark/benchmark.c index 5295e2470..66c905f9b 100644 --- a/wolfcrypt/benchmark/benchmark.c +++ b/wolfcrypt/benchmark/benchmark.c @@ -208,14 +208,14 @@ static int OpenNitroxDevice(int dma_mode,int dev_id) #endif -static const byte key[] = +static const XGEN_ALIGN byte key[] = { 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef, 0xfe,0xde,0xba,0x98,0x76,0x54,0x32,0x10, 0x89,0xab,0xcd,0xef,0x01,0x23,0x45,0x67 }; -static const byte iv[] = +static const XGEN_ALIGN byte iv[] = { 0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index 23c19486d..8148c40a2 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -732,6 +732,18 @@ #endif #endif +#if defined(WOLFSSL_GENERAL_ALIGNMENT) && (WOLFSSL_GENERAL_ALIGNMENT > 0) + #if defined(_MSC_VER) + #define XGEN_ALIGN __declspec(align(WOLFSSL_GENERAL_ALIGNMENT)) + #elif defined(__GNUC__) + #define XGEN_ALIGN __attribute__((aligned(WOLFSSL_GENERAL_ALIGNMENT))) + #else + #define XGEN_ALIGN + #endif +#else + #define XGEN_ALIGN +#endif + #ifdef HAVE_CRL /* not widely supported yet */ #undef NO_SKID From 46eca67336b1fb2e147926fa43c13ea07c112726 Mon Sep 17 00:00:00 2001 From: toddouska Date: Thu, 30 Apr 2015 17:14:04 -0700 Subject: [PATCH 057/350] make certs_test buffers static in case multiple files need --- wolfssl/certs_test.h | 52 ++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/wolfssl/certs_test.h b/wolfssl/certs_test.h index f6c9d17ab..44f441a3f 100644 --- a/wolfssl/certs_test.h +++ b/wolfssl/certs_test.h @@ -6,7 +6,7 @@ #ifdef USE_CERT_BUFFERS_1024 /* ./certs/1024/client-key.der, 1024-bit */ -const unsigned char client_key_der_1024[] = +static const unsigned char client_key_der_1024[] = { 0x30, 0x82, 0x02, 0x5C, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0xBC, 0x73, 0x0E, 0xA8, 0x49, 0xF3, 0x74, 0xA2, 0xA9, @@ -70,10 +70,10 @@ const unsigned char client_key_der_1024[] = 0xA2, 0xFE, 0xBF, 0x08, 0x6B, 0x1A, 0x5D, 0x3F, 0x90, 0x12, 0xB1, 0x05, 0x86, 0x31, 0x29, 0xDB, 0xD9, 0xE2 }; -const int sizeof_client_key_der_1024 = sizeof(client_key_der_1024); +static const int sizeof_client_key_der_1024 = sizeof(client_key_der_1024); /* ./certs/1024/client-cert.der, 1024-bit */ -const unsigned char client_cert_der_1024[] = +static const unsigned char client_cert_der_1024[] = { 0x30, 0x82, 0x03, 0xA5, 0x30, 0x82, 0x03, 0x0E, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0xE8, 0xFF, 0xC9, 0x07, @@ -170,10 +170,10 @@ const unsigned char client_cert_der_1024[] = 0xB9, 0x24, 0xF6, 0x0A, 0x18, 0x20, 0x44, 0xCB, 0x78, 0x2E, 0x77, 0x3F, 0xBF, 0x22, 0xEF, 0xBC, 0xB4 }; -const int sizeof_client_cert_der_1024 = sizeof(client_cert_der_1024); +static const int sizeof_client_cert_der_1024 = sizeof(client_cert_der_1024); /* ./certs/1024/dh1024.der, 1024-bit */ -const unsigned char dh_key_der_1024[] = +static const unsigned char dh_key_der_1024[] = { 0x30, 0x81, 0x87, 0x02, 0x81, 0x81, 0x00, 0xA4, 0xD2, 0xB8, 0x6E, 0x78, 0xF5, 0xD9, 0xED, 0x2D, 0x7C, 0xDD, 0xB6, 0x16, @@ -190,10 +190,10 @@ const unsigned char dh_key_der_1024[] = 0x8C, 0x63, 0x0A, 0xAD, 0xC7, 0x10, 0xEA, 0xC7, 0xA1, 0xB9, 0x9D, 0xF2, 0xA8, 0x37, 0x73, 0x02, 0x01, 0x02 }; -const int sizeof_dh_key_der_1024 = sizeof(dh_key_der_1024); +static const int sizeof_dh_key_der_1024 = sizeof(dh_key_der_1024); /* ./certs/1024/dsa1024.der, 1024-bit */ -const unsigned char dsa_key_der_1024[] = +static const unsigned char dsa_key_der_1024[] = { 0x30, 0x82, 0x01, 0xBC, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0xF7, 0x4B, 0xF9, 0xBB, 0x15, 0x98, 0xEB, 0xDD, 0xDE, @@ -241,10 +241,10 @@ const unsigned char dsa_key_der_1024[] = 0x3B, 0xA1, 0x19, 0x75, 0xDF, 0x9B, 0xF5, 0x72, 0x53, 0x4F, 0x39, 0xE1, 0x1C, 0xEC, 0x13, 0x84, 0x82, 0x18 }; -const int sizeof_dsa_key_der_1024 = sizeof(dsa_key_der_1024); +static const int sizeof_dsa_key_der_1024 = sizeof(dsa_key_der_1024); /* ./certs/1024/rsa1024.der, 1024-bit */ -const unsigned char rsa_key_der_1024[] = +static const unsigned char rsa_key_der_1024[] = { 0x30, 0x82, 0x02, 0x5D, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0xBE, 0x70, 0x70, 0xB8, 0x04, 0x18, 0xE5, 0x28, 0xFE, @@ -308,12 +308,12 @@ const unsigned char rsa_key_der_1024[] = 0xB9, 0x9E, 0xD5, 0x5B, 0x2E, 0x87, 0x1C, 0x58, 0xD0, 0x37, 0x89, 0x96, 0xEC, 0x48, 0x54, 0xF5, 0x9F, 0x0F, 0xB3 }; -const int sizeof_rsa_key_der_1024 = sizeof(rsa_key_der_1024); +static const int sizeof_rsa_key_der_1024 = sizeof(rsa_key_der_1024); #elif defined(USE_CERT_BUFFERS_2048) /* ./certs/client-key.der, 2048-bit */ -const unsigned char client_key_der_2048[] = +static const unsigned char client_key_der_2048[] = { 0x30, 0x82, 0x04, 0xA4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, 0xC3, 0x03, 0xD1, 0x2B, 0xFE, 0x39, 0xA4, 0x32, @@ -436,10 +436,10 @@ const unsigned char client_key_der_2048[] = 0x45, 0x5D, 0x13, 0x39, 0x65, 0x42, 0x46, 0xA1, 0x9F, 0xCD, 0xF5, 0xBF }; -const int sizeof_client_key_der_2048 = sizeof(client_key_der_2048); +static const int sizeof_client_key_der_2048 = sizeof(client_key_der_2048); /* ./certs/client-cert.der, 2048-bit */ -const unsigned char client_cert_der_2048[] = +static const unsigned char client_cert_der_2048[] = { 0x30, 0x82, 0x04, 0xAA, 0x30, 0x82, 0x03, 0x92, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0xCD, 0x6C, 0xD6, 0x7E, @@ -562,10 +562,10 @@ const unsigned char client_cert_der_2048[] = 0x55, 0xF4, 0xCF, 0xA9, 0x21, 0xB7, 0x3E, 0x42, 0xE1, 0xD8, 0x11, 0x57, 0xE5, 0x40, 0xF1, 0x66, 0x95, 0xDF }; -const int sizeof_client_cert_der_2048 = sizeof(client_cert_der_2048); +static const int sizeof_client_cert_der_2048 = sizeof(client_cert_der_2048); /* ./certs/dh2048.der, 2048-bit */ -const unsigned char dh_key_der_2048[] = +static const unsigned char dh_key_der_2048[] = { 0x30, 0x82, 0x01, 0x08, 0x02, 0x82, 0x01, 0x01, 0x00, 0xB0, 0xA1, 0x08, 0x06, 0x9C, 0x08, 0x13, 0xBA, 0x59, 0x06, 0x3C, @@ -595,10 +595,10 @@ const unsigned char dh_key_der_2048[] = 0xC3, 0xA9, 0x41, 0x83, 0xFB, 0xC7, 0xFA, 0xC8, 0xE2, 0x1E, 0x7E, 0xAF, 0x00, 0x3F, 0x93, 0x02, 0x01, 0x02 }; -const int sizeof_dh_key_der_2048 = sizeof(dh_key_der_2048); +static const int sizeof_dh_key_der_2048 = sizeof(dh_key_der_2048); /* ./certs/dsa2048.der, 2048-bit */ -const unsigned char dsa_key_der_2048[] = +static const unsigned char dsa_key_der_2048[] = { 0x30, 0x82, 0x03, 0x3F, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, 0xCC, 0x8E, 0xC9, 0xA0, 0xD5, 0x9A, 0x27, 0x1C, @@ -685,10 +685,10 @@ const unsigned char dsa_key_der_2048[] = 0x3E, 0x75, 0x13, 0x13, 0x06, 0x8F, 0x94, 0xD3, 0xE6, 0xE9, 0x00, 0xCB, 0x62, 0x6D, 0x9A }; -const int sizeof_dsa_key_der_2048 = sizeof(dsa_key_der_2048); +static const int sizeof_dsa_key_der_2048 = sizeof(dsa_key_der_2048); /* ./certs/rsa2048.der, 2048-bit */ -const unsigned char rsa_key_der_2048[] = +static const unsigned char rsa_key_der_2048[] = { 0x30, 0x82, 0x04, 0xA3, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, 0xE9, 0x8A, 0x5D, 0x15, 0xA4, 0xD4, 0x34, 0xB9, @@ -811,10 +811,10 @@ const unsigned char rsa_key_der_2048[] = 0x83, 0x0B, 0xD4, 0x74, 0x80, 0xB6, 0x7D, 0x62, 0x45, 0xBF, 0x56 }; -const int sizeof_rsa_key_der_2048 = sizeof(rsa_key_der_2048); +static const int sizeof_rsa_key_der_2048 = sizeof(rsa_key_der_2048); /* ./certs/ca-cert.der, 2048-bit */ -const unsigned char ca_cert_der_2048[] = +static const unsigned char ca_cert_der_2048[] = { 0x30, 0x82, 0x04, 0xAA, 0x30, 0x82, 0x03, 0x92, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0xFA, 0x7D, 0x38, 0x9A, @@ -937,10 +937,10 @@ const unsigned char ca_cert_der_2048[] = 0xFC, 0x1D, 0x28, 0xF5, 0x59, 0xFD, 0xDE, 0xBD, 0x3D, 0x73, 0xDD, 0xB4, 0x9F, 0x2E, 0x77, 0xC0, 0x75, 0x41 }; -const int sizeof_ca_cert_der_2048 = sizeof(ca_cert_der_2048); +static const int sizeof_ca_cert_der_2048 = sizeof(ca_cert_der_2048); /* ./certs/server-key.der, 2048-bit */ -const unsigned char server_key_der_2048[] = +static const unsigned char server_key_der_2048[] = { 0x30, 0x82, 0x04, 0xA5, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, 0xC0, 0x95, 0x08, 0xE1, 0x57, 0x41, 0xF2, 0x71, @@ -1063,10 +1063,10 @@ const unsigned char server_key_der_2048[] = 0x7C, 0x9A, 0x1F, 0x0C, 0x7C, 0xA9, 0xB0, 0x0E, 0x21, 0x37, 0x3B, 0xF1, 0xB0 }; -const int sizeof_server_key_der_2048 = sizeof(server_key_der_2048); +static const int sizeof_server_key_der_2048 = sizeof(server_key_der_2048); /* ./certs/server-cert.der, 2048-bit */ -const unsigned char server_cert_der_2048[] = +static const unsigned char server_cert_der_2048[] = { 0x30, 0x82, 0x04, 0x9E, 0x30, 0x82, 0x03, 0x86, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x30, 0x0D, 0x06, 0x09, @@ -1188,7 +1188,7 @@ const unsigned char server_cert_der_2048[] = 0xD2, 0x49, 0x17, 0x43, 0x5D, 0x2F, 0x64, 0x01, 0x3B, 0x6A, 0x09, 0x44, 0xA6, 0xE2, 0x1E, 0x04 }; -const int sizeof_server_cert_der_2048 = sizeof(server_cert_der_2048); +static const int sizeof_server_cert_der_2048 = sizeof(server_cert_der_2048); #endif /* USE_CERT_BUFFERS_1024 */ From 6db33051d3054ca96a2a44f886de4581c87e2b3f Mon Sep 17 00:00:00 2001 From: toddouska Date: Fri, 1 May 2015 14:44:43 -0700 Subject: [PATCH 058/350] better detection of invalid ecc keys --- wolfcrypt/src/ecc.c | 77 +++++++++++++++++++++++++++++++++ wolfcrypt/src/error.c | 3 ++ wolfcrypt/src/integer.c | 6 ++- wolfcrypt/src/tfm.c | 5 ++- wolfssl/wolfcrypt/error-crypt.h | 1 + wolfssl/wolfcrypt/tfm.h | 2 +- 6 files changed, 91 insertions(+), 3 deletions(-) diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index a4c8adc5a..82b74bf5f 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -1734,9 +1734,14 @@ int wc_ecc_sign_hash(const byte* in, word32 inlen, byte* out, word32 *outlen, /* make up a key and export the public copy */ if (err == MP_OKAY) { + int loop_check = 0; ecc_key pubkey; wc_ecc_init(&pubkey); for (;;) { + if (++loop_check > 64) { + err = RNG_FAILURE_E; + break; + } err = wc_ecc_make_key_ex(rng, &pubkey, key->dp); if (err != MP_OKAY) break; @@ -2311,6 +2316,72 @@ int wc_ecc_export_x963_ex(ecc_key* key, byte* out, word32* outLen, int compresse } +/* is pubkey point on curve ? */ +static int ecc_is_point(ecc_key* key) +{ + mp_int prime, b, t1, t2; + int err; + + if ((err = mp_init_multi(&prime, &b, &t1, &t2, NULL, NULL)) != MP_OKAY) { + return err; + } + + /* load prime and b */ + err = mp_read_radix(&prime, key->dp->prime, 16); + if (err == MP_OKAY) + err = mp_read_radix(&b, key->dp->Bf, 16); + + /* compute y^2 */ + if (err == MP_OKAY) + err = mp_sqr(key->pubkey.y, &t1); + + /* compute x^3 */ + if (err == MP_OKAY) + err = mp_sqr(key->pubkey.x, &t2); + if (err == MP_OKAY) + err = mp_mod(&t2, &prime, &t2); + if (err == MP_OKAY) + err = mp_mul(key->pubkey.x, &t2, &t2); + + /* compute y^2 - x^3 */ + if (err == MP_OKAY) + err = mp_sub(&t1, &t2, &t1); + + /* compute y^2 - x^3 + 3x */ + if (err == MP_OKAY) + err = mp_add(&t1, key->pubkey.x, &t1); + if (err == MP_OKAY) + err = mp_add(&t1, key->pubkey.x, &t1); + if (err == MP_OKAY) + err = mp_add(&t1, key->pubkey.x, &t1); + if (err == MP_OKAY) + err = mp_mod(&t1, &prime, &t1); + + while (err == MP_OKAY && mp_cmp_d(&t1, 0) == MP_LT) { + err = mp_add(&t1, &prime, &t1); + } + while (err == MP_OKAY && mp_cmp(&t1, &prime) != MP_LT) { + err = mp_sub(&t1, &prime, &t1); + } + + /* compare to b */ + if (err == MP_OKAY) { + if (mp_cmp(&t1, &b) != MP_EQ) { + err = MP_VAL; + } else { + err = MP_OKAY; + } + } + + mp_clear(&prime); + mp_clear(&b); + mp_clear(&t1); + mp_clear(&t2); + + return err; +} + + /* import public ECC key in ANSI X9.63 format */ int wc_ecc_import_x963(const byte* in, word32 inLen, ecc_key* key) { @@ -2445,6 +2516,12 @@ int wc_ecc_import_x963(const byte* in, word32 inLen, ecc_key* key) if (err == MP_OKAY) mp_set(key->pubkey.z, 1); + if (err == MP_OKAY) { + err = ecc_is_point(key); + if (err != MP_OKAY) + err = IS_POINT_E; + } + if (err != MP_OKAY) { mp_clear(key->pubkey.x); mp_clear(key->pubkey.y); diff --git a/wolfcrypt/src/error.c b/wolfcrypt/src/error.c index 48da1ba40..dc2917e0d 100644 --- a/wolfcrypt/src/error.c +++ b/wolfcrypt/src/error.c @@ -319,6 +319,9 @@ const char* wc_GetErrorString(int error) case MAC_CMP_FAILED_E: return "MAC comparison failed"; + case IS_POINT_E: + return "ECC is point on curve failed"; + default: return "unknown error number"; diff --git a/wolfcrypt/src/integer.c b/wolfcrypt/src/integer.c index b68ec7ea7..eaf538283 100644 --- a/wolfcrypt/src/integer.c +++ b/wolfcrypt/src/integer.c @@ -866,7 +866,7 @@ int mp_invmod (mp_int * a, mp_int * b, mp_int * c) int fast_mp_invmod (mp_int * a, mp_int * b, mp_int * c) { mp_int x, y, u, v, B, D; - int res, neg; + int res, neg, loop_check = 0; /* 2. [modified] b must be odd */ if (mp_iseven (b) == 1) { @@ -958,6 +958,10 @@ top: /* if not zero goto step 4 */ if (mp_iszero (&u) == 0) { + if (++loop_check > 1024) { + res = MP_VAL; + goto LBL_ERR; + } goto top; } diff --git a/wolfcrypt/src/tfm.c b/wolfcrypt/src/tfm.c index 994fcc9ae..526891772 100755 --- a/wolfcrypt/src/tfm.c +++ b/wolfcrypt/src/tfm.c @@ -863,11 +863,12 @@ top: return FP_OKAY; } + /* c = 1/a (mod b) for odd b only */ int fp_invmod(fp_int *a, fp_int *b, fp_int *c) { fp_int x, y, u, v, B, D; - int neg; + int neg, loop_check = 0; /* 2. [modified] b must be odd */ if (fp_iseven (b) == FP_YES) { @@ -931,6 +932,8 @@ top: /* if not zero goto step 4 */ if (fp_iszero (&u) == FP_NO) { + if (++loop_check > 1024) /* bad input */ + return FP_VAL; goto top; } diff --git a/wolfssl/wolfcrypt/error-crypt.h b/wolfssl/wolfcrypt/error-crypt.h index e172e6aec..65eb9eed8 100644 --- a/wolfssl/wolfcrypt/error-crypt.h +++ b/wolfssl/wolfcrypt/error-crypt.h @@ -147,6 +147,7 @@ enum { THREAD_STORE_SET_E = -212, /* Thread local storage key set failure */ MAC_CMP_FAILED_E = -213, /* MAC comparison failed */ + IS_POINT_E = -214, /* ECC is point on curve failed */ MIN_CODE_E = -300 /* errors -101 - -299 */ }; diff --git a/wolfssl/wolfcrypt/tfm.h b/wolfssl/wolfcrypt/tfm.h index a928a2ac6..6c8969307 100644 --- a/wolfssl/wolfcrypt/tfm.h +++ b/wolfssl/wolfcrypt/tfm.h @@ -366,7 +366,7 @@ typedef struct { /* zero/even/odd ? */ #define fp_iszero(a) (((a)->used == 0) ? FP_YES : FP_NO) -#define fp_iseven(a) (((a)->used >= 0 && (((a)->dp[0] & 1) == 0)) ? FP_YES : FP_NO) +#define fp_iseven(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 0)) ? FP_YES : FP_NO) #define fp_isodd(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 1)) ? FP_YES : FP_NO) /* set to a small digit */ From 1571ced095efdc13b0f23c050f1c28b83353e898 Mon Sep 17 00:00:00 2001 From: toddouska Date: Sun, 3 May 2015 10:19:02 -0700 Subject: [PATCH 059/350] update python example to TLSv1.2 against example server --- swig/README | 6 +++--- swig/runme.py | 11 +++++++---- swig/wolfssl.i | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/swig/README b/swig/README index bd4f7f7cf..d71cdb2b5 100644 --- a/swig/README +++ b/swig/README @@ -16,14 +16,14 @@ Please send questions to support@wolfssl.com sudo make install -2) start the example echoserver from the root directory - ./examples/echoserver/echoserver +2) start the example server from the root directory + ./examples/server/server -d 3) run ./PythonBuild.sh from this directory it will a) build the swig wrapper file b) compile the swig wrapper and wolfssl wrapper files c) place them into a wolfssl shared library for python - d) run runme.py which will connect to the wolfSSL echo server, write a + d) run runme.py which will connect to the wolfSSL server, write a string, then read the result and output it diff --git a/swig/runme.py b/swig/runme.py index cb2ddf11f..90fc43159 100644 --- a/swig/runme.py +++ b/swig/runme.py @@ -3,13 +3,13 @@ import wolfssl print "" -print "Trying to connect to the echo server..." +print "Trying to connect to the example server -d..." wolfssl.wolfSSL_Init() #wolfssl.wolfSSL_Debugging_ON() -ctx = wolfssl.wolfSSL_CTX_new(wolfssl.wolfTLSv1_client_method()) +ctx = wolfssl.wolfSSL_CTX_new(wolfssl.wolfTLSv1_2_client_method()) if ctx == None: - print "Couldn't get SSL CTX for TLSv1" + print "Couldn't get SSL CTX for TLSv1.2" exit(-1) ret = wolfssl.wolfSSL_CTX_load_verify_locations(ctx, "../certs/ca-cert.pem", None) @@ -24,7 +24,10 @@ ret = wolfssl.wolfSSL_swig_connect(ssl, "localhost", 11111) if ret != wolfssl.SSL_SUCCESS: print "Couldn't do SSL connect" err = wolfssl.wolfSSL_get_error(ssl, 0) - print "error string = ", wolfssl.wolfSSL_error_string(err) + if ret == -2: + print "tcp error, is example server running?" + else: + print "error string = ", wolfssl.wolfSSL_error_string(err) exit(-1) print "...Connected" diff --git a/swig/wolfssl.i b/swig/wolfssl.i index 45dc693d3..a03e79cbc 100644 --- a/swig/wolfssl.i +++ b/swig/wolfssl.i @@ -33,7 +33,7 @@ %} -WOLFSSL_METHOD* wolfTLSv1_client_method(void); +WOLFSSL_METHOD* wolfTLSv1_2_client_method(void); WOLFSSL_CTX* wolfSSL_CTX_new(WOLFSSL_METHOD*); int wolfSSL_CTX_load_verify_locations(WOLFSSL_CTX*, const char*, const char*); WOLFSSL* wolfSSL_new(WOLFSSL_CTX*); From 20851c62f995f0ec4d308bfd8c00138d4f5b8716 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Tue, 5 May 2015 14:45:43 -0700 Subject: [PATCH 060/350] modify Encrypt and Decrypt switch statements for single return --- src/internal.c | 55 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/src/internal.c b/src/internal.c index a398bf412..974718427 100644 --- a/src/internal.c +++ b/src/internal.c @@ -5472,6 +5472,8 @@ static int ChachaAEADDecrypt(WOLFSSL* ssl, byte* plain, const byte* input, static INLINE int Encrypt(WOLFSSL* ssl, byte* out, const byte* input, word16 sz) { + int ret = 0; + (void)out; (void)input; (void)sz; @@ -5495,18 +5497,19 @@ static INLINE int Encrypt(WOLFSSL* ssl, byte* out, const byte* input, word16 sz) #ifdef BUILD_DES3 case wolfssl_triple_des: - return wc_Des3_CbcEncrypt(ssl->encrypt.des3, out, input, sz); + ret = wc_Des3_CbcEncrypt(ssl->encrypt.des3, out, input, sz); + break; #endif #ifdef BUILD_AES case wolfssl_aes: - return wc_AesCbcEncrypt(ssl->encrypt.aes, out, input, sz); + ret = wc_AesCbcEncrypt(ssl->encrypt.aes, out, input, sz); + break; #endif #ifdef BUILD_AESGCM case wolfssl_aes_gcm: { - int gcmRet; byte additional[AEAD_AUTH_DATA_SZ]; byte nonce[AEAD_NONCE_SZ]; const byte* additionalSrc = input - 5; @@ -5535,17 +5538,16 @@ static INLINE int Encrypt(WOLFSSL* ssl, byte* out, const byte* input, word16 sz) ssl->keys.aead_enc_imp_IV, AEAD_IMP_IV_SZ); XMEMCPY(nonce + AEAD_IMP_IV_SZ, ssl->keys.aead_exp_IV, AEAD_EXP_IV_SZ); - gcmRet = wc_AesGcmEncrypt(ssl->encrypt.aes, + ret = wc_AesGcmEncrypt(ssl->encrypt.aes, out + AEAD_EXP_IV_SZ, input + AEAD_EXP_IV_SZ, sz - AEAD_EXP_IV_SZ - ssl->specs.aead_mac_size, nonce, AEAD_NONCE_SZ, out + sz - ssl->specs.aead_mac_size, ssl->specs.aead_mac_size, additional, AEAD_AUTH_DATA_SZ); - if (gcmRet == 0) + if (ret == 0) AeadIncrementExpIV(ssl); ForceZero(nonce, AEAD_NONCE_SZ); - return gcmRet; } break; #endif @@ -5602,17 +5604,20 @@ static INLINE int Encrypt(WOLFSSL* ssl, byte* out, const byte* input, word16 sz) #ifdef HAVE_HC128 case wolfssl_hc128: - return wc_Hc128_Process(ssl->encrypt.hc128, out, input, sz); + ret = wc_Hc128_Process(ssl->encrypt.hc128, out, input, sz); + break; #endif #ifdef BUILD_RABBIT case wolfssl_rabbit: - return wc_RabbitProcess(ssl->encrypt.rabbit, out, input, sz); + ret = wc_RabbitProcess(ssl->encrypt.rabbit, out, input, sz); + break; #endif #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) case wolfssl_chacha: - return ChachaAEADEncrypt(ssl, out, input, sz); + ret = ChachaAEADEncrypt(ssl, out, input, sz); + break; #endif #ifdef HAVE_NULL_CIPHER @@ -5625,10 +5630,10 @@ static INLINE int Encrypt(WOLFSSL* ssl, byte* out, const byte* input, word16 sz) default: WOLFSSL_MSG("wolfSSL Encrypt programming error"); - return ENCRYPT_ERROR; + ret = ENCRYPT_ERROR; } - return 0; + return ret; } @@ -5636,6 +5641,8 @@ static INLINE int Encrypt(WOLFSSL* ssl, byte* out, const byte* input, word16 sz) static INLINE int Decrypt(WOLFSSL* ssl, byte* plain, const byte* input, word16 sz) { + int ret = 0; + (void)plain; (void)input; (void)sz; @@ -5654,12 +5661,14 @@ static INLINE int Decrypt(WOLFSSL* ssl, byte* plain, const byte* input, #ifdef BUILD_DES3 case wolfssl_triple_des: - return wc_Des3_CbcDecrypt(ssl->decrypt.des3, plain, input, sz); + ret = wc_Des3_CbcDecrypt(ssl->decrypt.des3, plain, input, sz); + break; #endif #ifdef BUILD_AES case wolfssl_aes: - return wc_AesCbcDecrypt(ssl->decrypt.aes, plain, input, sz); + ret = wc_AesCbcDecrypt(ssl->decrypt.aes, plain, input, sz); + break; #endif #ifdef BUILD_AESGCM @@ -5695,8 +5704,7 @@ static INLINE int Decrypt(WOLFSSL* ssl, byte* plain, const byte* input, ssl->specs.aead_mac_size, additional, AEAD_AUTH_DATA_SZ) < 0) { SendAlert(ssl, alert_fatal, bad_record_mac); - ForceZero(nonce, AEAD_NONCE_SZ); - return VERIFY_MAC_ERROR; + ret = VERIFY_MAC_ERROR; } ForceZero(nonce, AEAD_NONCE_SZ); } @@ -5736,8 +5744,7 @@ static INLINE int Decrypt(WOLFSSL* ssl, byte* plain, const byte* input, ssl->specs.aead_mac_size, additional, AEAD_AUTH_DATA_SZ) < 0) { SendAlert(ssl, alert_fatal, bad_record_mac); - ForceZero(nonce, AEAD_NONCE_SZ); - return VERIFY_MAC_ERROR; + ret = VERIFY_MAC_ERROR; } ForceZero(nonce, AEAD_NONCE_SZ); } @@ -5752,17 +5759,20 @@ static INLINE int Decrypt(WOLFSSL* ssl, byte* plain, const byte* input, #ifdef HAVE_HC128 case wolfssl_hc128: - return wc_Hc128_Process(ssl->decrypt.hc128, plain, input, sz); + ret = wc_Hc128_Process(ssl->decrypt.hc128, plain, input, sz); + break; #endif #ifdef BUILD_RABBIT case wolfssl_rabbit: - return wc_RabbitProcess(ssl->decrypt.rabbit, plain, input, sz); + ret = wc_RabbitProcess(ssl->decrypt.rabbit, plain, input, sz); + break; #endif #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) case wolfssl_chacha: - return ChachaAEADDecrypt(ssl, plain, input, sz); + ret = ChachaAEADDecrypt(ssl, plain, input, sz); + break; #endif #ifdef HAVE_NULL_CIPHER @@ -5775,9 +5785,10 @@ static INLINE int Decrypt(WOLFSSL* ssl, byte* plain, const byte* input, default: WOLFSSL_MSG("wolfSSL Decrypt programming error"); - return DECRYPT_ERROR; + ret = DECRYPT_ERROR; } - return 0; + + return ret; } From fc24885f175c6597574accddb2f696aba6677387 Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Wed, 6 May 2015 11:57:32 -0600 Subject: [PATCH 061/350] updated subject matter for server-ecc.pem --- certs/renewcerts.sh | 2 +- certs/server-ecc.pem | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/certs/renewcerts.sh b/certs/renewcerts.sh index 33fcfcb2e..5bcce22a9 100755 --- a/certs/renewcerts.sh +++ b/certs/renewcerts.sh @@ -132,7 +132,7 @@ function run_renewcerts(){ echo "Updating server-ecc.pem" echo "" #pipe the following arguments to openssl req... - echo -e "US\nMontana\nBozeman\nwolfSSL\nProgramming\nwww.wolfssl.com\ninfo@wolfssl.com\n.\n.\n" | openssl req -new -key ecc-key.pem -nodes -out server-ecc.csr + echo -e "US\nOregon\nPortland\nEliptic\nECC\nwww.wolfssl.com\ninfo@wolfssl.com\n.\n.\n" | openssl req -new -key ecc-key.pem -nodes -out server-ecc.csr openssl x509 -req -in server-ecc.csr -days 1000 -extfile wolfssl.cnf -extensions wolfssl_opts -signkey ecc-key.pem -out server-ecc.pem diff --git a/certs/server-ecc.pem b/certs/server-ecc.pem index 26beb0be9..ff509a0fa 100644 --- a/certs/server-ecc.pem +++ b/certs/server-ecc.pem @@ -1,8 +1,9 @@ Certificate: Data: Version: 3 (0x2) - Serial Number: 9356926451288716285 (0x81da7b08468533fd) - Signature Algorithm: ecdsa-with-SHA1 + Serial Number: + 81:da:7b:08:46:85:33:fd + Signature Algorithm: ecdsa-with-SHA1 Issuer: C=US, ST=Montana, L=Bozeman, O=wolfSSL, OU=Programming, CN=www.wolfssl.com/emailAddress=info@wolfssl.com Validity Not Before: Feb 5 06:33:30 2015 GMT @@ -10,7 +11,7 @@ Certificate: Subject: C=US, ST=Montana, L=Bozeman, O=wolfSSL, OU=Programming, CN=www.wolfssl.com/emailAddress=info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey - Public-Key: (256 bit) + EC Public Key: pub: 04:bb:33:ac:4c:27:50:4a:c6:4a:a5:04:c3:3c:de: 9f:36:db:72:2d:ce:94:ea:2b:fa:cb:20:09:39:2c: @@ -29,10 +30,10 @@ Certificate: X509v3 Basic Constraints: CA:TRUE Signature Algorithm: ecdsa-with-SHA1 - 30:45:02:21:00:a0:70:22:57:ad:97:06:b5:9b:fa:5a:1c:b2: - 77:ed:54:09:7d:9a:5c:ca:02:56:d7:32:1d:41:e6:d5:5a:09: - 29:02:20:4e:95:75:27:3d:3c:93:ba:97:3f:f4:2d:35:3e:c8: - 57:75:e1:81:3d:5e:09:bf:86:a2:8b:ef:0b:d1:77:4f:b5 + 30:45:02:21:00:a0:70:22:57:ad:97:06:b5:9b:fa:5a:1c:b2: + 77:ed:54:09:7d:9a:5c:ca:02:56:d7:32:1d:41:e6:d5:5a:09: + 29:02:20:4e:95:75:27:3d:3c:93:ba:97:3f:f4:2d:35:3e:c8: + 57:75:e1:81:3d:5e:09:bf:86:a2:8b:ef:0b:d1:77:4f:b5 -----BEGIN CERTIFICATE----- MIIDHDCCAsOgAwIBAgIJAIHaewhGhTP9MAkGByqGSM49BAEwgZQxCzAJBgNVBAYT AlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRAwDgYDVQQK From 08b6e66ea84f9684903f7a616722d548952852c0 Mon Sep 17 00:00:00 2001 From: toddouska Date: Thu, 7 May 2015 10:02:43 -0700 Subject: [PATCH 062/350] add external site script test to make check --- examples/client/client.c | 27 +++++++++++++++++++-------- scripts/external.test | 20 ++++++++++++++++++++ scripts/include.am | 1 + 3 files changed, 40 insertions(+), 8 deletions(-) create mode 100755 scripts/external.test diff --git a/examples/client/client.c b/examples/client/client.c index cc49afe85..afdbc2d86 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -173,6 +173,9 @@ static void Usage(void) #ifdef HAVE_ANON printf("-a Anonymous client\n"); #endif +#ifdef HAVE_CRL + printf("-C Disable CRL\n"); +#endif } THREAD_RETURN WOLFSSL_THREAD client_test(void* args) @@ -208,7 +211,8 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) int doPeerCheck = 1; int nonBlocking = 0; int resumeSession = 0; - int wc_shutdown = 0; + int wc_shutdown = 0; + int disableCRL = 0; int ret; int scr = 0; /* allow secure renegotiation */ int forceScr = 0; /* force client initiaed scr */ @@ -262,11 +266,12 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) (void)verifyCert; (void)useClientCert; (void)overrideDateErrors; + (void)disableCRL; StackTrap(); while ((ch = mygetopt(argc, argv, - "?gdDusmNrwRitfxUPh:p:v:l:A:c:k:b:zS:L:ToO:a")) != -1) { + "?gdDusmNrwRitfxUPCh:p:v:l:A:c:k:b:zS:L:ToO:a")) != -1) { switch (ch) { case '?' : Usage(); @@ -284,6 +289,10 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) overrideDateErrors = 1; break; + case 'C' : + disableCRL = 1; + break; + case 'u' : doDTLS = 1; break; @@ -723,12 +732,14 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) wolfSSL_set_fd(ssl, sockfd); #ifdef HAVE_CRL - if (wolfSSL_EnableCRL(ssl, WOLFSSL_CRL_CHECKALL) != SSL_SUCCESS) - err_sys("can't enable crl check"); - if (wolfSSL_LoadCRL(ssl, crlPemDir, SSL_FILETYPE_PEM, 0) != SSL_SUCCESS) - err_sys("can't load crl, check crlfile and date validity"); - if (wolfSSL_SetCRL_Cb(ssl, CRL_CallBack) != SSL_SUCCESS) - err_sys("can't set crl callback"); + if (disableCRL == 0) { + if (wolfSSL_EnableCRL(ssl, WOLFSSL_CRL_CHECKALL) != SSL_SUCCESS) + err_sys("can't enable crl check"); + if (wolfSSL_LoadCRL(ssl, crlPemDir, SSL_FILETYPE_PEM, 0) != SSL_SUCCESS) + err_sys("can't load crl, check crlfile and date validity"); + if (wolfSSL_SetCRL_Cb(ssl, CRL_CallBack) != SSL_SUCCESS) + err_sys("can't set crl callback"); + } #endif #ifdef HAVE_SECURE_RENEGOTIATION if (scr) { diff --git a/scripts/external.test b/scripts/external.test new file mode 100755 index 000000000..9b2668d80 --- /dev/null +++ b/scripts/external.test @@ -0,0 +1,20 @@ +#!/bin/bash + +# external.test + +server=www.wolfssl.com +ca=./certs/wolfssl-website-ca.pem + +[ ! -x ./examples/client/client ] && echo -e "\n\nClient doesn't exist" && exit 1 + +# is our desired server there? +ping -c 2 -i 0.2 $server +RESULT=$? +[ $RESULT -ne 0 ] && echo -e "\n\nCouldn't find $server, skipping" && exit 0 + +# client test against the server +./examples/client/client -C -h $server -p 443 -g -A $ca +RESULT=$? +[ $RESULT -ne 0 ] && echo -e "\n\nClient connection failed" && exit 1 + +exit 0 diff --git a/scripts/include.am b/scripts/include.am index 2a98f97e0..091f3d7a4 100644 --- a/scripts/include.am +++ b/scripts/include.am @@ -10,6 +10,7 @@ endif if BUILD_EXAMPLES dist_noinst_SCRIPTS+= scripts/resume.test +dist_noinst_SCRIPTS+= scripts/external.test endif EXTRA_DIST += scripts/testsuite.pcap From 7a90f60a9ce20d9f82486f2af55239246b4d1f46 Mon Sep 17 00:00:00 2001 From: toddouska Date: Thu, 7 May 2015 10:33:23 -0700 Subject: [PATCH 063/350] add rsafunction mp_exptmod_e debug message --- wolfcrypt/src/rsa.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/wolfcrypt/src/rsa.c b/wolfcrypt/src/rsa.c index c9562b1ad..1a5021783 100644 --- a/wolfcrypt/src/rsa.c +++ b/wolfcrypt/src/rsa.c @@ -388,9 +388,12 @@ static int wc_RsaFunction(const byte* in, word32 inLen, byte* out, /* convert */ if (mp_to_unsigned_bin(&tmp, out) != MP_OKAY) ERROR_OUT(MP_TO_E); - -done: + +done: mp_clear(&tmp); + if (ret == MP_EXPTMOD_E) { + WOLFSSL_MSG("RSA_FUNCTION MP_EXPTMOD_E: memory/config problem"); + } return ret; } From 173b1147b50e876ae458ac288f4ab8281c8dc205 Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Thu, 7 May 2015 12:21:50 -0600 Subject: [PATCH 064/350] updated certs --- certs/1024/client-cert.der | Bin 937 -> 969 bytes certs/1024/client-cert.pem | 75 +++---- certs/ca-cert.der | Bin 1198 -> 1198 bytes certs/ca-cert.pem | 60 +++--- certs/client-cert.der | Bin 1198 -> 1230 bytes certs/client-cert.pem | 99 ++++----- certs/client-ecc-cert.der | Bin 800 -> 780 bytes certs/client-ecc-cert.pem | 60 +++--- certs/crl/cliCrl.pem | 62 +++--- certs/crl/crl.pem | 56 ++--- certs/crl/crl.revoked | 58 +++--- certs/crl/eccCliCRL.pem | 32 +-- certs/crl/eccSrvCRL.pem | 32 +-- certs/renewcerts.sh | 10 +- certs/server-cert.der | Bin 1186 -> 1186 bytes certs/server-cert.pem | 120 +++++------ certs/server-ecc-comp.pem | 59 +++--- certs/server-ecc-rsa.pem | 60 +++--- certs/server-ecc.pem | 63 +++--- gencertbuf.pl | 31 ++- wolfssl/certs_test.h | 411 +++++++++++++++++++------------------ 21 files changed, 659 insertions(+), 629 deletions(-) diff --git a/certs/1024/client-cert.der b/certs/1024/client-cert.der index d7bf4ed87bd135f346bc1fba664e3cf9b2cdcc6c..c2bd6df8fe58e67cfaf20cb20bce0bd93a31726b 100644 GIT binary patch delta 480 zcmZ3)FR?K>|cBR4C9LF2rM z4~+~(4TRa4Ls__Zc*^s0(t?A1;tdUqObjIr#6iN`JOTkl`RPT8xw)Bn>AE1P$ySUu z6Zf;pm>QTHS{NA`7)FWn8d?|_8XH2n6c~Juy@`?Cpox)rvMiIL_GLEaP+4V`#?uCk zCmKW=Gx>kqzkA+9^J;o&Ve9cyfy~G^3mca#XuKcgmZ%o*xDd-XBtJ;xcRO8rWG@ORGZd@g>G zH(T}Z$QaxWntnxwlfl>`{`3m5e!=ZKE~GsS(fDk?KP$h?Ln|&!clkM)4=i`Z_p((e p=3d)4yVP*f!GBkJucYfUORM*;{%>G?xL*0m>gb6NrPH3h1pvb+qj>-T delta 447 zcmX@fzLH(bpow{@K@&6I0%j&gCMHgX7ynPP@A&Q!WWdYDsnzDu_MMlJk(HIfpmECN zdL|=v0RuiZ=1>+c9`^G5oV4IzA43rXA&>|+4|hOOetJ=2Zf<5?`eZ*w8znh$UPDs@ zBLhbf_=YjG-HEzP1|$2 zu4$#t`*+qKUVLG!2nY<7cAtGGO5mAg%dCaE%x5->y);srZp;7Xq`x4C;bIwi^UDk@ zPG?S%I)_nz2CD106V3SIRF3v diff --git a/certs/1024/client-cert.pem b/certs/1024/client-cert.pem index fc5f15a4a..2f13e8e25 100644 --- a/certs/1024/client-cert.pem +++ b/certs/1024/client-cert.pem @@ -1,13 +1,13 @@ Certificate: Data: Version: 3 (0x2) - Serial Number: 16789358970865666130 (0xe8ffc907b8f74852) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=US, ST=Montana, L=Bozeman, O=wolfSSL, OU=Programming, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Serial Number: 16417767964199037690 (0xe3d7a0fa76df2afa) + Signature Algorithm: sha256WithRSAEncryption + Issuer: C=US, ST=Montana, L=Bozeman, O=wolfSSL_1024, OU=Programming-1024, CN=www.wolfssl.com/emailAddress=info@wolfssl.com Validity - Not Before: Feb 5 06:33:30 2015 GMT - Not After : Nov 1 06:33:30 2017 GMT - Subject: C=US, ST=Montana, L=Bozeman, O=wolfSSL, OU=Programming, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 18:21:01 2015 GMT + Not After : Jan 31 18:21:01 2018 GMT + Subject: C=US, ST=Montana, L=Bozeman, O=wolfSSL_1024, OU=Programming-1024, CN=www.wolfssl.com/emailAddress=info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (1024 bit) @@ -27,39 +27,40 @@ Certificate: 81:69:0F:F8:DF:DD:CF:34:29:D5:67:75:71:85:C7:75:10:69:59:EC X509v3 Authority Key Identifier: keyid:81:69:0F:F8:DF:DD:CF:34:29:D5:67:75:71:85:C7:75:10:69:59:EC - DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL/OU=Programming/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:E8:FF:C9:07:B8:F7:48:52 + DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_1024/OU=Programming-1024/CN=www.wolfssl.com/emailAddress=info@wolfssl.com + serial:E3:D7:A0:FA:76:DF:2A:FA X509v3 Basic Constraints: CA:TRUE - Signature Algorithm: sha1WithRSAEncryption - 70:be:fb:3c:29:5d:53:ba:96:bc:cb:7e:82:a9:2c:ef:ee:3b: - f0:e8:f4:01:78:50:51:55:1b:47:9b:dc:5a:10:e6:39:84:9a: - a1:2d:03:cc:b3:16:e9:32:26:97:3d:0f:ec:c9:4f:11:08:31: - a3:1c:1f:37:d3:00:04:42:cc:c9:34:14:3a:e1:f2:f9:be:2e: - bf:64:47:3e:46:95:09:a5:3b:4c:4a:7b:23:0e:3c:54:01:d4: - 55:fa:53:f0:65:6e:68:4b:cc:e3:83:5f:fe:9e:c8:e7:f6:e1: - c8:88:bb:b9:24:f6:0a:18:20:44:cb:78:2e:77:3f:bf:22:ef: - bc:b4 + Signature Algorithm: sha256WithRSAEncryption + 1d:b7:d5:7c:e1:b1:d8:c0:67:5d:b5:d3:88:e7:50:29:71:63: + 8f:cc:26:1f:33:09:55:43:9b:ab:c6:1b:bc:c7:01:95:1a:fa: + 65:e0:fd:9c:eb:6f:0a:0f:14:ec:b5:2f:dc:1c:30:dd:52:97: + d4:1c:09:00:33:38:5f:cb:a8:16:8f:11:b7:b8:d0:66:e1:54: + 28:f3:3f:bf:6a:6f:76:48:2a:5e:56:a7:ce:1c:f0:04:dd:17: + bd:06:78:21:6d:d6:b1:9b:75:31:92:c1:fe:d4:8d:d4:67:2f: + 03:1b:27:8d:ab:ff:30:3b:c3:7f:23:e4:ab:5b:91:e1:1b:66: + e6:ed -----BEGIN CERTIFICATE----- -MIIDpTCCAw6gAwIBAgIJAOj/yQe490hSMA0GCSqGSIb3DQEBBQUAMIGUMQswCQYD -VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEQMA4G -A1UECgwHd29sZlNTTDEUMBIGA1UECwwLUHJvZ3JhbW1pbmcxGDAWBgNVBAMMD3d3 -dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTAe -Fw0xNTAyMDUwNjMzMzBaFw0xNzExMDEwNjMzMzBaMIGUMQswCQYDVQQGEwJVUzEQ -MA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEQMA4GA1UECgwHd29s -ZlNTTDEUMBIGA1UECwwLUHJvZ3JhbW1pbmcxGDAWBgNVBAMMD3d3dy53b2xmc3Ns -LmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCBnzANBgkqhkiG -9w0BAQEFAAOBjQAwgYkCgYEAvHMOqEnzdKKp7xil2lWZIfnI7LNtSOU1NXV3N+zR -YZBfPtnk1d+UysGp1xnahsnoTcRhNoL+q61+dyW7jRGlvGI6qDjMOaIEZrT39/Oq -2k0CDrtejWlI3HfJKA4i6WukJrpM6MH9Sm8rH++KrvaQYuVkHusrPGfI3CcA9pFo -ZakCAwEAAaOB/DCB+TAdBgNVHQ4EFgQUgWkP+N/dzzQp1Wd1cYXHdRBpWewwgckG -A1UdIwSBwTCBvoAUgWkP+N/dzzQp1Wd1cYXHdRBpWeyhgZqkgZcwgZQxCzAJBgNV -BAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRAwDgYD -VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtQcm9ncmFtbWluZzEYMBYGA1UEAwwPd3d3 -LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggkA -6P/JB7j3SFIwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQBwvvs8KV1T -upa8y36CqSzv7jvw6PQBeFBRVRtHm9xaEOY5hJqhLQPMsxbpMiaXPQ/syU8RCDGj -HB830wAEQszJNBQ64fL5vi6/ZEc+RpUJpTtMSnsjDjxUAdRV+lPwZW5oS8zjg1/+ -nsjn9uHIiLu5JPYKGCBEy3gudz+/Iu+8tA== +MIIDxTCCAy6gAwIBAgIJAOPXoPp23yr6MA0GCSqGSIb3DQEBCwUAMIGeMQswCQYD +VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEVMBMG +A1UECgwMd29sZlNTTF8xMDI0MRkwFwYDVQQLDBBQcm9ncmFtbWluZy0xMDI0MRgw +FgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s +ZnNzbC5jb20wHhcNMTUwNTA3MTgyMTAxWhcNMTgwMTMxMTgyMTAxWjCBnjELMAkG +A1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFTAT +BgNVBAoMDHdvbGZTU0xfMTAyNDEZMBcGA1UECwwQUHJvZ3JhbW1pbmctMTAyNDEY +MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv +bGZzc2wuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8cw6oSfN0oqnv +GKXaVZkh+cjss21I5TU1dXc37NFhkF8+2eTV35TKwanXGdqGyehNxGE2gv6rrX53 +JbuNEaW8YjqoOMw5ogRmtPf386raTQIOu16NaUjcd8koDiLpa6Qmukzowf1Kbysf +74qu9pBi5WQe6ys8Z8jcJwD2kWhlqQIDAQABo4IBBzCCAQMwHQYDVR0OBBYEFIFp +D/jf3c80KdVndXGFx3UQaVnsMIHTBgNVHSMEgcswgciAFIFpD/jf3c80KdVndXGF +x3UQaVnsoYGkpIGhMIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQ +MA4GA1UEBwwHQm96ZW1hbjEVMBMGA1UECgwMd29sZlNTTF8xMDI0MRkwFwYDVQQL +DBBQcm9ncmFtbWluZy0xMDI0MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAd +BgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CCQDj16D6dt8q+jAMBgNVHRME +BTADAQH/MA0GCSqGSIb3DQEBCwUAA4GBAB231XzhsdjAZ12104jnUClxY4/MJh8z +CVVDm6vGG7zHAZUa+mXg/ZzrbwoPFOy1L9wcMN1Sl9QcCQAzOF/LqBaPEbe40Gbh +VCjzP79qb3ZIKl5Wp84c8ATdF70GeCFt1rGbdTGSwf7UjdRnLwMbJ42r/zA7w38j +5KtbkeEbZubt -----END CERTIFICATE----- diff --git a/certs/ca-cert.der b/certs/ca-cert.der index 1626809849dbb69dc4ba4d8094a7d52d666da523..d0eab7a3ce08847c4bc6c9160c266eaa3289778b 100644 GIT binary patch delta 359 zcmZ3-xsFrapowLbK@;<&1)FR?K>|cBR4C<#CtO) z?q`!QH83}{FfueSj1uQHv@kFTYdi`(ys-p8qFC)>=LdXsB>7rpb?#e96i_2tJ(5C2x^(}LJ&$hDs)G%zCyytkN=S1cg_p_dat<5?u&uji9ZtwH?SKrLF zkx-reQ9q#ewc+WH$x3s>|9oyykUGZRK1pq!s6?bO+nwJVww1+xJg9#{KWWZ^YxiEK zmVb^}cDO@*TIrTAA!q;VD(X%9z+UYAa`L1J_mXZdwqBE`60h#Hc}l^5E(7uBbw>TE H+e;$=v1^;I delta 359 zcmZ3-xsFrapowLbK@;<&18VV0_AWo2M)Vq|2{VdA;B$!+0{ zNPdpYwU>hQ-i21|-CcO;`u2a-{9SvpRR3Pdm0iv7XzsNcih@fVAMkoFv8dPMxz=#U z;QDzNvMmj?R>^6$O9T(-q`x6Ico IKTzrj0NB`=kpKVy diff --git a/certs/ca-cert.pem b/certs/ca-cert.pem index d98a51a5b..6eacbebd0 100644 --- a/certs/ca-cert.pem +++ b/certs/ca-cert.pem @@ -1,12 +1,12 @@ Certificate: Data: Version: 3 (0x2) - Serial Number: 18049645117592769049 (0xfa7d389a73fb1219) - Signature Algorithm: sha1WithRSAEncryption + Serial Number: 15672591315981621815 (0xd9803ac3d2f4da37) + Signature Algorithm: sha256WithRSAEncryption Issuer: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com/emailAddress=info@wolfssl.com Validity - Not Before: Feb 5 06:33:30 2015 GMT - Not After : Nov 1 06:33:30 2017 GMT + Not Before: May 7 18:21:01 2015 GMT + Not After : Jan 31 18:21:01 2018 GMT Subject: C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com/emailAddress=info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,32 +37,32 @@ Certificate: X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:FA:7D:38:9A:73:FB:12:19 + serial:D9:80:3A:C3:D2:F4:DA:37 X509v3 Basic Constraints: CA:TRUE - Signature Algorithm: sha1WithRSAEncryption - 2c:02:0c:de:b2:46:a1:d8:59:0f:08:69:ad:d2:52:2e:ee:55: - 78:bd:bb:71:d2:d7:b7:fe:7b:0f:8a:bc:6a:25:fd:d4:6d:1d: - ab:00:e2:9d:d6:98:21:11:a4:41:e0:0d:4b:a4:38:7f:2e:0c: - d6:80:dc:30:d7:cf:19:1b:43:2f:e7:b3:99:74:9c:b4:01:69: - b1:c3:9b:9f:4a:89:2f:60:38:cb:7c:a1:78:93:38:5c:a8:ca: - 46:0d:23:2d:99:a3:cf:0a:49:38:eb:07:06:57:cd:4a:55:35: - 04:08:36:30:ca:75:69:4b:9a:84:08:c9:23:78:a9:f0:80:ce: - 8a:25:bb:31:07:0e:11:e6:4a:95:8c:53:df:85:d9:48:45:cb: - 5a:ef:de:92:c2:88:0e:da:ff:31:6b:4e:52:53:5f:f3:a8:3a: - 42:f8:e1:0d:0a:c0:84:af:ec:21:b3:a7:98:b0:c8:6b:77:04: - ef:f5:06:a5:51:3b:20:6f:bf:55:80:8c:cf:d4:78:ee:a2:d9: - e3:52:34:9a:17:3d:87:10:4d:23:21:38:9b:35:f7:18:ac:34: - bd:18:ae:a4:e2:32:2f:5d:a4:41:4c:bc:aa:88:b7:9e:45:14: - 92:e9:e8:ee:fc:1d:28:f5:59:fd:de:bd:3d:73:dd:b4:9f:2e: - 77:c0:75:41 + Signature Algorithm: sha256WithRSAEncryption + 7a:af:44:3b:aa:6f:53:42:b2:33:aa:43:5f:56:30:d3:b9:96: + 0b:9a:55:5a:39:2a:0b:4e:e4:2e:f1:95:66:c9:86:36:82:8d: + 63:7c:4d:a2:ee:48:ba:03:c7:90:d7:a7:c6:74:60:48:5f:31: + a2:f9:5e:3e:c3:82:e1:e5:2f:41:81:83:29:25:79:d1:53:00: + 69:3c:ed:0a:30:3b:41:1d:92:a1:2c:a8:9d:2c:e3:23:87:79: + e0:55:6e:91:a8:50:da:46:2f:c2:20:50:3e:2b:47:97:14:b0: + 7d:04:ba:45:51:d0:6e:e1:5a:a2:4b:84:9c:4d:cd:85:04:f9: + 28:31:82:93:bc:c7:59:49:91:03:e8:df:6a:e4:56:ad:6a:cb: + 1f:0d:37:e4:5e:bd:e7:9f:d5:ec:9d:3c:18:25:9b:f1:2f:50: + 7d:eb:31:cb:f1:63:22:9d:57:fc:f3:84:20:1a:c6:07:87:92: + 26:9e:15:18:59:33:06:dc:fb:b0:b6:76:5d:f1:c1:2f:c8:2f: + 62:9c:c0:d6:de:eb:65:77:f3:5c:a6:c3:88:27:96:75:b4:f4: + 54:cd:ff:2d:21:2e:96:f0:07:73:4b:e9:93:92:90:de:62:d9: + a3:3b:ac:6e:24:5f:27:4a:b3:94:70:ff:30:17:e7:7e:32:8f: + 65:b7:75:58 -----BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIJAPp9OJpz+xIZMA0GCSqGSIb3DQEBBQUAMIGUMQswCQYD +MIIEqjCCA5KgAwIBAgIJANmAOsPS9No3MA0GCSqGSIb3DQEBCwUAMIGUMQswCQYD VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3 dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTAe -Fw0xNTAyMDUwNjMzMzBaFw0xNzExMDEwNjMzMzBaMIGUMQswCQYDVQQGEwJVUzEQ +Fw0xNTA1MDcxODIxMDFaFw0xODAxMzExODIxMDFaMIGUMQswCQYDVQQGEwJVUzEQ MA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwIU2F3 dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xmc3Ns LmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCCASIwDQYJKoZI @@ -76,11 +76,11 @@ XDjNdyXvvYB1U5Q8PcpjW58VtdMdEy8Z0TzbdjrMuH3J5cLX2kBv2CHccxtCLVOc J45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYTAlVTMRAwDgYD VQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhTYXd0b290 aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29t -MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggkA+n04mnP7EhkwDAYD -VR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEALAIM3rJGodhZDwhprdJSLu5V -eL27cdLXt/57D4q8aiX91G0dqwDindaYIRGkQeANS6Q4fy4M1oDcMNfPGRtDL+ez -mXSctAFpscObn0qJL2A4y3yheJM4XKjKRg0jLZmjzwpJOOsHBlfNSlU1BAg2MMp1 -aUuahAjJI3ip8IDOiiW7MQcOEeZKlYxT34XZSEXLWu/eksKIDtr/MWtOUlNf86g6 -QvjhDQrAhK/sIbOnmLDIa3cE7/UGpVE7IG+/VYCMz9R47qLZ41I0mhc9hxBNIyE4 -mzX3GKw0vRiupOIyL12kQUy8qoi3nkUUkuno7vwdKPVZ/d69PXPdtJ8ud8B1QQ== +MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggkA2YA6w9L02jcwDAYD +VR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAeq9EO6pvU0KyM6pDX1Yw07mW +C5pVWjkqC07kLvGVZsmGNoKNY3xNou5IugPHkNenxnRgSF8xovlePsOC4eUvQYGD +KSV50VMAaTztCjA7QR2SoSyonSzjI4d54FVukahQ2kYvwiBQPitHlxSwfQS6RVHQ +buFaokuEnE3NhQT5KDGCk7zHWUmRA+jfauRWrWrLHw035F6955/V7J08GCWb8S9Q +fesxy/FjIp1X/POEIBrGB4eSJp4VGFkzBtz7sLZ2XfHBL8gvYpzA1t7rZXfzXKbD +iCeWdbT0VM3/LSEulvAHc0vpk5KQ3mLZozusbiRfJ0qzlHD/MBfnfjKPZbd1WA== -----END CERTIFICATE----- diff --git a/certs/client-cert.der b/certs/client-cert.der index ea1f65e4012c856d88d69fc032b32a99c4b8f09b..9a7e0bf9bf6b9edb2118975ff81afcc53f5ebdee 100644 GIT binary patch delta 571 zcmZ3-d5%-dpo!&_K@;<)1W#hAp%-o(gm(8S0*c_EV`&t*2|P+4V` z#?uCkCnld`l3-u5q;Vm+#!t3lwB~L?1jpnaW~q8^RtDxKMn;CfY0G8QVr3>AGnzk5 z^pouK$#d3}hE4seP_WuHi*v*0Ps}TB-_hSA-(I!&O8-^Q>2)?CYc@XqV9EQBbC&Wq zqh*efdlO#ly~kjdZ}-wMe`WIVRadJ&Ke6uf?v z-{Q7JMw5!~n)TB+FE`o7b#H5773VU$YfTZI>2r=|B<*6mX1V*c)qw}e^2d4R2(`WW zZkd%h`GT>?u~6%6=NqDXoZmaUaNA6_TXDOfke1@xC4sv(~A;wb2IbOC;KtlD9MTQ8k!my z8JHTF85X6j@=Mr-aSgr_I3VV0_AWo2M)Vq|2fb4)EhD-osdyZT?0jd^mD ztzOq6rjvW$on8L@h_$=1w18v1dg=eN%4Hm)3_siMPuz57=C6M{Ur!Ew$#|js!HvAl zHy5k1sXlz!UGp#Yx@FX%?~lIS%PM1%s1v(z;WB5>B#T9->Q?ML!{PHGa+Rv-&daN0 z1Z3`TU#(C4Gw0*fkLTR~hApr;=zA*U41>O1X`i@*h$rLjrN4u?_V4CYyt2$VLgStB zoqs>dj(q9cot`m0`dF26>)our9wt`VcaLnh%-NlsXBZpZyVpki)=8@cmh$(y&dAjk zsal8q@7}#WYI%yzj|E3Q6@-5{Z{bmsvncCP=$G>=6}Q_taXq{t82;4ZW7^dF02;{H ANB{r; diff --git a/certs/client-cert.pem b/certs/client-cert.pem index 37bc42fcb..569cdddac 100644 --- a/certs/client-cert.pem +++ b/certs/client-cert.pem @@ -1,13 +1,13 @@ Certificate: Data: Version: 3 (0x2) - Serial Number: 14802441915251815387 (0xcd6cd67ec6eff3db) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=US, ST=Montana, L=Bozeman, O=wolfSSL, OU=Programming, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Serial Number: 12260966172072242701 (0xaa27b3c5a9726e0d) + Signature Algorithm: sha256WithRSAEncryption + Issuer: C=US, ST=Montana, L=Bozeman, O=wolfSSL_2048, OU=Programming-2048, CN=www.wolfssl.com/emailAddress=info@wolfssl.com Validity - Not Before: Feb 5 06:33:30 2015 GMT - Not After : Nov 1 06:33:30 2017 GMT - Subject: C=US, ST=Montana, L=Bozeman, O=wolfSSL, OU=Programming, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 18:21:01 2015 GMT + Not After : Jan 31 18:21:01 2018 GMT + Subject: C=US, ST=Montana, L=Bozeman, O=wolfSSL_2048, OU=Programming-2048, CN=www.wolfssl.com/emailAddress=info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) @@ -36,51 +36,52 @@ Certificate: 33:D8:45:66:D7:68:87:18:7E:54:0D:70:27:91:C7:26:D7:85:65:C0 X509v3 Authority Key Identifier: keyid:33:D8:45:66:D7:68:87:18:7E:54:0D:70:27:91:C7:26:D7:85:65:C0 - DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL/OU=Programming/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:CD:6C:D6:7E:C6:EF:F3:DB + DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_2048/OU=Programming-2048/CN=www.wolfssl.com/emailAddress=info@wolfssl.com + serial:AA:27:B3:C5:A9:72:6E:0D X509v3 Basic Constraints: CA:TRUE - Signature Algorithm: sha1WithRSAEncryption - 7e:41:65:73:cd:18:5a:2f:4d:ab:fe:5a:3c:37:63:82:3d:2e: - 8a:a2:02:c9:bd:ee:cd:a7:f7:c4:3b:47:33:1b:10:41:7f:27: - 75:ff:76:79:a6:08:15:00:f9:86:df:91:b2:cc:99:fa:fe:b9: - eb:93:55:e9:01:d0:77:e0:d8:6e:b3:d9:a3:26:06:25:e1:e9: - 8b:7c:fe:5d:d7:39:5a:c2:f7:e2:f6:de:6a:76:02:18:7e:16: - d0:d0:d3:09:8c:92:38:a2:ca:7e:a8:b9:cc:08:4c:f0:59:aa: - 25:35:b9:d3:aa:1c:10:1c:dc:0b:d5:61:fc:9c:f1:95:f1:ce: - 47:fd:56:a0:3c:c1:4d:ca:54:cc:00:2f:3e:75:8e:17:40:14: - 49:01:bb:a5:fb:52:0a:bf:bb:09:21:d4:a6:33:58:28:ee:33: - dc:fe:f8:76:c4:f4:8e:bb:67:68:97:5b:c6:7a:23:85:dd:6a: - 8e:8c:02:05:1d:ee:e2:3d:b4:9c:bb:63:6e:31:5d:5b:8d:bd: - 3c:17:da:c9:3a:a0:39:1f:de:8a:cc:1e:7d:72:25:3b:56:ff: - 8b:bb:af:5a:a7:64:2c:f8:a0:c4:f2:70:57:f0:cf:38:48:7c: - 6c:a2:6a:e2:55:f4:cf:a9:21:b7:3e:42:e1:d8:11:57:e5:40: - f1:66:95:df + Signature Algorithm: sha256WithRSAEncryption + 51:96:a7:1c:26:5d:1c:90:c6:32:9f:96:15:f2:1d:e7:93:9c: + ac:75:56:95:fd:20:70:ab:45:6a:09:b0:f3:f2:03:a8:db:dc: + 2f:bc:1f:87:7a:a3:d4:8f:d5:49:97:7e:3c:54:ac:b1:e3:f0: + 39:0d:fe:09:9a:23:f6:32:a6:41:59:bd:60:e8:bd:de:00:36: + 6f:3e:e9:41:6f:a9:63:c7:aa:d5:7b:f3:e4:39:48:9e:f6:60: + c6:c6:86:d5:72:86:23:cd:f5:6a:63:53:a4:f8:fc:51:6a:cd: + 60:74:8e:a3:86:61:01:34:78:f7:29:97:b3:a7:34:b6:0a:de: + b5:71:7a:09:a6:3e:d6:82:58:89:67:9c:c5:68:62:ba:06:d6: + 39:bb:cb:3a:c0:e0:63:1f:c7:0c:9c:12:86:ec:f7:39:6a:61: + 93:d0:33:14:c6:55:3b:b6:cf:80:5b:8c:43:ef:43:44:0b:3c: + 93:39:a3:4e:15:d1:0b:5f:84:98:1d:cd:9f:a9:47:eb:3b:56: + 30:b6:76:92:c1:48:5f:bc:95:b0:50:1a:55:c8:4e:62:47:87: + 54:64:0c:9b:91:fa:43:b3:29:48:be:e6:12:eb:e3:44:c6:52: + e4:40:c6:83:95:1b:a7:65:27:69:73:2f:c8:a0:4d:7f:be:ea: + 9b:67:b2:7b -----BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIJAM1s1n7G7/PbMA0GCSqGSIb3DQEBBQUAMIGUMQswCQYD -VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEQMA4G -A1UECgwHd29sZlNTTDEUMBIGA1UECwwLUHJvZ3JhbW1pbmcxGDAWBgNVBAMMD3d3 -dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTAe -Fw0xNTAyMDUwNjMzMzBaFw0xNzExMDEwNjMzMzBaMIGUMQswCQYDVQQGEwJVUzEQ -MA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEQMA4GA1UECgwHd29s -ZlNTTDEUMBIGA1UECwwLUHJvZ3JhbW1pbmcxGDAWBgNVBAMMD3d3dy53b2xmc3Ns -LmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMMD0Sv+OaQyRTtTyIQrKnx0mr2qKlIHR9am -NrIHMo7Quml7xsNEntSBSP0taKKLZ7uhdcg2LErSG/eLus8N+e/s8YEee5sDR5q/ -Zcx/ZSRppugUiVvkNPfFsBST9Wd7Onp44QFWVpGmE0KN0jxAnEzv0YbfN1EbDKE7 -9fGjSjXk4c6W3xt+v06X0BDoqAgwga8gC0MUxXRntDKCb42GwohAmTaDuh5AciIX -11JlJHOwzu8Zza7/eGx7wBID1E5yDVBtO6M7o5lencjZDIWz2YrZVCbbbfqsu/8l -TMTRefRx04ZAGBOwY7VyTjDEl4SGLVYv1xX3f8Cu9fxb5fuhutMCAwEAAaOB/DCB -+TAdBgNVHQ4EFgQUM9hFZtdohxh+VA1wJ5HHJteFZcAwgckGA1UdIwSBwTCBvoAU -M9hFZtdohxh+VA1wJ5HHJteFZcChgZqkgZcwgZQxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRAwDgYDVQQKDAd3b2xmU1NM -MRQwEgYDVQQLDAtQcm9ncmFtbWluZzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29t -MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggkAzWzWfsbv89swDAYD -VR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAfkFlc80YWi9Nq/5aPDdjgj0u -iqICyb3uzaf3xDtHMxsQQX8ndf92eaYIFQD5ht+RssyZ+v6565NV6QHQd+DYbrPZ -oyYGJeHpi3z+Xdc5WsL34vbeanYCGH4W0NDTCYySOKLKfqi5zAhM8FmqJTW506oc -EBzcC9Vh/JzxlfHOR/1WoDzBTcpUzAAvPnWOF0AUSQG7pftSCr+7CSHUpjNYKO4z -3P74dsT0jrtnaJdbxnojhd1qjowCBR3u4j20nLtjbjFdW429PBfayTqgOR/eiswe -fXIlO1b/i7uvWqdkLPigxPJwV/DPOEh8bKJq4lX0z6khtz5C4dgRV+VA8WaV3w== +MIIEyjCCA7KgAwIBAgIJAKons8Wpcm4NMA0GCSqGSIb3DQEBCwUAMIGeMQswCQYD +VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEVMBMG +A1UECgwMd29sZlNTTF8yMDQ4MRkwFwYDVQQLDBBQcm9ncmFtbWluZy0yMDQ4MRgw +FgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s +ZnNzbC5jb20wHhcNMTUwNTA3MTgyMTAxWhcNMTgwMTMxMTgyMTAxWjCBnjELMAkG +A1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFTAT +BgNVBAoMDHdvbGZTU0xfMjA0ODEZMBcGA1UECwwQUHJvZ3JhbW1pbmctMjA0ODEY +MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv +bGZzc2wuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwwPRK/45 +pDJFO1PIhCsqfHSavaoqUgdH1qY2sgcyjtC6aXvGw0Se1IFI/S1oootnu6F1yDYs +StIb94u6zw357+zxgR57mwNHmr9lzH9lJGmm6BSJW+Q098WwFJP1Z3s6enjhAVZW +kaYTQo3SPECcTO/Rht83URsMoTv18aNKNeThzpbfG36/TpfQEOioCDCBryALQxTF +dGe0MoJvjYbCiECZNoO6HkByIhfXUmUkc7DO7xnNrv94bHvAEgPUTnINUG07ozuj +mV6dyNkMhbPZitlUJttt+qy7/yVMxNF59HHThkAYE7BjtXJOMMSXhIYtVi/XFfd/ +wK71/Fvl+6G60wIDAQABo4IBBzCCAQMwHQYDVR0OBBYEFDPYRWbXaIcYflQNcCeR +xybXhWXAMIHTBgNVHSMEgcswgciAFDPYRWbXaIcYflQNcCeRxybXhWXAoYGkpIGh +MIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96 +ZW1hbjEVMBMGA1UECgwMd29sZlNTTF8yMDQ4MRkwFwYDVQQLDBBQcm9ncmFtbWlu +Zy0yMDQ4MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEW +EGluZm9Ad29sZnNzbC5jb22CCQCqJ7PFqXJuDTAMBgNVHRMEBTADAQH/MA0GCSqG +SIb3DQEBCwUAA4IBAQBRlqccJl0ckMYyn5YV8h3nk5ysdVaV/SBwq0VqCbDz8gOo +29wvvB+HeqPUj9VJl348VKyx4/A5Df4JmiP2MqZBWb1g6L3eADZvPulBb6ljx6rV +e/PkOUie9mDGxobVcoYjzfVqY1Ok+PxRas1gdI6jhmEBNHj3KZezpzS2Ct61cXoJ +pj7WgliJZ5zFaGK6BtY5u8s6wOBjH8cMnBKG7Pc5amGT0DMUxlU7ts+AW4xD70NE +CzyTOaNOFdELX4SYHc2fqUfrO1YwtnaSwUhfvJWwUBpVyE5iR4dUZAybkfpDsylI +vuYS6+NExlLkQMaDlRunZSdpcy/IoE1/vuqbZ7J7 -----END CERTIFICATE----- diff --git a/certs/client-ecc-cert.der b/certs/client-ecc-cert.der index d5231ba29ffb7c4a010269d9b45bb3d927610010..fa9a2483963e2c798bf6ac0a46e6168afb87b66e 100644 GIT binary patch literal 780 zcmXqLV&*VtVp_j|nTe5!iId@euT|j#rOA8-Tx=X#Z64=rS(up&8hZ`74LI4DLs{5_ znL>jN`3-nM91b2f|Dx3N{5(TG10Ik7I}dAcVoqwVp|F7g;UD zYrqW>mflJj#7@s=o}0b>!%^R_1=UyHsPsuTyovHzq{5t}GyB&2MW#Z|EoEZI!ltsF zVO+WQTd9=O_q{7OnJL8|kFDRbxbdq&<0k`IHs(-SJ{B<+k=IweBeSO_+6RVjWAW{D z>~M)${mG#55J+B`rE!-*|C--& aN4xNj*U_ldO@EA!oHO%Zeaylvrvm^*E92S# literal 800 zcmXqLVwN#zVmiElnTe5!iId^+r4_%wEncBzz{$q0)#h=|mW9!vaf%_g0Vf-CC<~h~ zQ)sZEfB_$f!@Vdr6Y%CAbzP0WLdaPhF0=jWsa2m2U`7zlxMar1Bo z6y>KECFbU4=A|1-7>I#HnR)oj%ggmZYKx0=^pf*)4do4F**LY@JlekVGIBDC31sG_ zDG&eLfFobdktFt2wgrPyp#K^`04r69Uc4j9A zmeBoQ_+0{K*`Axd{lih;uLadt-l+6RHoS@QS){_8q%-^0`$eWg&MjqP$HJzvonc(L z_gkry)AzkAH<>BLACIlyvbgb&LE}#YSvKZSSw0pq7LnIiyd$%xCfWyvZ)5T8bnI}6 zS^deN@gzuInWgcdLF2v#tZEiE&RWtqeUJuV6H+4O0eMB3h1GzWk?}uLl4bT_FmPp3 z2!8)b#M$I*!`>ICs&#LD>*-MT^|^Um%vRp1^whT3Uptr-8Lk(966xcVYuJ0xS@7=i X*udr94|z58EgYk*9^P}YYS9M(M;PwG diff --git a/certs/client-ecc-cert.pem b/certs/client-ecc-cert.pem index cca49cfd7..20905154c 100644 --- a/certs/client-ecc-cert.pem +++ b/certs/client-ecc-cert.pem @@ -1,13 +1,13 @@ Certificate: Data: Version: 3 (0x2) - Serial Number: 16416369391847057450 (0xe3d2a8fbf6a3a82a) - Signature Algorithm: ecdsa-with-SHA1 - Issuer: C=US, ST=Montana, L=Bozeman, O=wolfSSL, OU=Programming, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Serial Number: 16108595702940209934 (0xdf8d3a71e022930e) + Signature Algorithm: ecdsa-with-SHA256 + Issuer: C=US, ST=Oregon, L=Salem, O=Client ECC, OU=Fast, CN=www.wolfssl.com/emailAddress=info@wolfssl.com Validity - Not Before: Feb 5 06:33:30 2015 GMT - Not After : Nov 1 06:33:30 2017 GMT - Subject: C=US, ST=Montana, L=Bozeman, O=wolfSSL, OU=Programming, CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Not Before: May 7 18:21:01 2015 GMT + Not After : Jan 31 18:21:01 2018 GMT + Subject: C=US, ST=Oregon, L=Salem, O=Client ECC, OU=Fast, CN=www.wolfssl.com/emailAddress=info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) @@ -23,32 +23,32 @@ Certificate: EB:D4:4B:59:6B:95:61:3F:51:57:B6:04:4D:89:41:88:44:5C:AB:F2 X509v3 Authority Key Identifier: keyid:EB:D4:4B:59:6B:95:61:3F:51:57:B6:04:4D:89:41:88:44:5C:AB:F2 - DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL/OU=Programming/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:E3:D2:A8:FB:F6:A3:A8:2A + DirName:/C=US/ST=Oregon/L=Salem/O=Client ECC/OU=Fast/CN=www.wolfssl.com/emailAddress=info@wolfssl.com + serial:DF:8D:3A:71:E0:22:93:0E X509v3 Basic Constraints: CA:TRUE - Signature Algorithm: ecdsa-with-SHA1 - 30:45:02:20:53:ef:f2:14:43:34:cd:80:bd:e8:ca:7b:2d:da: - f6:8c:88:23:4d:4c:d9:c7:16:3d:1f:42:75:ca:b6:eb:f5:88: - 02:21:00:d7:73:f2:14:8e:09:1e:80:bd:c1:43:11:dd:a7:5d: - 51:a7:4b:e1:0d:28:2f:38:41:5b:3a:e1:de:44:3a:84:2f + Signature Algorithm: ecdsa-with-SHA256 + 30:44:02:20:74:7b:ae:7e:9c:c8:69:95:8a:0b:ad:7f:c9:37: + 3d:3c:7f:b7:ef:f3:da:9b:ea:d0:a7:76:0a:a4:77:12:f7:a8: + 02:20:71:95:87:89:b7:a8:8b:bb:fa:9f:84:dc:2b:71:dc:4a: + c5:5a:65:b2:fc:33:c4:ce:36:4f:ab:c6:38:36:6c:88 -----BEGIN CERTIFICATE----- -MIIDHDCCAsOgAwIBAgIJAOPSqPv2o6gqMAkGByqGSM49BAEwgZQxCzAJBgNVBAYT -AlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRAwDgYDVQQK -DAd3b2xmU1NMMRQwEgYDVQQLDAtQcm9ncmFtbWluZzEYMBYGA1UEAwwPd3d3Lndv -bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTE1 -MDIwNTA2MzMzMFoXDTE3MTEwMTA2MzMzMFowgZQxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRAwDgYDVQQKDAd3b2xmU1NM -MRQwEgYDVQQLDAtQcm9ncmFtbWluZzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29t -MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMFkwEwYHKoZIzj0CAQYI -KoZIzj0DAQcDQgAEVb/0D0RQmj3Om7fwxU31cHvU7CSOGYDsWkyiJANiLJva76I1 -EkOEdhbGVpUGzAGpvfZ1GkL3vamyNiJfx11/tKOB/DCB+TAdBgNVHQ4EFgQU69RL -WWuVYT9RV7YETYlBiERcq/IwgckGA1UdIwSBwTCBvoAU69RLWWuVYT9RV7YETYlB -iERcq/KhgZqkgZcwgZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAw -DgYDVQQHDAdCb3plbWFuMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtQcm9n -cmFtbWluZzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkB -FhBpbmZvQHdvbGZzc2wuY29tggkA49Ko+/ajqCowDAYDVR0TBAUwAwEB/zAJBgcq -hkjOPQQBA0gAMEUCIFPv8hRDNM2AvejKey3a9oyII01M2ccWPR9Cdcq26/WIAiEA -13PyFI4JHoC9wUMR3addUadL4Q0oLzhBWzrh3kQ6hC8= +MIIDCDCCAq+gAwIBAgIJAN+NOnHgIpMOMAoGCCqGSM49BAMCMIGNMQswCQYDVQQG +EwJVUzEPMA0GA1UECAwGT3JlZ29uMQ4wDAYDVQQHDAVTYWxlbTETMBEGA1UECgwK +Q2xpZW50IEVDQzENMAsGA1UECwwERmFzdDEYMBYGA1UEAwwPd3d3LndvbGZzc2wu +Y29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTE1MDUwNzE4 +MjEwMVoXDTE4MDEzMTE4MjEwMVowgY0xCzAJBgNVBAYTAlVTMQ8wDQYDVQQIDAZP +cmVnb24xDjAMBgNVBAcMBVNhbGVtMRMwEQYDVQQKDApDbGllbnQgRUNDMQ0wCwYD +VQQLDARGYXN0MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0B +CQEWEGluZm9Ad29sZnNzbC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARV +v/QPRFCaPc6bt/DFTfVwe9TsJI4ZgOxaTKIkA2Ism9rvojUSQ4R2FsZWlQbMAam9 +9nUaQve9qbI2Il/HXX+0o4H1MIHyMB0GA1UdDgQWBBTr1EtZa5VhP1FXtgRNiUGI +RFyr8jCBwgYDVR0jBIG6MIG3gBTr1EtZa5VhP1FXtgRNiUGIRFyr8qGBk6SBkDCB +jTELMAkGA1UEBhMCVVMxDzANBgNVBAgMBk9yZWdvbjEOMAwGA1UEBwwFU2FsZW0x +EzARBgNVBAoMCkNsaWVudCBFQ0MxDTALBgNVBAsMBEZhc3QxGDAWBgNVBAMMD3d3 +dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIJ +AN+NOnHgIpMOMAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgdHuufpzI +aZWKC61/yTc9PH+37/Pam+rQp3YKpHcS96gCIHGVh4m3qIu7+p+E3Ctx3ErFWmWy +/DPEzjZPq8Y4NmyI -----END CERTIFICATE----- diff --git a/certs/crl/cliCrl.pem b/certs/crl/cliCrl.pem index 91d67ca73..da4e61795 100644 --- a/certs/crl/cliCrl.pem +++ b/certs/crl/cliCrl.pem @@ -1,39 +1,39 @@ Certificate Revocation List (CRL): Version 2 (0x1) - Signature Algorithm: sha1WithRSAEncryption - Issuer: /C=US/ST=Montana/L=Bozeman/O=wolfSSL/OU=Programming/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - Last Update: Feb 5 06:33:30 2015 GMT - Next Update: Nov 1 06:33:30 2017 GMT + Signature Algorithm: sha256WithRSAEncryption + Issuer: /C=US/ST=Montana/L=Bozeman/O=wolfSSL_2048/OU=Programming-2048/CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Last Update: May 7 18:21:01 2015 GMT + Next Update: Jan 31 18:21:01 2018 GMT CRL extensions: X509v3 CRL Number: 3 No Revoked Certificates. - Signature Algorithm: sha1WithRSAEncryption - 26:e3:36:93:9d:42:98:41:89:d5:9d:d7:e9:9f:e9:36:f7:93: - f9:c8:52:ab:d7:9d:a7:61:e6:81:63:d3:6f:d1:40:de:aa:ee: - 71:13:da:32:a8:2f:a2:f4:54:7e:27:1e:19:11:03:82:91:f6: - 73:e8:82:6c:89:b3:d4:41:39:84:dd:71:2d:45:a5:b9:1f:7e: - 3d:82:1f:f6:a9:1a:7f:98:2d:1b:86:62:1c:46:20:9c:4b:e3: - 79:ef:d9:65:50:47:51:ad:40:89:1c:2b:a9:1e:5d:57:04:ec: - 4d:82:2a:bd:e1:10:fd:26:f2:48:5d:b5:95:ab:d1:65:a2:3a: - 12:60:2c:d0:4e:2f:08:83:1d:8e:c2:c1:05:5e:6c:fb:b5:7b: - 5b:6c:f2:14:4d:2e:fd:a4:e8:3d:9f:15:bf:b0:d4:00:31:49: - 3e:ce:1d:1f:f7:7e:66:09:c5:a5:d4:13:a1:a1:2b:2d:b2:fa: - 62:16:11:8f:5c:eb:ec:6f:5a:ad:55:bb:bd:65:75:0c:ea:5c: - a5:3c:8c:8a:61:ae:94:68:11:53:d8:36:f1:96:aa:7e:b9:b3: - 90:b2:5b:50:d1:18:55:59:5a:89:7e:2e:3d:47:0f:67:08:f3: - be:14:72:24:6f:a9:ef:4b:a1:0a:bb:89:7b:14:11:8d:1a:f2: - 91:46:8f:b5 + Signature Algorithm: sha256WithRSAEncryption + a2:15:f0:cf:70:85:49:b9:5b:c1:af:2b:22:14:9d:ee:11:8d: + 93:2d:58:17:d8:f6:b6:1a:1a:25:a2:27:c9:6b:4f:b3:31:c7: + 2c:52:c4:53:59:19:ef:cf:91:ee:b5:19:28:37:49:9e:b6:e0: + 41:62:4c:9f:f1:34:bf:88:aa:ae:24:38:8d:29:0a:64:08:a8: + 68:f4:b5:28:73:d6:94:b9:0a:3f:7c:c1:22:72:be:14:ba:c9: + 1b:9d:26:af:78:c2:cf:5f:ff:1e:cc:25:c0:63:f1:9b:97:85: + 5c:c0:4d:14:ed:f9:ad:cb:02:7d:05:c7:5c:c1:7c:89:72:35: + 49:70:a8:b1:ae:91:96:77:9a:c6:cb:38:27:88:3f:f4:c8:ba: + c9:08:7f:dd:a6:41:82:62:65:a0:f2:0c:36:5a:d9:15:57:5e: + 66:c3:a2:ff:5e:4d:7c:bc:4b:7c:30:84:44:e3:06:34:a8:42: + 3b:d9:6a:04:4a:0b:e5:59:66:63:b9:7a:80:48:68:31:1c:aa: + 98:bc:09:0e:a7:83:5f:a7:00:f1:fb:78:bc:08:86:73:ef:53: + 25:b8:1b:5e:7c:77:a8:12:7b:52:7f:1e:63:bc:db:60:99:46: + ab:e1:2e:48:d1:28:40:68:1e:9e:a0:2f:14:04:66:b3:b1:b1: + 3b:d0:46:64 -----BEGIN X509 CRL----- -MIIB7jCB1wIBATANBgkqhkiG9w0BAQUFADCBlDELMAkGA1UEBhMCVVMxEDAOBgNV -BAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xEDAOBgNVBAoMB3dvbGZTU0wx -FDASBgNVBAsMC1Byb2dyYW1taW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20x -HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTE1MDIwNTA2MzMzMFoX -DTE3MTEwMTA2MzMzMFqgDjAMMAoGA1UdFAQDAgEDMA0GCSqGSIb3DQEBBQUAA4IB -AQAm4zaTnUKYQYnVndfpn+k295P5yFKr152nYeaBY9Nv0UDequ5xE9oyqC+i9FR+ -Jx4ZEQOCkfZz6IJsibPUQTmE3XEtRaW5H349gh/2qRp/mC0bhmIcRiCcS+N579ll -UEdRrUCJHCupHl1XBOxNgiq94RD9JvJIXbWVq9FlojoSYCzQTi8Igx2OwsEFXmz7 -tXtbbPIUTS79pOg9nxW/sNQAMUk+zh0f935mCcWl1BOhoSstsvpiFhGPXOvsb1qt -Vbu9ZXUM6lylPIyKYa6UaBFT2Dbxlqp+ubOQsltQ0RhVWVqJfi49Rw9nCPO+FHIk -b6nvS6EKu4l7FBGNGvKRRo+1 +MIIB+DCB4QIBATANBgkqhkiG9w0BAQsFADCBnjELMAkGA1UEBhMCVVMxEDAOBgNV +BAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFTATBgNVBAoMDHdvbGZTU0xf +MjA0ODEZMBcGA1UECwwQUHJvZ3JhbW1pbmctMjA0ODEYMBYGA1UEAwwPd3d3Lndv +bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0xNTA1 +MDcxODIxMDFaFw0xODAxMzExODIxMDFaoA4wDDAKBgNVHRQEAwIBAzANBgkqhkiG +9w0BAQsFAAOCAQEAohXwz3CFSblbwa8rIhSd7hGNky1YF9j2thoaJaInyWtPszHH +LFLEU1kZ78+R7rUZKDdJnrbgQWJMn/E0v4iqriQ4jSkKZAioaPS1KHPWlLkKP3zB +InK+FLrJG50mr3jCz1//HswlwGPxm5eFXMBNFO35rcsCfQXHXMF8iXI1SXCosa6R +lneaxss4J4g/9Mi6yQh/3aZBgmJloPIMNlrZFVdeZsOi/15NfLxLfDCEROMGNKhC +O9lqBEoL5VlmY7l6gEhoMRyqmLwJDqeDX6cA8ft4vAiGc+9TJbgbXnx3qBJ7Un8e +Y7zbYJlGq+EuSNEoQGgenqAvFARms7GxO9BGZA== -----END X509 CRL----- diff --git a/certs/crl/crl.pem b/certs/crl/crl.pem index 9924f6609..28311c760 100644 --- a/certs/crl/crl.pem +++ b/certs/crl/crl.pem @@ -1,39 +1,39 @@ Certificate Revocation List (CRL): Version 2 (0x1) - Signature Algorithm: sha1WithRSAEncryption + Signature Algorithm: sha256WithRSAEncryption Issuer: /C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - Last Update: Feb 5 06:33:30 2015 GMT - Next Update: Nov 1 06:33:30 2017 GMT + Last Update: May 7 18:21:01 2015 GMT + Next Update: Jan 31 18:21:01 2018 GMT CRL extensions: X509v3 CRL Number: 1 No Revoked Certificates. - Signature Algorithm: sha1WithRSAEncryption - 1e:a6:74:ca:6e:14:eb:4f:e7:94:fb:0f:36:4c:55:39:e1:29: - af:33:f1:83:fa:8c:64:ef:4d:8a:f4:90:a1:dd:8d:c4:c7:13: - 35:7e:a9:1c:ea:29:ef:5e:89:4a:38:b1:22:b4:c3:13:8a:41: - ed:a1:16:08:2f:17:69:b2:88:ca:21:c6:20:a3:d2:e1:33:b9: - 68:4a:11:7f:50:58:53:18:7b:90:86:dc:2d:9a:36:5b:d2:0d: - 28:dc:8e:8f:82:a1:6d:c9:e2:e4:a3:bb:f4:8d:12:c3:15:72: - d9:bd:74:98:4b:82:00:ed:96:9c:85:b1:36:45:28:48:e7:c2: - d0:9e:31:27:51:8b:ae:96:f3:bf:3f:4d:6c:31:6c:4b:7d:a2: - 63:47:d7:29:80:c0:17:1d:3e:48:3e:62:ad:a0:dc:50:e7:07: - f1:85:b4:b4:f9:85:77:d4:60:50:9a:7c:89:8b:c2:02:1f:ec: - 6a:ea:83:46:7d:66:c1:6d:aa:bc:a2:f9:6b:8e:74:2a:9d:96: - 16:3a:a3:66:d6:11:7e:83:2a:99:90:9c:54:a7:d6:b4:79:57: - 87:60:bc:6c:12:09:58:4e:89:1f:0a:82:52:67:aa:5e:f8:10: - 0f:37:d0:75:19:10:b5:5a:36:9d:89:ce:8d:ba:c2:b7:13:b0: - df:43:32:97 + Signature Algorithm: sha256WithRSAEncryption + 96:e2:b9:11:e0:e5:25:be:ab:69:e5:fa:8a:5c:7f:fc:6f:1d: + 8f:4a:54:70:f8:2e:87:fa:b0:f6:fd:3f:8f:9c:75:8a:eb:62: + cc:dd:2c:0a:8c:31:9e:30:3f:22:9b:91:50:6b:43:fd:32:8a: + 79:ea:0b:6b:68:6c:82:9c:79:da:20:95:83:25:5e:09:fc:57: + 2d:19:f9:bc:5a:67:95:98:65:dc:2d:91:13:2a:81:c2:6d:ff: + 12:48:6f:a4:ce:8a:b2:d3:19:b8:c2:86:e0:ba:91:3f:bb:ec: + c6:79:83:50:95:19:95:28:eb:ef:ff:bb:16:8f:3c:7d:4c:d1: + 3e:c3:82:22:8f:c5:e8:0e:b3:64:8f:5d:53:32:d5:98:64:9c: + 36:c4:6a:cf:68:21:4f:a8:4e:90:37:76:dc:05:70:66:2d:bc: + a0:d8:19:5c:96:90:d6:b9:09:56:46:07:be:3c:ae:08:bb:26: + 26:21:2c:d1:48:01:88:28:bc:21:a4:97:b7:3b:f0:7e:67:73: + 84:cf:21:43:e7:dd:53:9d:6a:59:c3:e5:98:c9:69:71:c3:e3: + 70:28:ba:f9:69:0a:af:78:e5:83:02:13:7e:08:70:8c:f3:8b: + 5d:96:b0:78:b9:d9:99:c5:1e:b7:45:dc:28:32:1a:d0:50:4b: + f4:41:92:19 -----BEGIN X509 CRL----- -MIIB7jCB1wIBATANBgkqhkiG9w0BAQUFADCBlDELMAkGA1UEBhMCVVMxEDAOBgNV +MIIB7jCB1wIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMxEDAOBgNV BAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3Ro MRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20x -HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTE1MDIwNTA2MzMzMFoX -DTE3MTEwMTA2MzMzMFqgDjAMMAoGA1UdFAQDAgEBMA0GCSqGSIb3DQEBBQUAA4IB -AQAepnTKbhTrT+eU+w82TFU54SmvM/GD+oxk702K9JCh3Y3ExxM1fqkc6invXolK -OLEitMMTikHtoRYILxdpsojKIcYgo9LhM7loShF/UFhTGHuQhtwtmjZb0g0o3I6P -gqFtyeLko7v0jRLDFXLZvXSYS4IA7ZachbE2RShI58LQnjEnUYuulvO/P01sMWxL -faJjR9cpgMAXHT5IPmKtoNxQ5wfxhbS0+YV31GBQmnyJi8ICH+xq6oNGfWbBbaq8 -ovlrjnQqnZYWOqNm1hF+gyqZkJxUp9a0eVeHYLxsEglYTokfCoJSZ6pe+BAPN9B1 -GRC1Wjadic6NusK3E7DfQzKX +HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTE1MDUwNzE4MjEwMVoX +DTE4MDEzMTE4MjEwMVqgDjAMMAoGA1UdFAQDAgEBMA0GCSqGSIb3DQEBCwUAA4IB +AQCW4rkR4OUlvqtp5fqKXH/8bx2PSlRw+C6H+rD2/T+PnHWK62LM3SwKjDGeMD8i +m5FQa0P9Mop56gtraGyCnHnaIJWDJV4J/FctGfm8WmeVmGXcLZETKoHCbf8SSG+k +zoqy0xm4wobgupE/u+zGeYNQlRmVKOvv/7sWjzx9TNE+w4Iij8XoDrNkj11TMtWY +ZJw2xGrPaCFPqE6QN3bcBXBmLbyg2BlclpDWuQlWRge+PK4IuyYmISzRSAGIKLwh +pJe3O/B+Z3OEzyFD591TnWpZw+WYyWlxw+NwKLr5aQqveOWDAhN+CHCM84tdlrB4 +udmZxR63RdwoMhrQUEv0QZIZ -----END X509 CRL----- diff --git a/certs/crl/crl.revoked b/certs/crl/crl.revoked index a6d3dedb8..60152d880 100644 --- a/certs/crl/crl.revoked +++ b/certs/crl/crl.revoked @@ -1,41 +1,41 @@ Certificate Revocation List (CRL): Version 2 (0x1) - Signature Algorithm: sha1WithRSAEncryption + Signature Algorithm: sha256WithRSAEncryption Issuer: /C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - Last Update: Feb 5 06:33:30 2015 GMT - Next Update: Nov 1 06:33:30 2017 GMT + Last Update: May 7 18:21:01 2015 GMT + Next Update: Jan 31 18:21:01 2018 GMT CRL extensions: X509v3 CRL Number: 2 Revoked Certificates: Serial Number: 01 - Revocation Date: Feb 5 06:33:30 2015 GMT - Signature Algorithm: sha1WithRSAEncryption - ae:3b:8e:88:bb:a6:9b:93:1a:41:91:73:b9:97:1c:f8:f4:a0: - a6:1c:58:24:52:15:d9:b5:14:35:8d:b6:e9:be:1c:01:e0:24: - ff:ec:2c:71:cc:a4:78:60:a6:eb:e2:5d:41:67:e1:21:d4:e8: - a8:f5:26:c6:69:25:38:c7:87:3f:6a:78:b5:16:14:d2:3f:17: - f1:aa:8d:41:5b:ba:8e:f5:49:e9:e9:d8:93:6f:0a:d2:fe:f6: - 7e:20:f4:76:8c:db:54:ef:42:16:91:75:27:2a:2d:0b:5e:aa: - f7:97:6c:6a:7d:37:e5:c8:31:aa:6b:bf:77:45:2a:01:67:91: - 73:e0:7a:d8:b4:a1:e6:08:e0:2c:4a:8d:a6:b3:eb:c6:24:2a: - 1f:d2:e2:1b:03:d4:0a:19:07:c0:dc:e3:c3:13:a7:48:66:fc: - da:09:ea:40:29:11:9e:e1:48:46:46:2f:05:87:d2:cb:ac:8d: - a5:43:1a:ef:2d:56:de:da:1e:34:9a:09:13:79:f7:95:ec:5b: - aa:28:ad:1e:b1:0e:e7:71:d9:12:45:a3:2c:df:17:52:37:34: - 5d:0b:c0:d5:df:2c:40:d6:e4:4f:a7:07:bd:a4:9c:f9:a7:f8: - bb:1e:bb:93:57:fc:20:57:0c:cc:99:5a:75:8c:83:3f:ba:97: - 96:1c:0e:67 + Revocation Date: May 7 18:21:01 2015 GMT + Signature Algorithm: sha256WithRSAEncryption + b7:34:2b:1c:09:6b:a2:9c:12:4f:fd:ef:69:4c:a4:1d:f2:39: + 52:29:98:78:b2:86:ea:54:9b:29:e5:c2:88:0e:2f:f9:d2:5b: + 9d:49:37:68:26:6c:45:61:d4:9d:05:ef:2d:ca:78:0a:d0:28: + c1:25:f2:f7:6a:ad:df:1d:eb:8a:66:64:4d:0c:02:91:fb:ff: + 70:b4:36:b6:e4:79:17:d5:18:6a:72:17:e1:8b:31:49:04:98: + 96:88:42:ea:8c:fe:91:40:5a:c5:ad:3b:da:9a:47:43:d6:e9: + f6:59:75:49:91:a9:e4:8b:c8:03:60:6b:36:69:87:71:f1:5b: + 92:00:51:bb:fe:d5:4f:0d:0e:f2:56:38:e3:b6:cb:76:11:7b: + 17:ad:a5:da:37:87:f2:49:af:73:42:56:ed:6c:a1:8d:46:5c: + dd:00:a7:8f:1f:5a:dd:d7:87:89:43:30:32:fe:e2:d4:b1:29: + 12:11:ef:22:0d:8f:7f:c5:33:3b:a9:a7:52:0c:25:b8:0c:e6: + 8a:8b:68:8f:55:84:65:04:c7:44:48:36:02:4d:4e:43:09:1d: + 1f:3b:f9:4a:0e:ff:59:42:ca:be:0e:a7:79:89:19:31:73:5a: + 45:6c:70:56:4d:1b:8a:59:c4:6d:ca:bc:f7:41:c4:f6:f0:fd: + 9c:7e:f1:7e -----BEGIN X509 CRL----- -MIICBDCB7QIBATANBgkqhkiG9w0BAQUFADCBlDELMAkGA1UEBhMCVVMxEDAOBgNV +MIICBDCB7QIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMxEDAOBgNV BAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3Ro MRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20x -HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTE1MDIwNTA2MzMzMFoX -DTE3MTEwMTA2MzMzMFowFDASAgEBFw0xNTAyMDUwNjMzMzBaoA4wDDAKBgNVHRQE -AwIBAjANBgkqhkiG9w0BAQUFAAOCAQEArjuOiLumm5MaQZFzuZcc+PSgphxYJFIV -2bUUNY226b4cAeAk/+wsccykeGCm6+JdQWfhIdToqPUmxmklOMeHP2p4tRYU0j8X -8aqNQVu6jvVJ6enYk28K0v72fiD0dozbVO9CFpF1JyotC16q95dsan035cgxqmu/ -d0UqAWeRc+B62LSh5gjgLEqNprPrxiQqH9LiGwPUChkHwNzjwxOnSGb82gnqQCkR -nuFIRkYvBYfSy6yNpUMa7y1W3toeNJoJE3n3lexbqiitHrEO53HZEkWjLN8XUjc0 -XQvA1d8sQNbkT6cHvaSc+af4ux67k1f8IFcMzJladYyDP7qXlhwOZw== +HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTE1MDUwNzE4MjEwMVoX +DTE4MDEzMTE4MjEwMVowFDASAgEBFw0xNTA1MDcxODIxMDFaoA4wDDAKBgNVHRQE +AwIBAjANBgkqhkiG9w0BAQsFAAOCAQEAtzQrHAlropwST/3vaUykHfI5UimYeLKG +6lSbKeXCiA4v+dJbnUk3aCZsRWHUnQXvLcp4CtAowSXy92qt3x3rimZkTQwCkfv/ +cLQ2tuR5F9UYanIX4YsxSQSYlohC6oz+kUBaxa072ppHQ9bp9ll1SZGp5IvIA2Br +NmmHcfFbkgBRu/7VTw0O8lY447bLdhF7F62l2jeH8kmvc0JW7WyhjUZc3QCnjx9a +3deHiUMwMv7i1LEpEhHvIg2Pf8UzO6mnUgwluAzmiotoj1WEZQTHREg2Ak1OQwkd +Hzv5Sg7/WULKvg6neYkZMXNaRWxwVk0bilnEbcq890HE9vD9nH7xfg== -----END X509 CRL----- diff --git a/certs/crl/eccCliCRL.pem b/certs/crl/eccCliCRL.pem index 5f8c3ef08..2e00a3729 100644 --- a/certs/crl/eccCliCRL.pem +++ b/certs/crl/eccCliCRL.pem @@ -1,24 +1,24 @@ Certificate Revocation List (CRL): Version 2 (0x1) - Signature Algorithm: ecdsa-with-SHA1 - Issuer: /C=US/ST=Montana/L=Bozeman/O=wolfSSL/OU=Programming/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - Last Update: Feb 5 06:33:30 2015 GMT - Next Update: Nov 1 06:33:30 2017 GMT + Signature Algorithm: ecdsa-with-SHA256 + Issuer: /C=US/ST=Oregon/L=Salem/O=Client ECC/OU=Fast/CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Last Update: May 7 18:21:01 2015 GMT + Next Update: Jan 31 18:21:01 2018 GMT CRL extensions: X509v3 CRL Number: 4 No Revoked Certificates. - Signature Algorithm: ecdsa-with-SHA1 - 30:45:02:20:4d:27:ef:a6:92:28:ad:20:13:b2:ad:67:78:bc: - 04:b2:e6:35:0e:a5:33:64:14:a6:09:6d:06:4c:35:6c:96:a5: - 02:21:00:c5:d1:ab:c2:d2:2d:be:26:24:9f:c4:66:67:ca:00: - 68:3c:33:31:52:77:ee:36:d9:82:90:e5:2c:8d:e7:b0:e1 + Signature Algorithm: ecdsa-with-SHA256 + 30:44:02:20:62:9b:53:ee:21:52:bc:61:e8:ec:7b:f8:28:35: + 43:98:b8:57:9c:c7:73:cc:a0:45:e8:b9:96:2e:1c:c6:62:ff: + 02:20:2b:64:b8:3a:30:2c:15:7f:cf:57:99:60:9d:51:82:82: + ef:b6:13:cc:86:93:a2:19:41:12:a0:ec:7e:1e:07:09 -----BEGIN X509 CRL----- -MIIBKzCB0wIBATAJBgcqhkjOPQQBMIGUMQswCQYDVQQGEwJVUzEQMA4GA1UECAwH -TW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEQMA4GA1UECgwHd29sZlNTTDEUMBIG -A1UECwwLUHJvZ3JhbW1pbmcxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0G -CSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbRcNMTUwMjA1MDYzMzMwWhcNMTcx -MTAxMDYzMzMwWqAOMAwwCgYDVR0UBAMCAQQwCQYHKoZIzj0EAQNIADBFAiBNJ++m -kiitIBOyrWd4vASy5jUOpTNkFKYJbQZMNWyWpQIhAMXRq8LSLb4mJJ/EZmfKAGg8 -MzFSd+422YKQ5SyN57Dh +MIIBJTCBzQIBATAKBggqhkjOPQQDAjCBjTELMAkGA1UEBhMCVVMxDzANBgNVBAgM +Bk9yZWdvbjEOMAwGA1UEBwwFU2FsZW0xEzARBgNVBAoMCkNsaWVudCBFQ0MxDTAL +BgNVBAsMBEZhc3QxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3 +DQEJARYQaW5mb0B3b2xmc3NsLmNvbRcNMTUwNTA3MTgyMTAxWhcNMTgwMTMxMTgy +MTAxWqAOMAwwCgYDVR0UBAMCAQQwCgYIKoZIzj0EAwIDRwAwRAIgYptT7iFSvGHo +7Hv4KDVDmLhXnMdzzKBF6LmWLhzGYv8CICtkuDowLBV/z1eZYJ1RgoLvthPMhpOi +GUESoOx+HgcJ -----END X509 CRL----- diff --git a/certs/crl/eccSrvCRL.pem b/certs/crl/eccSrvCRL.pem index f573d35a3..0746599f3 100644 --- a/certs/crl/eccSrvCRL.pem +++ b/certs/crl/eccSrvCRL.pem @@ -1,24 +1,24 @@ Certificate Revocation List (CRL): Version 2 (0x1) - Signature Algorithm: ecdsa-with-SHA1 - Issuer: /C=US/ST=Montana/L=Bozeman/O=wolfSSL/OU=Programming/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - Last Update: Feb 5 06:33:30 2015 GMT - Next Update: Nov 1 06:33:30 2017 GMT + Signature Algorithm: ecdsa-with-SHA256 + Issuer: /C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC/CN=www.wolfssl.com/emailAddress=info@wolfssl.com + Last Update: May 7 18:21:01 2015 GMT + Next Update: Jan 31 18:21:01 2018 GMT CRL extensions: X509v3 CRL Number: 5 No Revoked Certificates. - Signature Algorithm: ecdsa-with-SHA1 - 30:44:02:20:01:00:6d:c3:b8:f8:2c:bb:84:4e:76:22:4e:af: - 51:d5:b3:21:6f:0f:d1:df:a7:6a:ee:7d:6d:f2:9c:23:ef:7f: - 02:20:13:79:14:7f:e3:c2:49:55:83:66:61:25:83:35:3a:a4: - 05:92:26:be:6d:81:29:3a:54:63:60:f0:82:2d:36:e7 + Signature Algorithm: ecdsa-with-SHA256 + 30:45:02:20:0d:fe:b7:79:fb:66:6c:cb:36:0a:1a:f3:6d:73: + ea:68:ab:fc:46:7e:49:bd:15:2a:9f:a1:17:50:56:82:cf:1f: + 02:21:00:ff:13:85:80:29:a4:60:54:10:93:fb:20:13:b8:9c: + 25:48:53:5e:4b:33:ef:5c:aa:9e:98:74:e0:c8:c3:ef:df -----BEGIN X509 CRL----- -MIIBKjCB0wIBATAJBgcqhkjOPQQBMIGUMQswCQYDVQQGEwJVUzEQMA4GA1UECAwH -TW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEQMA4GA1UECgwHd29sZlNTTDEUMBIG -A1UECwwLUHJvZ3JhbW1pbmcxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0G -CSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbRcNMTUwMjA1MDYzMzMwWhcNMTcx -MTAxMDYzMzMwWqAOMAwwCgYDVR0UBAMCAQUwCQYHKoZIzj0EAQNHADBEAiABAG3D -uPgsu4ROdiJOr1HVsyFvD9Hfp2rufW3ynCPvfwIgE3kUf+PCSVWDZmElgzU6pAWS -Jr5tgSk6VGNg8IItNuc= +MIIBKDCBzwIBATAKBggqhkjOPQQDAjCBjzELMAkGA1UEBhMCVVMxEzARBgNVBAgM +Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB0VsaXB0aWMx +DDAKBgNVBAsMA0VDQzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZI +hvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0xNTA1MDcxODIxMDFaFw0xODAxMzEx +ODIxMDFaoA4wDDAKBgNVHRQEAwIBBTAKBggqhkjOPQQDAgNIADBFAiAN/rd5+2Zs +yzYKGvNtc+poq/xGfkm9FSqfoRdQVoLPHwIhAP8ThYAppGBUEJP7IBO4nCVIU15L +M+9cqp6YdODIw+/f -----END X509 CRL----- diff --git a/certs/renewcerts.sh b/certs/renewcerts.sh index 5bcce22a9..a048b631d 100755 --- a/certs/renewcerts.sh +++ b/certs/renewcerts.sh @@ -46,7 +46,7 @@ function run_renewcerts(){ echo "Updating 2048-bit client-cert.pem" echo "" #pipe the following arguments to openssl req... - echo -e "US\nMontana\nBozeman\nwolfSSL\nProgramming\nwww.wolfssl.com\ninfo@wolfssl.com\n.\n.\n" | openssl req -new -key client-key.pem -nodes -out client-cert.csr + echo -e "US\nMontana\nBozeman\nwolfSSL_2048\nProgramming-2048\nwww.wolfssl.com\ninfo@wolfssl.com\n.\n.\n" | openssl req -new -key client-key.pem -nodes -out client-cert.csr openssl x509 -req -in client-cert.csr -days 1000 -extfile wolfssl.cnf -extensions wolfssl_opts -signkey client-key.pem -out client-cert.pem @@ -60,7 +60,7 @@ function run_renewcerts(){ echo "Updating 1024-bit client-cert.pem" echo "" #pipe the following arguments to openssl req... - echo -e "US\nMontana\nBozeman\nwolfSSL\nProgramming\nwww.wolfssl.com\ninfo@wolfssl.com\n.\n.\n" | openssl req -new -key \1024/client-key.pem -nodes -out \1024/client-cert.csr + echo -e "US\nMontana\nBozeman\nwolfSSL_1024\nProgramming-1024\nwww.wolfssl.com\ninfo@wolfssl.com\n.\n.\n" | openssl req -new -key \1024/client-key.pem -nodes -out \1024/client-cert.csr openssl x509 -req -in \1024/client-cert.csr -days 1000 -extfile wolfssl.cnf -extensions wolfssl_opts -signkey \1024/client-key.pem -out \1024/client-cert.pem @@ -117,7 +117,7 @@ function run_renewcerts(){ echo "Updating client-ecc-cert.pem" echo "" #pipe the following arguments to openssl req... - echo -e "US\nMontana\nBozeman\nwolfSSL\nProgramming\nwww.wolfssl.com\ninfo@wolfssl.com\n.\n.\n" | openssl req -new -key ecc-client-key.pem -nodes -out client-ecc-cert.csr + echo -e "US\nOregon\nSalem\nClient ECC\nFast\nwww.wolfssl.com\ninfo@wolfssl.com\n.\n.\n" | openssl req -new -key ecc-client-key.pem -nodes -out client-ecc-cert.csr openssl x509 -req -in client-ecc-cert.csr -days 1000 -extfile wolfssl.cnf -extensions wolfssl_opts -signkey ecc-client-key.pem -out client-ecc-cert.pem @@ -132,7 +132,7 @@ function run_renewcerts(){ echo "Updating server-ecc.pem" echo "" #pipe the following arguments to openssl req... - echo -e "US\nOregon\nPortland\nEliptic\nECC\nwww.wolfssl.com\ninfo@wolfssl.com\n.\n.\n" | openssl req -new -key ecc-key.pem -nodes -out server-ecc.csr + echo -e "US\nWashington\nSeattle\nEliptic\nECC\nwww.wolfssl.com\ninfo@wolfssl.com\n.\n.\n" | openssl req -new -key ecc-key.pem -nodes -out server-ecc.csr openssl x509 -req -in server-ecc.csr -days 1000 -extfile wolfssl.cnf -extensions wolfssl_opts -signkey ecc-key.pem -out server-ecc.pem @@ -146,7 +146,7 @@ function run_renewcerts(){ echo "Updating server-ecc-comp.pem" echo "" #pipe the following arguments to openssl req... - echo -e "US\nMontana\nBozeman\nwolfSSL\nProgramming\nwww.wolfssl.com\ninfo@wolfssl.com\n.\n.\n" | openssl req -new -key ecc-key-comp.pem -nodes -out server-ecc-comp.csr + echo -e "US\nMontana\nBozeman\nElliptic - comp\nServer ECC-comp\nwww.wolfssl.com\ninfo@wolfssl.com\n.\n.\n" | openssl req -new -key ecc-key-comp.pem -nodes -out server-ecc-comp.csr openssl x509 -req -in server-ecc-comp.csr -days 1000 -extfile wolfssl.cnf -extensions wolfssl_opts -signkey ecc-key-comp.pem -out server-ecc-comp.pem diff --git a/certs/server-cert.der b/certs/server-cert.der index 6d18c29b87099f0674ba555d4fd26e281989d72b..0c936a241e174dc782f39758850bd3e80c0e7e1e 100644 GIT binary patch delta 329 zcmZ3)xrlRu3?uhM*#$DD2IhtqMurB4QR2LY76yjKhET3SgTrK zIpNFZQp)%wCU@zQy$VbFr|k!ml6M{bweFHaqtqpyb!yqt+5(p!&hksinSR@B zMgI@hU15QR2LY=7xp_hET3S zRs35>a&iN+R6Q#z19KB2BZD8G&b`&UU(Q>d%70?ktyAlkx7&-dy{lE~=-bfoXUCRI z%l)T3Q%e~qw05uO_;_xO-dY2bhKTZadv?z*IW%YD*2#}P8aMCYuH%W|*PD3Zckq{t z>t-sgZ>}jv_tjaKWi3oNpt)3U_e-X|dzNOOw*9;Ga#~ASgj*G7z2VlK&bv*8<&6}l z9N~B_wp#Pn{@#lQD;K<9cI(%N0LA>5=F8fXyJ|8@RvTN&zq)u%r+({eufRFGwjNS= z8h@ogV`T%!>t4HezYE=`Y3UxX Date: Thu, 7 May 2015 12:15:58 -0700 Subject: [PATCH 065/350] fix ipv6 external test case --- configure.ac | 2 ++ scripts/include.am | 2 ++ 2 files changed, 4 insertions(+) diff --git a/configure.ac b/configure.ac index 148fbc3db..e707f8657 100644 --- a/configure.ac +++ b/configure.ac @@ -184,6 +184,8 @@ then AM_CFLAGS="$AM_CFLAGS -DTEST_IPV6" fi +AM_CONDITIONAL([BUILD_IPV6], [test "x$ENABLED_IPV6" = "xyes"]) + # Fortress build AC_ARG_ENABLE([fortress], diff --git a/scripts/include.am b/scripts/include.am index 091f3d7a4..0591e2813 100644 --- a/scripts/include.am +++ b/scripts/include.am @@ -10,7 +10,9 @@ endif if BUILD_EXAMPLES dist_noinst_SCRIPTS+= scripts/resume.test +if !BUILD_IPV6 dist_noinst_SCRIPTS+= scripts/external.test endif +endif EXTRA_DIST += scripts/testsuite.pcap From 4fe04c6bed74ff312a31e5c7faf1e5036d055652 Mon Sep 17 00:00:00 2001 From: toddouska Date: Thu, 7 May 2015 12:50:27 -0700 Subject: [PATCH 066/350] detect build cases where external script test case doesn't make sense --- examples/client/client.c | 30 +++++++++++++++++++++++++++++- scripts/external.test | 2 +- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/examples/client/client.c b/examples/client/client.c index afdbc2d86..ee5dae9ca 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -148,6 +148,7 @@ static void Usage(void) #endif printf("-f Fewer packets/group messages\n"); printf("-x Disable client cert/key loading\n"); + printf("-X Driven by eXternal test case\n"); #ifdef SHOW_SIZES printf("-z Print structure sizes\n"); #endif @@ -213,6 +214,7 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) int resumeSession = 0; int wc_shutdown = 0; int disableCRL = 0; + int externalTest = 0; int ret; int scr = 0; /* allow secure renegotiation */ int forceScr = 0; /* force client initiaed scr */ @@ -271,7 +273,8 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) StackTrap(); while ((ch = mygetopt(argc, argv, - "?gdDusmNrwRitfxUPCh:p:v:l:A:c:k:b:zS:L:ToO:a")) != -1) { + "?gdDusmNrwRitfxXUPCh:p:v:l:A:c:k:b:zS:L:ToO:a")) + != -1) { switch (ch) { case '?' : Usage(); @@ -315,6 +318,10 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) useClientCert = 0; break; + case 'X' : + externalTest = 1; + break; + case 'f' : fewerPackets = 1; break; @@ -457,6 +464,27 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) myoptind = 0; /* reset for test cases */ + if (externalTest) { + /* detect build cases that wouldn't allow test against wolfssl.com */ + int done = 0; + (void)done; + + #ifdef NO_RSA + done = 1; + #endif + + #ifndef NO_PSK + done = 1; + #endif + + if (done) { + printf("external test can't be run in this mode"); + + ((func_args*)args)->return_code = 0; + exit(EXIT_SUCCESS); + } + } + /* sort out DTLS versus TLS versions */ if (version == CLIENT_INVALID_VERSION) { if (doDTLS) diff --git a/scripts/external.test b/scripts/external.test index 9b2668d80..1d6cb7e12 100755 --- a/scripts/external.test +++ b/scripts/external.test @@ -13,7 +13,7 @@ RESULT=$? [ $RESULT -ne 0 ] && echo -e "\n\nCouldn't find $server, skipping" && exit 0 # client test against the server -./examples/client/client -C -h $server -p 443 -g -A $ca +./examples/client/client -X -C -h $server -p 443 -g -A $ca RESULT=$? [ $RESULT -ne 0 ] && echo -e "\n\nClient connection failed" && exit 1 From 8f8fb3834aff9d7f8b0fbed54a5acae2be2300cd Mon Sep 17 00:00:00 2001 From: toddouska Date: Thu, 7 May 2015 14:24:58 -0700 Subject: [PATCH 067/350] reduce benchmark stack use, reduce max variable sizes --- wolfcrypt/benchmark/benchmark.c | 69 +++++++++++++-------------------- 1 file changed, 28 insertions(+), 41 deletions(-) diff --git a/wolfcrypt/benchmark/benchmark.c b/wolfcrypt/benchmark/benchmark.c index 66c905f9b..9c27980e7 100644 --- a/wolfcrypt/benchmark/benchmark.c +++ b/wolfcrypt/benchmark/benchmark.c @@ -93,6 +93,11 @@ #define SHOW_INTEL_CYCLES #endif +/* let's use buffers, we have them */ +#if !defined(USE_CERT_BUFFERS_1024) && !defined(USE_CERT_BUFFERS_2048) + #define USE_CERT_BUFFERS_2048 +#endif + #if defined(USE_CERT_BUFFERS_1024) || defined(USE_CERT_BUFFERS_2048) \ || !defined(NO_DH) /* include test cert and key buffers for use with NO_FILESYSTEM */ @@ -1127,38 +1132,30 @@ void bench_rsa(void) { int i; int ret; - byte tmp[3072]; size_t bytes; word32 idx = 0; + const byte* tmp; byte message[] = "Everyone gets Friday off."; - byte enc[512]; /* for up to 4096 bit */ + byte enc[256]; /* for up to 2048 bit */ const int len = (int)strlen((char*)message); double start, total, each, milliEach; - + RsaKey rsaKey; int rsaKeySz = 2048; /* used in printf */ #ifdef USE_CERT_BUFFERS_1024 - XMEMCPY(tmp, rsa_key_der_1024, sizeof_rsa_key_der_1024); + tmp = rsa_key_der_1024; bytes = sizeof_rsa_key_der_1024; rsaKeySz = 1024; #elif defined(USE_CERT_BUFFERS_2048) - XMEMCPY(tmp, rsa_key_der_2048, sizeof_rsa_key_der_2048); + tmp = rsa_key_der_2048; bytes = sizeof_rsa_key_der_2048; #else - FILE* file = fopen(certRSAname, "rb"); - - if (!file) { - printf("can't find %s, Please run from wolfSSL home dir\n", certRSAname); - return; - } - - bytes = fread(tmp, 1, sizeof(tmp), file); - fclose(file); + #error "need a cert buffer size" #endif /* USE_CERT_BUFFERS */ - + #ifdef HAVE_CAVIUM if (wc_RsaInitCavium(&rsaKey, CAVIUM_DEV_ID) != 0) printf("RSA init cavium failed\n"); @@ -1169,7 +1166,7 @@ void bench_rsa(void) return; } ret = wc_RsaPrivateKeyDecode(tmp, &idx, &rsaKey, (word32)bytes); - + start = current_time(1); for (i = 0; i < ntimes; i++) @@ -1190,7 +1187,7 @@ void bench_rsa(void) start = current_time(1); for (i = 0; i < ntimes; i++) { - byte out[512]; /* for up to 4096 bit */ + byte out[256]; /* for up to 2048 bit */ wc_RsaPrivateDecrypt(enc, (word32)ret, out, sizeof(out), &rsaKey); } @@ -1229,16 +1226,16 @@ void bench_rsa(void) void bench_dh(void) { int i ; - byte tmp[1024]; size_t bytes; word32 idx = 0, pubSz, privSz = 0, pubSz2, privSz2, agreeSz; + const byte* tmp; byte pub[256]; /* for 2048 bit */ - byte priv[256]; /* for 2048 bit */ byte pub2[256]; /* for 2048 bit */ - byte priv2[256]; /* for 2048 bit */ byte agree[256]; /* for 2048 bit */ - + byte priv[32]; /* for 2048 bit */ + byte priv2[32]; /* for 2048 bit */ + double start, total, each, milliEach; DhKey dhKey; int dhKeySz = 2048; /* used in printf */ @@ -1246,26 +1243,19 @@ void bench_dh(void) (void)idx; (void)tmp; - + #ifdef USE_CERT_BUFFERS_1024 - XMEMCPY(tmp, dh_key_der_1024, sizeof_dh_key_der_1024); + tmp = dh_key_der_1024; bytes = sizeof_dh_key_der_1024; dhKeySz = 1024; #elif defined(USE_CERT_BUFFERS_2048) - XMEMCPY(tmp, dh_key_der_2048, sizeof_dh_key_der_2048); + tmp = dh_key_der_2048; bytes = sizeof_dh_key_der_2048; #elif defined(NO_ASN) dhKeySz = 1024; /* do nothing, but don't use default FILE */ #else - FILE* file = fopen(certDHname, "rb"); - - if (!file) { - printf("can't find %s, Please run from wolfSSL home dir\n", certDHname); - return; - } - - bytes = fread(tmp, 1, sizeof(tmp), file); + #error "need to define a cert buffer size" #endif /* USE_CERT_BUFFERS */ @@ -1274,9 +1264,6 @@ void bench_dh(void) bytes = wc_DhSetKey(&dhKey, dh_p, sizeof(dh_p), dh_g, sizeof(dh_g)); #else bytes = wc_DhKeyDecode(tmp, &idx, &dhKey, (word32)bytes); - #if !defined(USE_CERT_BUFFERS_1024) && !defined(USE_CERT_BUFFERS_2048) - fclose(file); - #endif #endif if (bytes != 0) { printf("dhekydecode failed, can't benchmark\n"); @@ -1576,11 +1563,11 @@ void bench_eccKeyAgree(void) ecc_key genKey, genKey2; double start, total, each, milliEach; int i, ret; - byte shared[1024]; - byte sig[1024]; + byte shared[32]; + byte sig[64+16]; /* der encoding too */ byte digest[32]; word32 x = 0; - + wc_ecc_init(&genKey); wc_ecc_init(&genKey2); @@ -1595,7 +1582,7 @@ void bench_eccKeyAgree(void) return; } - /* 256 bit */ + /* 256 bit */ start = current_time(1); for(i = 0; i < agreeTimes; i++) { @@ -1603,7 +1590,7 @@ void bench_eccKeyAgree(void) ret = wc_ecc_shared_secret(&genKey, &genKey2, shared, &x); if (ret != 0) { printf("ecc_shared_secret failed\n"); - return; + return; } } @@ -1686,7 +1673,7 @@ void bench_curve25519KeyAgree(void) curve25519_key genKey, genKey2; double start, total, each, milliEach; int i, ret; - byte shared[1024]; + byte shared[32]; word32 x = 0; wc_curve25519_init(&genKey); From d4982bb9884ade03cece09f3fc5b221de39b2454 Mon Sep 17 00:00:00 2001 From: toddouska Date: Thu, 7 May 2015 15:10:33 -0700 Subject: [PATCH 068/350] add dsa verify input check, not used at TLS or default --- wolfcrypt/src/dsa.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/wolfcrypt/src/dsa.c b/wolfcrypt/src/dsa.c index ac0d3b75b..4de4d8196 100644 --- a/wolfcrypt/src/dsa.c +++ b/wolfcrypt/src/dsa.c @@ -174,7 +174,12 @@ int wc_DsaVerify(const byte* digest, const byte* sig, DsaKey* key, int* answer) ret = MP_READ_E; /* sanity checks */ - + if (ret == 0) { + if (mp_iszero(&r) == MP_YES || mp_iszero(&s) == MP_YES || + mp_cmp(&r, &key->q) != MP_LT || mp_cmp(&s, &key->q) != MP_LT) { + ret = MP_ZERO_E; + } + } /* put H into u1 from sha digest */ if (ret == 0 && mp_read_unsigned_bin(&u1,digest,SHA_DIGEST_SIZE) != MP_OKAY) From d2c53c32295e7f6836d59a80ca39cf54432cfafc Mon Sep 17 00:00:00 2001 From: toddouska Date: Thu, 7 May 2015 15:25:20 -0700 Subject: [PATCH 069/350] reduce wolfcrypt test stack use, curve25519 --- wolfcrypt/test/test.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index ab617ca47..4bf7427b5 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -5241,10 +5241,10 @@ int ecc_encrypt_test(void) int curve25519_test(void) { RNG rng; - byte sharedA[1024]; - byte sharedB[1024]; + byte sharedA[32]; + byte sharedB[32]; + byte exportBuf[32]; word32 x, y; - byte exportBuf[1024]; curve25519_key userA, userB, pubKey; /* test vectors from From dde4b294627eb10847ce8619dacb510011c109de Mon Sep 17 00:00:00 2001 From: toddouska Date: Sat, 9 May 2015 11:04:47 -0700 Subject: [PATCH 070/350] add handshake done callback with ability to end connection --- examples/server/server.c | 20 ++++++++++++++++++++ src/ssl.c | 39 +++++++++++++++++++++++++++++++++++++++ wolfssl/internal.h | 4 ++++ wolfssl/ssl.h | 6 ++++++ 4 files changed, 69 insertions(+) diff --git a/examples/server/server.c b/examples/server/server.c index 50fb5a389..3c8ac1e65 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -60,6 +60,10 @@ Timeval srvTo; #endif +#ifndef NO_HANDSHAKE_DONE_CB + int myHsDoneCb(WOLFSSL* ssl, void* user_ctx); +#endif + static void NonBlockingSSL_Accept(SSL* ssl) { @@ -534,6 +538,9 @@ while (1) { /* allow resume option */ if (ssl == NULL) err_sys("unable to get SSL"); +#ifndef NO_HANDSHAKE_DONE_CB + wolfSSL_SetHsDoneCb(ssl, myHsDoneCb, NULL); +#endif #ifdef HAVE_CRL CyaSSL_EnableCRL(ssl, 0); CyaSSL_LoadCRL(ssl, crlPemDir, SSL_FILETYPE_PEM, CYASSL_CRL_MONITOR | @@ -712,3 +719,16 @@ while (1) { /* allow resume option */ #endif +#ifndef NO_HANDSHAKE_DONE_CB + int myHsDoneCb(WOLFSSL* ssl, void* user_ctx) + { + (void)user_ctx; + (void)ssl; + + /* printf("Notified HandShake done\n"); */ + + /* return negative number to end TLS connection now */ + return 0; + } +#endif + diff --git a/src/ssl.c b/src/ssl.c index ee0d473f0..1c027ac34 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -5289,6 +5289,16 @@ int wolfSSL_dtls_got_timeout(WOLFSSL* ssl) WOLFSSL_MSG("connect state: SECOND_REPLY_DONE"); case SECOND_REPLY_DONE: +#ifndef NO_HANDSHAKE_DONE_CB + if (ssl->hsDoneCb) { + int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx); + if (cbret < 0) { + ssl->error = cbret; + WOLFSSL_MSG("HandShake Done Cb don't continue error"); + return SSL_FATAL_ERROR; + } + } +#endif /* NO_HANDSHAKE_DONE_CB */ FreeHandshakeResources(ssl); WOLFSSL_LEAVE("SSL_connect()", SSL_SUCCESS); return SSL_SUCCESS; @@ -5576,6 +5586,16 @@ int wolfSSL_dtls_got_timeout(WOLFSSL* ssl) WOLFSSL_MSG("accept state ACCEPT_THIRD_REPLY_DONE"); case ACCEPT_THIRD_REPLY_DONE : +#ifndef NO_HANDSHAKE_DONE_CB + if (ssl->hsDoneCb) { + int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx); + if (cbret < 0) { + ssl->error = cbret; + WOLFSSL_MSG("HandShake Done Cb don't continue error"); + return SSL_FATAL_ERROR; + } + } +#endif /* NO_HANDSHAKE_DONE_CB */ FreeHandshakeResources(ssl); WOLFSSL_LEAVE("SSL_accept()", SSL_SUCCESS); return SSL_SUCCESS; @@ -5589,6 +5609,25 @@ int wolfSSL_dtls_got_timeout(WOLFSSL* ssl) #endif /* NO_WOLFSSL_SERVER */ +#ifndef NO_HANDSHAKE_DONE_CB + +int wolfSSL_SetHsDoneCb(WOLFSSL* ssl, HandShakeDoneCb cb, void* user_ctx) +{ + WOLFSSL_ENTER("wolfSSL_SetHsDoneCb"); + + if (ssl == NULL) + return BAD_FUNC_ARG; + + ssl->hsDoneCb = cb; + ssl->hsDoneCtx = user_ctx; + + + return SSL_SUCCESS; +} + +#endif /* NO_HANDSHAKE_DONE_CB */ + + int wolfSSL_Cleanup(void) { int ret = SSL_SUCCESS; diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 3ead47d88..d95c2f97d 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -2111,6 +2111,10 @@ struct WOLFSSL { void* verifyCbCtx; /* cert verify callback user ctx*/ VerifyCallback verifyCallback; /* cert verification callback */ void* heap; /* for user overrides */ +#ifndef NO_HANDSHAKE_DONE_CB + HandShakeDoneCb hsDoneCb; /* notify user handshake done */ + void* hsDoneCtx; /* user handshake cb context */ +#endif WOLFSSL_CIPHER cipher; hmacfp hmac; Ciphers encrypt; diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 2f72c4c65..9b9884989 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -1375,6 +1375,12 @@ WOLFSSL_API int wolfSSL_set_SessionTicket_cb(WOLFSSL*, #define WOLFSSL_CRL_MONITOR 0x01 /* monitor this dir flag */ #define WOLFSSL_CRL_START_MON 0x02 /* start monitoring flag */ + +/* notify user the hanshake is done */ +typedef int (*HandShakeDoneCb)(WOLFSSL*, void*); +WOLFSSL_API int wolfSSL_SetHsDoneCb(WOLFSSL*, HandShakeDoneCb, void*); + + WOLFSSL_API int wolfSSL_PrintSessionStats(void); WOLFSSL_API int wolfSSL_get_session_stats(unsigned int* active, unsigned int* total, From 513b43baaeb619131b86ffde67a3fbd4f56432c3 Mon Sep 17 00:00:00 2001 From: toddouska Date: Mon, 11 May 2015 12:03:53 -0700 Subject: [PATCH 071/350] update CUSTOM_RAND_GENERATE to not include dev random files --- wolfcrypt/src/random.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/wolfcrypt/src/random.c b/wolfcrypt/src/random.c index 85f96d3c4..22b49cbf8 100755 --- a/wolfcrypt/src/random.c +++ b/wolfcrypt/src/random.c @@ -100,8 +100,8 @@ int wc_RNG_GenerateByte(RNG* rng, byte* b) #include #include #else - #if !defined(NO_DEV_RANDOM) && !defined(WOLFSSL_MDK_ARM) \ - && !defined(WOLFSSL_IAR_ARM) + #if !defined(NO_DEV_RANDOM) && !defined(CUSTOM_RAND_GENERATE) && \ + !defined(WOLFSSL_MDK_ARM) && !defined(WOLFSSL_IAR_ARM) #include #ifndef EBSNET #include @@ -1164,15 +1164,17 @@ int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) * word32 rand_gen(void); * #define CUSTOM_RAND_GENERATE rand_gen */ - int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) - { - int i; + int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) + { + word32 i; - for (i = 0; i < sz; i++ ) - output[i] = CUSTOM_RAND_GENERATE(); + (void)os; - return 0; - } + for (i = 0; i < sz; i++ ) + output[i] = CUSTOM_RAND_GENERATE(); + + return 0; + } #elif defined(NO_DEV_RANDOM) From 0b1ea204b7ad1b2f76e229ac099beca69ee8d17c Mon Sep 17 00:00:00 2001 From: John Safranek Date: Tue, 12 May 2015 11:59:07 -0700 Subject: [PATCH 072/350] cleaned up Windows build warnings --- wolfcrypt/src/random.c | 4 ++-- wolfcrypt/test/test.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/wolfcrypt/src/random.c b/wolfcrypt/src/random.c index 22b49cbf8..d1786e5b1 100755 --- a/wolfcrypt/src/random.c +++ b/wolfcrypt/src/random.c @@ -338,13 +338,13 @@ static INLINE void array_add(byte* d, word32 dLen, const byte* s, word32 sLen) for (sIdx = sLen - 1, dIdx = dLen - 1; sIdx >= 0; dIdx--, sIdx--) { carry += d[dIdx] + s[sIdx]; - d[dIdx] = carry; + d[dIdx] = (byte)carry; carry >>= 8; } for (; carry != 0 && dIdx >= 0; dIdx--) { carry += d[dIdx]; - d[dIdx] = carry; + d[dIdx] = (byte)carry; carry >>= 8; } } diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 4bf7427b5..2879c01e4 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -4484,7 +4484,7 @@ int openssl_test(void) EVP_MD_CTX_init(&md_ctx); EVP_DigestInit(&md_ctx, EVP_sha384()); - EVP_DigestUpdate(&md_ctx, e.input, e.inLen); + EVP_DigestUpdate(&md_ctx, e.input, (unsigned long)e.inLen); EVP_DigestFinal(&md_ctx, hash, 0); if (memcmp(hash, e.output, SHA384_DIGEST_SIZE) != 0) From 69b4b37e864955b7871200a639523364e6edfa7b Mon Sep 17 00:00:00 2001 From: John Safranek Date: Tue, 12 May 2015 16:16:44 -0700 Subject: [PATCH 073/350] modify ossl-extra HMAC testcase to use longer password --- wolfcrypt/test/test.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 2879c01e4..8dac3b8ea 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -4522,12 +4522,13 @@ int openssl_test(void) return -73; c.input = "what do ya want for nothing?"; - c.output = "\x75\x0c\x78\x3e\x6a\xb0\xb5\x03\xea\xa8\x6e\x31\x0a\x5d\xb7" - "\x38"; + c.output = "\x55\x78\xe8\x48\x4b\xcc\x93\x80\x93\xec\x53\xaf\x22\xd6\x14" + "\x76"; c.inLen = strlen(c.input); c.outLen = MD5_DIGEST_SIZE; - HMAC(EVP_md5(), "Jefe", 4, (byte*)c.input, (int)c.inLen, hash, 0); + HMAC(EVP_md5(), + "JefeJefeJefeJefe", 16, (byte*)c.input, (int)c.inLen, hash, 0); if (memcmp(hash, c.output, MD5_DIGEST_SIZE) != 0) return -74; From b6e540b0051b7f14dd8cf95c5f11a1499fe68c78 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Tue, 12 May 2015 16:36:38 -0700 Subject: [PATCH 074/350] new VS solution and project files for FIPS build --- IDE/WIN/test.vcxproj | 159 +++++++++++++++ IDE/WIN/wolfssl-fips.sln | 56 ++++++ IDE/WIN/wolfssl-fips.vcxproj | 373 +++++++++++++++++++++++++++++++++++ 3 files changed, 588 insertions(+) create mode 100644 IDE/WIN/test.vcxproj create mode 100644 IDE/WIN/wolfssl-fips.sln create mode 100644 IDE/WIN/wolfssl-fips.vcxproj diff --git a/IDE/WIN/test.vcxproj b/IDE/WIN/test.vcxproj new file mode 100644 index 000000000..1d3915df0 --- /dev/null +++ b/IDE/WIN/test.vcxproj @@ -0,0 +1,159 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21} + Win32Proj + + + + Application + v110 + + + Application + v110 + + + Application + v110 + + + Application + v110 + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>11.0.61030.0 + + + Debug\ + Debug\ + true + + + true + + + Release\ + Release\ + true + + + true + + + + Disabled + ..\..\wolfssl;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + Level3 + EditAndContinue + + + true + Console + MachineX86 + + + + + Disabled + ../../;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;HAVE_FIPS;HAVE_AESGCM;WOLFSSL_SHA384;WOLFSSL_SHA512;USE_CERT_BUFFERS_2048;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + + + true + Console + Ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + fipsWrapper + + + + + ..\..\wolfssl;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + Level3 + ProgramDatabase + + + true + Console + true + true + MachineX86 + + + + + ..\..\wolfssl;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + + + true + Console + true + true + + + + + + + + {73973223-5ee8-41ca-8e88-1d60e89a237b} + + + + + + \ No newline at end of file diff --git a/IDE/WIN/wolfssl-fips.sln b/IDE/WIN/wolfssl-fips.sln new file mode 100644 index 000000000..365d6eb8c --- /dev/null +++ b/IDE/WIN/wolfssl-fips.sln @@ -0,0 +1,56 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows Desktop +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wolfssl-fips", "wolfssl-fips.vcxproj", "{73973223-5EE8-41CA-8E88-1D60E89A237B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "test.vcxproj", "{D04BDF66-664A-4D59-BEAC-8AB2D5809C21}" + ProjectSection(ProjectDependencies) = postProject + {73973223-5EE8-41CA-8E88-1D60E89A237B} = {73973223-5EE8-41CA-8E88-1D60E89A237B} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Debug|x64 = DLL Debug|x64 + DLL Release|Win32 = DLL Release|Win32 + DLL Release|x64 = DLL Release|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {73973223-5EE8-41CA-8E88-1D60E89A237B}.Debug|Win32.ActiveCfg = Debug|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.Debug|Win32.Build.0 = Debug|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.Debug|x64.ActiveCfg = Debug|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.Debug|x64.Build.0 = Debug|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|x64.Build.0 = DLL Release|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.Release|Win32.ActiveCfg = Release|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.Release|Win32.Build.0 = Release|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.Release|x64.ActiveCfg = Release|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.Release|x64.Build.0 = Release|x64 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Debug|Win32.ActiveCfg = Debug|Win32 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Debug|Win32.Build.0 = Debug|Win32 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Debug|x64.ActiveCfg = Debug|x64 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Debug|x64.Build.0 = Debug|x64 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Debug|Win32.ActiveCfg = Debug|Win32 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Debug|Win32.Build.0 = Debug|Win32 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Debug|x64.ActiveCfg = Debug|Win32 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Release|Win32.ActiveCfg = Release|Win32 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Release|Win32.Build.0 = Release|Win32 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Release|x64.ActiveCfg = Release|Win32 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Release|Win32.ActiveCfg = Release|Win32 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Release|Win32.Build.0 = Release|Win32 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Release|x64.ActiveCfg = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/IDE/WIN/wolfssl-fips.vcxproj b/IDE/WIN/wolfssl-fips.vcxproj new file mode 100644 index 000000000..d7e59ab8d --- /dev/null +++ b/IDE/WIN/wolfssl-fips.vcxproj @@ -0,0 +1,373 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + DLL Debug + Win32 + + + DLL Debug + x64 + + + DLL Release + Win32 + + + DLL Release + x64 + + + Release + Win32 + + + Release + x64 + + + + {73973223-5EE8-41CA-8E88-1D60E89A237B} + wolfssl-fips + Win32Proj + + + + StaticLibrary + v110 + Unicode + true + + + DynamicLibrary + v110 + Unicode + true + + + StaticLibrary + v110 + Unicode + true + + + DynamicLibrary + v110 + Unicode + true + + + StaticLibrary + v110 + Unicode + + + DynamicLibrary + v110 + Unicode + + + StaticLibrary + v110 + Unicode + + + DynamicLibrary + v110 + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ + + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ + + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ + + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\obj\ + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\obj\ + + + + Disabled + ./;../../;%(AdditionalIncludeDirectories) + OPENSSL_EXTRA;HAVE_FIPS;HAVE_AESGCM;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + Level4 + EditAndContinue + 4206;4214;4706;%(DisableSpecificWarnings) + + + + + Disabled + ./;../../;%(AdditionalIncludeDirectories) + OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + 4206;4214;4706;%(DisableSpecificWarnings) + + + ws2_32.lib;%(AdditionalDependencies) + false + true + + + + + Disabled + ./;../../;%(AdditionalIncludeDirectories) + OPENSSL_EXTRA;HAVE_FIPS;HAVE_AESGCM;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + 4206;4214;4706;%(DisableSpecificWarnings) + + + + + + + + + Disabled + ./;../../;%(AdditionalIncludeDirectories) + OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + 4206;4214;4706;%(DisableSpecificWarnings) + + + ws2_32.lib;%(AdditionalDependencies) + false + true + + + + + MaxSpeed + true + ./;../../;%(AdditionalIncludeDirectories) + OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + Level3 + ProgramDatabase + + + + + MaxSpeed + true + ./;../../;%(AdditionalIncludeDirectories) + OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + ws2_32.lib;%(AdditionalDependencies) + true + + + + + MaxSpeed + true + ./;../../;%(AdditionalIncludeDirectories) + OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + + + MaxSpeed + true + ./;../../;%(AdditionalIncludeDirectories) + OPENSSL_EXTRA;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + ws2_32.lib;%(AdditionalDependencies) + true + + + + + + $(IntDir)ctaocrypt\ + + + $(IntDir)ctaocrypt\ + + + $(IntDir)ctaocrypt\ + + + $(IntDir)ctaocrypt\ + + + $(IntDir)ctaocrypt\ + + + $(IntDir)ctaocrypt\ + + + $(IntDir)ctaocrypt\ + + + $(IntDir)ctaocrypt\ + + + $(IntDir)ctaocrypt\ + + + $(IntDir)ctaocrypt\ + + + $(IntDir)ctaocrypt\ + + + $(IntDir)ctaocrypt\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + false + ml64.exe /c /Zi /Fo"$(OutDir)%(Filename).obj" %(Identity) + ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + $(OutDir)%(Filename).obj + $(IntDir)%(Filename).obj + false + false + ml64.exe /c /Zi /Fo"$(OutDir)%(Filename).obj" %(Identity) + ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + $(OutDir)%(Filename).obj + $(IntDir)%(Filename).obj + + + + + + \ No newline at end of file From 48034b56c58ff5c96f48d415fb815a5bea3cc3ae Mon Sep 17 00:00:00 2001 From: John Safranek Date: Wed, 13 May 2015 13:10:03 -0700 Subject: [PATCH 075/350] update the VS solution and project files for FIPS build --- IDE/WIN/test.vcxproj | 54 ++++++--------- IDE/WIN/wolfssl-fips.sln | 12 ++-- IDE/WIN/wolfssl-fips.vcxproj | 125 +++++++++-------------------------- 3 files changed, 60 insertions(+), 131 deletions(-) diff --git a/IDE/WIN/test.vcxproj b/IDE/WIN/test.vcxproj index 1d3915df0..22aaeecc9 100644 --- a/IDE/WIN/test.vcxproj +++ b/IDE/WIN/test.vcxproj @@ -58,63 +58,50 @@ <_ProjectFileVersion>11.0.61030.0 - - Debug\ - Debug\ - true - - - true - - - Release\ - Release\ - true - - - true + + $(SolutionDir)$(Configuration)\$(Platform)\ + $(Configuration)\$(Platform)\obj\ + false Disabled - ..\..\wolfssl;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true + ..\..\;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;HAVE_FIPS;HAVE_AESGCM;HAVE_HASHDRBG;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;NO_RC4;NO_RABBIT;NO_DSA;NO_MD4;USE_CERT_BUFFERS_2048;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 - EditAndContinue + ProgramDatabase true Console MachineX86 + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) Disabled - ../../;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;HAVE_FIPS;HAVE_AESGCM;WOLFSSL_SHA384;WOLFSSL_SHA512;USE_CERT_BUFFERS_2048;%(PreprocessorDefinitions) + ..\..\;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;OPENSSL_EXTRA;HAVE_FIPS;HAVE_AESGCM;HAVE_HASHDRBG;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;NO_RC4;NO_RABBIT;NO_DSA;NO_MD4;USE_CERT_BUFFERS_2048;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL - - + Level3 ProgramDatabase true Console - Ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - fipsWrapper + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - ..\..\wolfssl;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ..\..\;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;OPENSSL_EXTRA;HAVE_FIPS;HAVE_AESGCM;HAVE_HASHDRBG;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;NO_RC4;NO_RABBIT;NO_DSA;NO_MD4;USE_CERT_BUFFERS_2048;%(PreprocessorDefinitions) MultiThreadedDLL Level3 @@ -123,26 +110,29 @@ true Console + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) true true MachineX86 + UseLinkTimeCodeGeneration - ..\..\wolfssl;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + ..\..\;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;OPENSSL_EXTRA;HAVE_FIPS;HAVE_AESGCM;HAVE_HASHDRBG;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;NO_RC4;NO_RABBIT;NO_DSA;NO_MD4;USE_CERT_BUFFERS_2048;%(PreprocessorDefinitions) MultiThreadedDLL - - + Level3 ProgramDatabase true Console + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) true true + UseLinkTimeCodeGeneration @@ -156,4 +146,4 @@ - \ No newline at end of file + diff --git a/IDE/WIN/wolfssl-fips.sln b/IDE/WIN/wolfssl-fips.sln index 365d6eb8c..b8578fdea 100644 --- a/IDE/WIN/wolfssl-fips.sln +++ b/IDE/WIN/wolfssl-fips.sln @@ -40,15 +40,17 @@ Global {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Debug|Win32.Build.0 = Debug|Win32 {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Debug|x64.ActiveCfg = Debug|x64 {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Debug|x64.Build.0 = Debug|x64 - {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Debug|Win32.ActiveCfg = Debug|Win32 - {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Debug|Win32.Build.0 = Debug|Win32 - {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Debug|x64.ActiveCfg = Debug|Win32 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Debug|Win32.ActiveCfg = Release|x64 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Debug|x64.ActiveCfg = Debug|x64 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Debug|x64.Build.0 = Debug|x64 {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Release|Win32.ActiveCfg = Release|Win32 {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Release|Win32.Build.0 = Release|Win32 - {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Release|x64.ActiveCfg = Release|Win32 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Release|x64.ActiveCfg = Release|x64 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Release|x64.Build.0 = Release|x64 {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Release|Win32.ActiveCfg = Release|Win32 {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Release|Win32.Build.0 = Release|Win32 - {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Release|x64.ActiveCfg = Release|Win32 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Release|x64.ActiveCfg = Release|x64 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/IDE/WIN/wolfssl-fips.vcxproj b/IDE/WIN/wolfssl-fips.vcxproj index d7e59ab8d..94341ec5f 100644 --- a/IDE/WIN/wolfssl-fips.vcxproj +++ b/IDE/WIN/wolfssl-fips.vcxproj @@ -112,49 +112,19 @@ - - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ - - - $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ - - - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ - - - $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ - - - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ - - - $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ - - - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\obj\ - - - $(SolutionDir)$(Configuration)\ - $(Configuration)\obj\ + + $(SolutionDir)$(Configuration)\$(Platform)\ + $(Configuration)\$(Platform)\obj\ Disabled ./;../../;%(AdditionalIncludeDirectories) - OPENSSL_EXTRA;HAVE_FIPS;HAVE_AESGCM;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;%(PreprocessorDefinitions) - true + OPENSSL_EXTRA;HAVE_FIPS;HAVE_AESGCM;HAVE_HASHDRBG;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;NO_RC4;NO_RABBIT;NO_DSA;NO_MD4;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL - Level4 - EditAndContinue + ProgramDatabase 4206;4214;4706;%(DisableSpecificWarnings) @@ -162,39 +132,26 @@ Disabled ./;../../;%(AdditionalIncludeDirectories) - OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) + OPENSSL_EXTRA;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL - - Level4 - EditAndContinue + ProgramDatabase 4206;4214;4706;%(DisableSpecificWarnings) - - ws2_32.lib;%(AdditionalDependencies) - false - true - Disabled ./;../../;%(AdditionalIncludeDirectories) - OPENSSL_EXTRA;HAVE_FIPS;HAVE_AESGCM;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;%(PreprocessorDefinitions) + OPENSSL_EXTRA;HAVE_FIPS;HAVE_AESGCM;HAVE_HASHDRBG;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;NO_RC4;NO_RABBIT;NO_DSA;NO_MD4;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL - - Level4 ProgramDatabase 4206;4214;4706;%(DisableSpecificWarnings) - - - - @@ -203,27 +160,19 @@ OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL - - Level4 ProgramDatabase 4206;4214;4706;%(DisableSpecificWarnings) - - ws2_32.lib;%(AdditionalDependencies) - false - true - MaxSpeed true ./;../../;%(AdditionalIncludeDirectories) - OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;%(PreprocessorDefinitions) + OPENSSL_EXTRA;HAVE_FIPS;HAVE_AESGCM;HAVE_HASHDRBG;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;NO_RC4;NO_RABBIT;NO_DSA;NO_MD4;%(PreprocessorDefinitions) MultiThreadedDLL true - Level3 ProgramDatabase @@ -233,29 +182,21 @@ MaxSpeed true ./;../../;%(AdditionalIncludeDirectories) - OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) + OPENSSL_EXTRA;HAVE_FIPS;HAVE_AESGCM;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) MultiThreadedDLL true - - Level3 ProgramDatabase - - ws2_32.lib;%(AdditionalDependencies) - true - MaxSpeed true ./;../../;%(AdditionalIncludeDirectories) - OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;%(PreprocessorDefinitions) + OPENSSL_EXTRA;HAVE_FIPS;HAVE_AESGCM;HAVE_HASHDRBG;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;NO_RC4;NO_RABBIT;NO_DSA;NO_MD4;%(PreprocessorDefinitions) MultiThreadedDLL true - - Level3 ProgramDatabase @@ -268,53 +209,49 @@ OPENSSL_EXTRA;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) MultiThreadedDLL true - - Level3 ProgramDatabase - - ws2_32.lib;%(AdditionalDependencies) - true - - + + $(IntDir)ctaocrypt\ + - $(IntDir)ctaocrypt\ + $(IntDir)ctaocrypt\ - $(IntDir)ctaocrypt\ + $(IntDir)ctaocrypt\ - $(IntDir)ctaocrypt\ + $(IntDir)ctaocrypt\ - $(IntDir)ctaocrypt\ + $(IntDir)ctaocrypt\ - $(IntDir)ctaocrypt\ + $(IntDir)ctaocrypt\ - $(IntDir)ctaocrypt\ + $(IntDir)ctaocrypt\ - $(IntDir)ctaocrypt\ + $(IntDir)ctaocrypt\ - $(IntDir)ctaocrypt\ + $(IntDir)ctaocrypt\ - $(IntDir)ctaocrypt\ + $(IntDir)ctaocrypt\ - $(IntDir)ctaocrypt\ + $(IntDir)ctaocrypt\ - $(IntDir)ctaocrypt\ + $(IntDir)ctaocrypt\ - $(IntDir)ctaocrypt\ + $(IntDir)ctaocrypt\ @@ -355,19 +292,19 @@ false false - ml64.exe /c /Zi /Fo"$(OutDir)%(Filename).obj" %(Identity) + ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) - $(OutDir)%(Filename).obj + $(IntDir)%(Filename).obj $(IntDir)%(Filename).obj false false - ml64.exe /c /Zi /Fo"$(OutDir)%(Filename).obj" %(Identity) + ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) - $(OutDir)%(Filename).obj + $(IntDir)%(Filename).obj $(IntDir)%(Filename).obj - \ No newline at end of file + From 4e482a348edbc90b8f35d08dadc6b6accd91bc6f Mon Sep 17 00:00:00 2001 From: John Safranek Date: Wed, 13 May 2015 14:53:11 -0700 Subject: [PATCH 076/350] wrapped the min() inline functions with better preprocessor checks --- src/internal.c | 5 +++-- src/sniffer.c | 5 +++-- src/ssl.c | 14 +++++++++----- src/tls.c | 5 +++-- wolfcrypt/src/asn.c | 5 +++-- wolfcrypt/src/dh.c | 5 +++-- wolfcrypt/src/dsa.c | 5 +++-- wolfcrypt/src/hmac.c | 5 +++-- wolfcrypt/src/md4.c | 5 +++-- wolfcrypt/src/md5.c | 5 +++-- wolfcrypt/src/pkcs7.c | 7 +++++-- wolfcrypt/src/pwdbased.c | 5 +++-- wolfcrypt/src/ripemd.c | 6 +++--- wolfcrypt/src/sha.c | 13 +++++++------ wolfcrypt/src/sha256.c | 5 +++-- wolfcrypt/src/sha512.c | 5 +++-- 16 files changed, 60 insertions(+), 40 deletions(-) diff --git a/src/internal.c b/src/internal.c index 974718427..13e8dd35f 100644 --- a/src/internal.c +++ b/src/internal.c @@ -135,14 +135,15 @@ static int BuildCertHashes(WOLFSSL* ssl, Hashes* hashes); static void PickHashSigAlgo(WOLFSSL* ssl, const byte* hashSigAlgo, word32 hashSigAlgoSz); -#ifndef min +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN static INLINE word32 min(word32 a, word32 b) { return a > b ? b : a; } -#endif /* min */ +#endif /* WOLFSSL_HAVE_MIN */ int IsTLS(const WOLFSSL* ssl) diff --git a/src/sniffer.c b/src/sniffer.c index 50f044498..b961f7bd7 100644 --- a/src/sniffer.c +++ b/src/sniffer.c @@ -52,14 +52,15 @@ #endif -#ifndef min +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN static INLINE word32 min(word32 a, word32 b) { return a > b ? b : a; } -#endif +#endif /* WOLFSSL_HAVE_MIN */ #ifndef WOLFSSL_SNIFFER_TIMEOUT #define WOLFSSL_SNIFFER_TIMEOUT 900 diff --git a/src/ssl.c b/src/ssl.c index 1c027ac34..b68664b7f 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -77,23 +77,27 @@ #define FALSE 0 #endif -#ifndef min +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN static INLINE word32 min(word32 a, word32 b) { return a > b ? b : a; } -#endif /* min */ +#endif /* WOLFSSSL_HAVE_MIN */ + +#ifndef WOLFSSL_HAVE_MAX +#define WOLFSSL_HAVE_MAX -#ifndef max #ifdef WOLFSSL_DTLS static INLINE word32 max(word32 a, word32 b) { return a > b ? a : b; } -#endif -#endif /* min */ +#endif /* WOLFSSL_DTLS */ + +#endif /* WOLFSSL_HAVE_MAX */ #ifndef WOLFSSL_LEANPSK diff --git a/src/tls.c b/src/tls.c index b475b7c78..523b80697 100644 --- a/src/tls.c +++ b/src/tls.c @@ -41,14 +41,15 @@ #ifndef NO_TLS -#ifndef min +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN static INLINE word32 min(word32 a, word32 b) { return a > b ? b : a; } -#endif /* min */ +#endif /* WOLFSSL_HAVE_MIN */ #ifdef WOLFSSL_SHA384 diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 634623bee..018e84fa2 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -4773,14 +4773,15 @@ int wc_RsaKeyToDer(RsaKey* key, byte* output, word32 inLen) #if defined(WOLFSSL_CERT_GEN) && !defined(NO_RSA) -#ifndef min +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN static INLINE word32 min(word32 a, word32 b) { return a > b ? b : a; } -#endif /* min */ +#endif /* WOLFSSL_HAVE_MIN */ /* Initialize and Set Certficate defaults: diff --git a/wolfcrypt/src/dh.c b/wolfcrypt/src/dh.c index 8bbaeab20..bc4ce11d3 100644 --- a/wolfcrypt/src/dh.c +++ b/wolfcrypt/src/dh.c @@ -39,14 +39,15 @@ #endif -#ifndef min +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN static INLINE word32 min(word32 a, word32 b) { return a > b ? b : a; } -#endif /* min */ +#endif /* WOLFSSL_HAVE_MIN */ void wc_InitDhKey(DhKey* key) diff --git a/wolfcrypt/src/dsa.c b/wolfcrypt/src/dsa.c index 4de4d8196..f2124b197 100644 --- a/wolfcrypt/src/dsa.c +++ b/wolfcrypt/src/dsa.c @@ -39,14 +39,15 @@ enum { }; -#ifndef min +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN static INLINE word32 min(word32 a, word32 b) { return a > b ? b : a; } -#endif /* min */ +#endif /* WOLFSSL_HAVE_MIN */ void wc_InitDsaKey(DsaKey* key) diff --git a/wolfcrypt/src/hmac.c b/wolfcrypt/src/hmac.c index 8c7e8de2b..242adfa55 100644 --- a/wolfcrypt/src/hmac.c +++ b/wolfcrypt/src/hmac.c @@ -722,14 +722,15 @@ int wolfSSL_GetHmacMaxSize(void) #ifdef HAVE_HKDF -#ifndef min +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN static INLINE word32 min(word32 a, word32 b) { return a > b ? b : a; } -#endif /* min */ +#endif /* WOLFSSL_HAVE_MIN */ static INLINE int GetHashSizeByType(int type) diff --git a/wolfcrypt/src/md4.c b/wolfcrypt/src/md4.c index 720627fbf..c428610ef 100644 --- a/wolfcrypt/src/md4.c +++ b/wolfcrypt/src/md4.c @@ -35,14 +35,15 @@ #endif -#ifndef min +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN static INLINE word32 min(word32 a, word32 b) { return a > b ? b : a; } -#endif /* min */ +#endif /* WOLFSSL_HAVE_MIN */ void wc_InitMd4(Md4* md4) diff --git a/wolfcrypt/src/md5.c b/wolfcrypt/src/md5.c index b7affcf0c..d2583bd9b 100644 --- a/wolfcrypt/src/md5.c +++ b/wolfcrypt/src/md5.c @@ -166,14 +166,15 @@ #else /* CTaoCrypt software implementation */ -#ifndef min +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN static INLINE word32 min(word32 a, word32 b) { return a > b ? b : a; } -#endif /* min */ +#endif /* WOLFSSL_HAVE_MIN */ void wc_InitMd5(Md5* md5) diff --git a/wolfcrypt/src/pkcs7.c b/wolfcrypt/src/pkcs7.c index 84f5e3885..1e46ee608 100644 --- a/wolfcrypt/src/pkcs7.c +++ b/wolfcrypt/src/pkcs7.c @@ -36,12 +36,15 @@ #include #endif -#ifndef min +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN + static INLINE word32 min(word32 a, word32 b) { return a > b ? b : a; } -#endif + +#endif /* WOLFSSL_HAVE_MIN */ /* placed ASN.1 contentType OID into *output, return idx on success, diff --git a/wolfcrypt/src/pwdbased.c b/wolfcrypt/src/pwdbased.c index b222774e4..745493982 100644 --- a/wolfcrypt/src/pwdbased.c +++ b/wolfcrypt/src/pwdbased.c @@ -57,14 +57,15 @@ #include #endif -#ifndef min +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN static INLINE word32 min(word32 a, word32 b) { return a > b ? b : a; } -#endif /* min */ +#endif /* WOLFSSL_HAVE_MIN */ /* PBKDF1 needs at least SHA available */ diff --git a/wolfcrypt/src/ripemd.c b/wolfcrypt/src/ripemd.c index ff536a0a6..639a42d07 100644 --- a/wolfcrypt/src/ripemd.c +++ b/wolfcrypt/src/ripemd.c @@ -36,15 +36,15 @@ #endif -#ifndef min +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN static INLINE word32 min(word32 a, word32 b) { return a > b ? b : a; } -#endif /* min */ - +#endif /* WOLFSSL_HAVE_MIN */ void wc_InitRipeMd(RipeMd* ripemd) { diff --git a/wolfcrypt/src/sha.c b/wolfcrypt/src/sha.c index 792494b86..0109b8363 100644 --- a/wolfcrypt/src/sha.c +++ b/wolfcrypt/src/sha.c @@ -198,14 +198,15 @@ int wc_ShaFinal(Sha* sha, byte* hash) #else /* wc_ software implementation */ -#ifndef min +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN -static INLINE word32 min(word32 a, word32 b) -{ - return a > b ? b : a; -} + static INLINE word32 min(word32 a, word32 b) + { + return a > b ? b : a; + } -#endif /* min */ +#endif /* WOLFSSL_HAVE_MIN */ int wc_InitSha(Sha* sha) diff --git a/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c index 6ab516347..2821166b4 100755 --- a/wolfcrypt/src/sha256.c +++ b/wolfcrypt/src/sha256.c @@ -289,14 +289,15 @@ static void set_Transform(void) { #include "cau_api.h" #endif -#ifndef min +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN static INLINE word32 min(word32 a, word32 b) { return a > b ? b : a; } -#endif /* min */ +#endif /* WOLFSSL_HAVE_MIN */ int wc_InitSha256(Sha256* sha256) diff --git a/wolfcrypt/src/sha512.c b/wolfcrypt/src/sha512.c index 62457f891..8e52da909 100755 --- a/wolfcrypt/src/sha512.c +++ b/wolfcrypt/src/sha512.c @@ -88,14 +88,15 @@ int wc_Sha384Hash(const byte* data, word32 len, byte* out) #endif -#ifndef min +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN static INLINE word32 min(word32 a, word32 b) { return a > b ? b : a; } -#endif /* min */ +#endif /* WOLFSSL_HAVE_MIN */ #if defined(USE_INTEL_SPEEDUP) #define HAVE_INTEL_AVX1 From dcd660229348d44f41c1d7e4715f81cc2a22f26d Mon Sep 17 00:00:00 2001 From: John Safranek Date: Wed, 13 May 2015 15:10:05 -0700 Subject: [PATCH 077/350] misc.c can now only be included once --- wolfcrypt/src/misc.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/wolfcrypt/src/misc.c b/wolfcrypt/src/misc.c index 58483ab6c..8a79a4c29 100644 --- a/wolfcrypt/src/misc.c +++ b/wolfcrypt/src/misc.c @@ -25,6 +25,9 @@ #include +#ifndef WOLF_CRYPT_MISC_C +#define WOLF_CRYPT_MISC_C + #include /* inlining these functions is a huge speed increase and a small size decrease, @@ -194,3 +197,5 @@ STATIC INLINE int ConstantCompare(const byte* a, const byte* b, int length) } #undef STATIC + +#endif /* WOLF_CRYPT_MISC_C */ From 660e0b868bfd38341f4fa2a2125e135690b3c93b Mon Sep 17 00:00:00 2001 From: John Safranek Date: Thu, 14 May 2015 11:40:23 -0700 Subject: [PATCH 078/350] added check for window's api's min macro --- wolfssl/wolfcrypt/wc_port.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/wolfssl/wolfcrypt/wc_port.h b/wolfssl/wolfcrypt/wc_port.h index f5ad02544..c13f394f6 100644 --- a/wolfssl/wolfcrypt/wc_port.h +++ b/wolfssl/wolfcrypt/wc_port.h @@ -193,6 +193,12 @@ WOLFSSL_LOCAL int UnLockMutex(wolfSSL_Mutex*); #endif /* NO_FILESYSTEM */ +/* Windows API defines its own min() macro. */ +#if defined(USE_WINDOWS_API) && defined(min) + #define WOLFSSL_HAVE_MIN +#endif + + #ifdef __cplusplus } /* extern "C" */ #endif From f6d12bfc375d3c61eaba922f5f99601628a05617 Mon Sep 17 00:00:00 2001 From: toddouska Date: Fri, 15 May 2015 12:51:44 -0700 Subject: [PATCH 079/350] initial server side session ticket support --- examples/server/server.c | 97 +++++++++++++++++ src/internal.c | 224 +++++++++++++++++++++++++++++++++++++-- src/ssl.c | 37 +++++++ src/tls.c | 41 +++++-- wolfssl/error-ssl.h | 3 + wolfssl/internal.h | 18 +++- wolfssl/ssl.h | 22 +++- 7 files changed, 421 insertions(+), 21 deletions(-) diff --git a/examples/server/server.c b/examples/server/server.c index 3c8ac1e65..bf4b435b2 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -64,6 +64,15 @@ int myHsDoneCb(WOLFSSL* ssl, void* user_ctx); #endif +#if defined(HAVE_SESSION_TICKET) && defined(HAVE_CHACHA) && \ + defined(HAVE_POLY1305) + #include + static int TicketInit(void); + static int myTicketEncCb(WOLFSSL* ssl, byte key_name[16], byte iv[16], + byte mac[32], int enc, byte* ticket, int inLen, + int* outLen); +#endif + static void NonBlockingSSL_Accept(SSL* ssl) { @@ -415,6 +424,13 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args) if (ctx == NULL) err_sys("unable to get ctx"); +#if defined(HAVE_SESSION_TICKET) && defined(HAVE_CHACHA) && \ + defined(HAVE_POLY1305) + if (TicketInit() != 0) + err_sys("unable to setup Session Ticket Key context"); + wolfSSL_CTX_set_TicketEncCb(ctx, myTicketEncCb); +#endif + if (cipherList) if (SSL_CTX_set_cipher_list(ctx, cipherList) != SSL_SUCCESS) err_sys("server can't set cipher list 1"); @@ -732,3 +748,84 @@ while (1) { /* allow resume option */ } #endif + +#if defined(HAVE_SESSION_TICKET) && defined(HAVE_CHACHA) && \ + defined(HAVE_POLY1305) + typedef struct key_ctx { + byte name[WOLFSSL_TICKET_NAME_SZ]; /* name for this context */ + byte key[16]; /* cipher key */ + } key_ctx; + + static key_ctx myKey_ctx; + static RNG rng; + + static int TicketInit(void) + { + int ret = wc_InitRng(&rng); + if (ret != 0) return ret; + + ret = wc_RNG_GenerateBlock(&rng, myKey_ctx.key, sizeof(myKey_ctx.key)); + if (ret != 0) return ret; + + ret = wc_RNG_GenerateBlock(&rng, myKey_ctx.name,sizeof(myKey_ctx.name)); + if (ret != 0) return ret; + + return 0; + } + + static int myTicketEncCb(WOLFSSL* ssl, + byte key_name[WOLFSSL_TICKET_NAME_SZ], + byte iv[WOLFSSL_TICKET_IV_SZ], + byte mac[WOLFSSL_TICKET_MAC_SZ], + int enc, byte* ticket, int inLen, int* outLen) + { + (void)ssl; + + int ret; + word16 sLen = htons(inLen); + byte aad[WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + 2]; + int aadSz = WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + 2; + byte* tmp = aad; + + if (enc) { + XMEMCPY(key_name, myKey_ctx.name, WOLFSSL_TICKET_NAME_SZ); + + ret = wc_RNG_GenerateBlock(&rng, iv, WOLFSSL_TICKET_IV_SZ); + if (ret != 0) return ret; + + /* build aad from key name, iv, and length */ + XMEMCPY(tmp, key_name, WOLFSSL_TICKET_NAME_SZ); + tmp += WOLFSSL_TICKET_NAME_SZ; + XMEMCPY(tmp, iv, WOLFSSL_TICKET_IV_SZ); + tmp += WOLFSSL_TICKET_IV_SZ; + XMEMCPY(tmp, &sLen, 2); + + ret = wc_ChaCha20Poly1305_Encrypt(myKey_ctx.key, iv, + aad, aadSz, + ticket, inLen, + ticket, + mac); + if (ret != 0) return ret; + *outLen = inLen; /* no padding in this mode */ + } else { + /* decrypt */ + /* build aad from key name, iv, and length */ + XMEMCPY(tmp, key_name, WOLFSSL_TICKET_NAME_SZ); + tmp += WOLFSSL_TICKET_NAME_SZ; + XMEMCPY(tmp, iv, WOLFSSL_TICKET_IV_SZ); + tmp += WOLFSSL_TICKET_IV_SZ; + XMEMCPY(tmp, &sLen, 2); + + ret = wc_ChaCha20Poly1305_Decrypt(myKey_ctx.key, iv, + aad, aadSz, + ticket, inLen, + mac, + ticket); + if (ret != 0) return ret; + *outLen = inLen; /* no padding in this mode */ + } + + return 0; + } + +#endif diff --git a/src/internal.c b/src/internal.c index 13e8dd35f..37ba1246d 100644 --- a/src/internal.c +++ b/src/internal.c @@ -417,6 +417,10 @@ int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method) } #endif +#if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) + ctx->ticketHint = SESSION_TICKET_HINT_DEFAULT; +#endif + return 0; } @@ -4909,6 +4913,10 @@ static int DoHandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx, if (ssl->keys.encryptionOn) { *inOutIdx += ssl->keys.padSz; } + if (ssl->options.resuming) { + WOLFSSL_MSG("Not resuming as thought"); + ssl->options.resuming = 0; + } break; case finished: @@ -8007,6 +8015,12 @@ const char* wolfSSL_ERR_reason_error_string(unsigned long e) case SOCKET_PEER_CLOSED_E: return "Peer closed underlying transport Error"; + case BAD_TICKET_KEY_CB_SZ: + return "Bad user session ticket key callback Size Error"; + + case BAD_TICKET_MSG_SZ: + return "Bad session ticket message Size Error"; + default : return "unknown error number"; } @@ -11339,6 +11353,7 @@ int DoSessionTicket(WOLFSSL* ssl, word32 length, idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ; int sendSz; int ret; + byte sessIdSz = ID_LEN; length = VERSION_SZ + RAN_LEN + ID_LEN + ENUM_LEN @@ -11347,6 +11362,14 @@ int DoSessionTicket(WOLFSSL* ssl, #ifdef HAVE_TLS_EXTENSIONS length += TLSX_GetResponseSize(ssl); + + #ifdef HAVE_SESSION_TICKET + if (ssl->options.useTicket && ssl->arrays->sessionIDSz == 0) { + /* no session id */ + length -= ID_LEN; + sessIdSz = 0; + } + #endif /* HAVE_SESSION_TICKET */ #endif /* check for avalaible size */ @@ -11392,17 +11415,19 @@ int DoSessionTicket(WOLFSSL* ssl, } #endif /* then session id */ - output[idx++] = ID_LEN; + output[idx++] = sessIdSz; + if (sessIdSz) { - if (!ssl->options.resuming) { - ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->sessionID, ID_LEN); - if (ret != 0) - return ret; + if (!ssl->options.resuming) { + ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->sessionID, + sessIdSz); + if (ret != 0) return ret; + } + + XMEMCPY(output + idx, ssl->arrays->sessionID, sessIdSz); + idx += sessIdSz; } - XMEMCPY(output + idx, ssl->arrays->sessionID, ID_LEN); - idx += ID_LEN; - /* then cipher suite */ output[idx++] = ssl->options.cipherSuite0; output[idx++] = ssl->options.cipherSuite; @@ -13069,6 +13094,7 @@ int DoSessionTicket(WOLFSSL* ssl, /* session id */ if (sessionSz) { XMEMCPY(ssl->arrays->sessionID, input + idx, sessionSz); + ssl->arrays->sessionIDSz = (byte)sessionSz; idx += sessionSz; ssl->options.resuming = 1; } @@ -13090,7 +13116,14 @@ int DoSessionTicket(WOLFSSL* ssl, /* DoClientHello uses same resume code */ if (ssl->options.resuming) { /* let's try */ int ret = -1; - WOLFSSL_SESSION* session = GetSession(ssl,ssl->arrays->masterSecret); + WOLFSSL_SESSION* session = GetSession(ssl, + ssl->arrays->masterSecret); + #ifdef HAVE_SESSION_TICKET + if (ssl->options.useTicket == 1) { + session = &ssl->session; + } + #endif + if (!session) { WOLFSSL_MSG("Session lookup for resume failed"); ssl->options.resuming = 0; @@ -13217,6 +13250,7 @@ int DoSessionTicket(WOLFSSL* ssl, return BUFFER_ERROR; XMEMCPY(ssl->arrays->sessionID, input + i, ID_LEN); + ssl->arrays->sessionIDSz = ID_LEN; i += ID_LEN; ssl->options.resuming = 1; /* client wants to resume */ WOLFSSL_MSG("Client wants to resume session"); @@ -13379,7 +13413,13 @@ int DoSessionTicket(WOLFSSL* ssl, if (ssl->options.resuming && (!ssl->options.dtls || ssl->options.acceptState == HELLO_VERIFY_SENT)) { /* let's try */ int ret = -1; - WOLFSSL_SESSION* session = GetSession(ssl,ssl->arrays->masterSecret); + WOLFSSL_SESSION* session = GetSession(ssl, + ssl->arrays->masterSecret); + #ifdef HAVE_SESSION_TICKET + if (ssl->options.useTicket == 1) { + session = &ssl->session; + } + #endif if (!session) { WOLFSSL_MSG("Session lookup for resume failed"); @@ -13655,6 +13695,170 @@ int DoSessionTicket(WOLFSSL* ssl, return SendBuffered(ssl); } + +#ifdef HAVE_SESSION_TICKET + +#define WOLFSSL_TICKET_FIXED_SZ (WOLFSSL_TICKET_NAME_SZ + \ + WOLFSSL_TICKET_IV_SZ + WOLFSSL_TICKET_MAC_SZ + LENGTH_SZ) +#define WOLFSSL_TICKET_ENC_SZ (SESSION_TICKET_LEN - WOLFSSL_TICKET_FIXED_SZ) + + /* our ticket format */ + typedef struct InternalTicket { + ProtocolVersion pv; /* version when ticket created */ + byte suite[SUITE_LEN]; /* cipher suite when created */ + byte msecret[SECRET_LEN]; /* master secret */ + word32 timestamp; /* born on */ + } InternalTicket; + + /* fit within SESSION_TICKET_LEN */ + typedef struct ExternalTicket { + byte key_name[WOLFSSL_TICKET_NAME_SZ]; /* key context name */ + byte iv[WOLFSSL_TICKET_IV_SZ]; /* this ticket's iv */ + byte enc_len[LENGTH_SZ]; /* encrypted length */ + byte enc_ticket[WOLFSSL_TICKET_ENC_SZ]; /* encrypted internal ticket */ + byte mac[WOLFSSL_TICKET_MAC_SZ]; /* total mac */ + /* !! if add to structure, add to TICKET_FIXED_SZ !! */ + } ExternalTicket; + + /* create a new session ticket, 0 on success */ + static int CreateTicket(WOLFSSL* ssl) + { + InternalTicket it; + ExternalTicket* et = (ExternalTicket*)ssl->session.ticket; + int encLen; + int ret; + + /* build internal */ + it.pv.major = ssl->version.major; + it.pv.minor = ssl->version.minor; + + it.suite[0] = ssl->options.cipherSuite0; + it.suite[1] = ssl->options.cipherSuite; + + XMEMCPY(it.msecret, ssl->arrays->masterSecret, SECRET_LEN); + c32toa(LowResTimer(), (byte*)&it.timestamp); + + /* build external */ + XMEMCPY(et->enc_ticket, &it, sizeof(InternalTicket)); + + /* encrypt */ + encLen = WOLFSSL_TICKET_ENC_SZ; /* max size user can use */ + ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv, et->mac, 1, + et->enc_ticket, sizeof(InternalTicket), + &encLen); + if (ret == 0) { + if (encLen < (int)sizeof(InternalTicket) || + encLen > WOLFSSL_TICKET_ENC_SZ) { + WOLFSSL_MSG("Bad user ticket encrypt size"); + return BAD_TICKET_KEY_CB_SZ; + } + c16toa(encLen, et->enc_len); + ssl->session.ticketLen = (word16)(encLen + WOLFSSL_TICKET_FIXED_SZ); + if (encLen < WOLFSSL_TICKET_ENC_SZ) { + /* move mac up since whole enc buffer not used */ + XMEMMOVE(et->enc_ticket +encLen, et->mac,WOLFSSL_TICKET_MAC_SZ); + } + } + + return ret; + } + + + /* Parse ticket sent by client */ + int DoClientTicket(WOLFSSL* ssl, const byte* input, word32 len) + { + ExternalTicket* et; + InternalTicket* it; + int ret; + int outLen; + word16 inLen; + + if (len > SESSION_TICKET_LEN || + len < (word32)(sizeof(InternalTicket) + WOLFSSL_TICKET_FIXED_SZ)) { + return BAD_TICKET_MSG_SZ; + } + + et = (ExternalTicket*)input; + it = (InternalTicket*)et->enc_ticket; + + /* decrypt */ + ato16(et->enc_len, &inLen); + if (inLen > (word16)(len - WOLFSSL_TICKET_FIXED_SZ)) { + return BAD_TICKET_MSG_SZ; + } + outLen = inLen; /* may be reduced by user padding */ + ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv, + et->enc_ticket + inLen, 0, + et->enc_ticket, inLen, &outLen); + if (ret != 0) return ret; + if (outLen > inLen || outLen < (int)sizeof(InternalTicket)) { + WOLFSSL_MSG("Bad user ticket decrypt len"); + return BAD_TICKET_KEY_CB_SZ; + } + + /* get master secret */ + XMEMCPY(ssl->arrays->masterSecret, it->msecret, SECRET_LEN); + + return ret; + } + + + /* send Session Ticket */ + int SendTicket(WOLFSSL* ssl) + { + byte* output; + int ret; + int sendSz; + word32 length = SESSION_HINT_SZ + LENGTH_SZ; + word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ; + + #ifdef WOLFSSL_DTLS + if (ssl->options.dtls) { + length += DTLS_RECORD_EXTRA; + idx += DTLS_RECORD_EXTRA; + } + #endif + + if (ssl->options.createTicket) { + ret = CreateTicket(ssl); + if (ret != 0) return ret; + } + + length += ssl->session.ticketLen; + sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ; + + /* check for available size */ + if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) + return ret; + + /* get ouput buffer */ + output = ssl->buffers.outputBuffer.buffer + + ssl->buffers.outputBuffer.length; + + AddHeaders(output, length, session_ticket, ssl); + + /* hint */ + c32toa(ssl->ctx->ticketHint, output + idx); + idx += SESSION_HINT_SZ; + + /* length */ + c16toa(ssl->session.ticketLen, output + idx); + idx += LENGTH_SZ; + + /* ticket */ + XMEMCPY(output + idx, ssl->session.ticket, ssl->session.ticketLen); + /* idx += ssl->session.ticketLen; */ + + ret = HashOutput(ssl, output, sendSz, 0); + if (ret != 0) return ret; + ssl->buffers.outputBuffer.length += sendSz; + + return SendBuffered(ssl); + } + +#endif /* HAVE_SESSION_TICKET */ + + #ifdef WOLFSSL_DTLS int SendHelloVerifyRequest(WOLFSSL* ssl) { diff --git a/src/ssl.c b/src/ssl.c index b68664b7f..9136d0faa 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -865,6 +865,21 @@ int wolfSSL_Rehandshake(WOLFSSL* ssl) #endif /* HAVE_SECURE_RENEGOTIATION */ +/* Session Ticket */ +#if !defined(NO_WOLFSSL_SERVER) && defined(HAVE_SESSION_TICKET) +/* SSL_SUCCESS on ok */ +int wolfSSL_CTX_set_TicketEncCb(WOLFSSL_CTX* ctx, SessionTicketEncCb cb) +{ + if (ctx == NULL) + return BAD_FUNC_ARG; + + ctx->ticketEncCb = cb; + + return SSL_SUCCESS; +} + +#endif /* !defined(NO_WOLFSSL_CLIENT) && defined(HAVE_SESSION_TICKET) */ + /* Session Ticket */ #if !defined(NO_WOLFSSL_CLIENT) && defined(HAVE_SESSION_TICKET) int wolfSSL_UseSessionTicket(WOLFSSL* ssl) @@ -5562,6 +5577,18 @@ int wolfSSL_dtls_got_timeout(WOLFSSL* ssl) WOLFSSL_MSG("accept state ACCEPT_SECOND_REPLY_DONE"); case ACCEPT_SECOND_REPLY_DONE : +#ifdef HAVE_SESSION_TICKET + if (ssl->options.createTicket) { + if ( (ssl->error = SendTicket(ssl)) != 0) { + WOLFSSL_ERROR(ssl->error); + return SSL_FATAL_ERROR; + } + } +#endif /* HAVE_SESSION_TICKET */ + ssl->options.acceptState = TICKET_SENT; + WOLFSSL_MSG("accept state TICKET_SENT"); + + case TICKET_SENT: if ( (ssl->error = SendChangeCipher(ssl)) != 0) { WOLFSSL_ERROR(ssl->error); return SSL_FATAL_ERROR; @@ -5808,6 +5835,11 @@ WOLFSSL_SESSION* GetSession(WOLFSSL* ssl, byte* masterSecret) if (ssl->options.haveSessionId == 0) return NULL; +#ifdef HAVE_SESSION_TICKET + if (ssl->options.side == WOLFSSL_SERVER_END && ssl->options.useTicket == 1) + return NULL; +#endif + if (ssl->arrays) id = ssl->arrays->sessionID; else @@ -5896,6 +5928,11 @@ int AddSession(WOLFSSL* ssl) if (ssl->options.haveSessionId == 0) return 0; +#ifdef HAVE_SESSION_TICKET + if (ssl->options.side == WOLFSSL_SERVER_END && ssl->options.useTicket == 1) + return 0; +#endif + row = HashSession(ssl->arrays->sessionID, ID_LEN, &error) % SESSION_ROWS; if (error != 0) { WOLFSSL_MSG("Hash session failed"); diff --git a/src/tls.c b/src/tls.c index 523b80697..edf64ed18 100644 --- a/src/tls.c +++ b/src/tls.c @@ -1800,14 +1800,15 @@ static void TLSX_SessionTicket_ValidateRequest(WOLFSSL* ssl) static word16 TLSX_SessionTicket_GetSize(SessionTicket* ticket, int isRequest) { - return isRequest && ticket ? ticket->size : 0; + (void)isRequest; + return ticket ? ticket->size : 0; } static word16 TLSX_SessionTicket_Write(SessionTicket* ticket, byte* output, int isRequest) { int offset = 0; /* empty ticket */ - + if (isRequest && ticket) { XMEMCPY(output + offset, ticket->data, ticket->size); offset += ticket->size; @@ -1820,18 +1821,44 @@ static word16 TLSX_SessionTicket_Write(SessionTicket* ticket, byte* output, static int TLSX_SessionTicket_Parse(WOLFSSL* ssl, byte* input, word16 length, byte isRequest) { + int ret = 0; + if (!isRequest) { + /* client side */ if (length != 0) return BUFFER_ERROR; - + ssl->expect_session_ticket = 1; } +#ifndef NO_WOLFSSL_SERVER else { - /* TODO server side */ - (void)input; - } + /* server side */ + if (ssl->ctx->ticketEncCb == NULL) { + WOLFSSL_MSG("Client sent session ticket, server has no callback"); + return 0; + } - return 0; + if (length == 0) { + /* blank ticket */ + ret = TLSX_UseSessionTicket(&ssl->extensions, NULL); + if (ret == SSL_SUCCESS) { + ret = 0; + TLSX_SetResponse(ssl, SESSION_TICKET); /* send blank ticket */ + ssl->options.createTicket = 1; /* will send ticket msg */ + ssl->options.useTicket = 1; + } + } else { + /* got actual ticket from client */ + ret = DoClientTicket(ssl, input, length); + if (ret == 0) { /* use ticket to resume */ + ssl->options.useTicket = 1; + ssl->options.resuming = 1; + } + } + } +#endif /* NO_WOLFSSL_SERVER */ + + return ret; } WOLFSSL_LOCAL SessionTicket* TLSX_SessionTicket_Create(word32 lifetime, diff --git a/wolfssl/error-ssl.h b/wolfssl/error-ssl.h index 0df2edb6e..abeb5bdd9 100644 --- a/wolfssl/error-ssl.h +++ b/wolfssl/error-ssl.h @@ -129,6 +129,9 @@ enum wolfSSL_ErrorCodes { SNI_UNSUPPORTED = -396, /* SSL 3.0 does not support SNI */ SOCKET_PEER_CLOSED_E = -397, /* Underlying transport closed */ + BAD_TICKET_KEY_CB_SZ = -398, /* Bad session ticket key cb size */ + BAD_TICKET_MSG_SZ = -399, /* Bad session ticket msg size */ + /* add strings to SetErrorString !!!!! */ /* begin negotiation parameter errors */ diff --git a/wolfssl/internal.h b/wolfssl/internal.h index d95c2f97d..edba235dc 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -764,6 +764,7 @@ enum Misc { VERIFY_HEADER = 2, /* always use 2 bytes */ EXT_ID_SZ = 2, /* always use 2 bytes */ MAX_DH_SIZE = 513, /* 4096 bit plus possible leading 0 */ + SESSION_HINT_SZ = 4, /* session timeout hint */ MAX_SUITE_SZ = 200, /* 100 suites for now! */ RAN_LEN = 32, /* random length */ @@ -910,6 +911,10 @@ enum Misc { #define SESSION_TICKET_LEN 256 #endif +#ifndef SESSION_TICKET_HINT_DEFAULT + #define SESSION_TICKET_HINT_DEFAULT 300 +#endif + /* don't use extra 3/4k stack space unless need to */ #ifdef HAVE_NTRU @@ -1535,6 +1540,10 @@ struct WOLFSSL_CTX { #endif #ifdef HAVE_TLS_EXTENSIONS TLSX* extensions; /* RFC 6066 TLS Extensions data */ + #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SEVER) + SessionTicketEncCb ticketEncCb; /* enc/dec session ticket Cb */ + int ticketHint; /* ticket hint in seconds */ + #endif #endif #ifdef ATOMIC_USER CallbackMacEncrypt MacEncryptCb; /* Atomic User Mac/Encrypt Cb */ @@ -1797,6 +1806,7 @@ enum AcceptState { CERT_REQ_SENT, SERVER_HELLO_DONE, ACCEPT_SECOND_REPLY_DONE, + TICKET_SENT, CHANGE_CIPHER_SENT, ACCEPT_FINISHED_DONE, ACCEPT_THIRD_REPLY_DONE @@ -1889,7 +1899,11 @@ typedef struct Options { #endif #ifdef HAVE_ANON word16 haveAnon:1; /* User wants to allow Anon suites */ -#endif /* HAVE_ANON */ +#endif +#ifdef HAVE_SESSION_TICKET + word16 createTicket:1; /* Server to create new Ticket */ + word16 useTicket:1; /* Use Ticket not session cache */ +#endif /* need full byte values for this section */ byte processReply; /* nonblocking resume */ @@ -2353,6 +2367,8 @@ static const byte tls_server[FINISHED_LABEL_SZ + 1] = "server finished"; /* internal functions */ WOLFSSL_LOCAL int SendChangeCipher(WOLFSSL*); +WOLFSSL_LOCAL int SendTicket(WOLFSSL*); +WOLFSSL_LOCAL int DoClientTicket(WOLFSSL*, const byte*, word32); WOLFSSL_LOCAL int SendData(WOLFSSL*, const void*, int); WOLFSSL_LOCAL int SendCertificate(WOLFSSL*); WOLFSSL_LOCAL int SendCertificateRequest(WOLFSSL*); diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 9b9884989..3c235f22c 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -1359,8 +1359,8 @@ WOLFSSL_API int wolfSSL_Rehandshake(WOLFSSL* ssl); /* Session Ticket */ #ifdef HAVE_SESSION_TICKET -#ifndef NO_WOLFSSL_CLIENT +#ifndef NO_WOLFSSL_CLIENT WOLFSSL_API int wolfSSL_UseSessionTicket(WOLFSSL* ssl); WOLFSSL_API int wolfSSL_CTX_UseSessionTicket(WOLFSSL_CTX* ctx); WOLFSSL_API int wolfSSL_get_SessionTicket(WOLFSSL*, unsigned char*, unsigned int*); @@ -1368,9 +1368,25 @@ WOLFSSL_API int wolfSSL_set_SessionTicket(WOLFSSL*, unsigned char*, unsigned int typedef int (*CallbackSessionTicket)(WOLFSSL*, const unsigned char*, int, void*); WOLFSSL_API int wolfSSL_set_SessionTicket_cb(WOLFSSL*, CallbackSessionTicket, void*); +#endif /* NO_WOLFSSL_CLIENT */ -#endif -#endif +#ifndef NO_WOLFSSL_SERVER + +#define WOLFSSL_TICKET_NAME_SZ 16 +#define WOLFSSL_TICKET_IV_SZ 16 +#define WOLFSSL_TICKET_MAC_SZ 32 + +typedef int (*SessionTicketEncCb)(WOLFSSL*, + unsigned char key_name[WOLFSSL_TICKET_NAME_SZ], + unsigned char iv[WOLFSSL_TICKET_IV_SZ], + unsigned char mac[WOLFSSL_TICKET_MAC_SZ], + int enc, unsigned char*, int, int*); +WOLFSSL_API int wolfSSL_CTX_set_TicketEncCb(WOLFSSL_CTX* ctx, + SessionTicketEncCb); + +#endif /* NO_WOLFSSL_SERVER */ + +#endif /* HAVE_SESSION_TICKET */ #define WOLFSSL_CRL_MONITOR 0x01 /* monitor this dir flag */ #define WOLFSSL_CRL_START_MON 0x02 /* start monitoring flag */ From 221238192564bbf009facab5701a94ce51094db0 Mon Sep 17 00:00:00 2001 From: toddouska Date: Fri, 15 May 2015 14:58:16 -0700 Subject: [PATCH 080/350] add session ticket key returns for reject and use but create --- examples/server/server.c | 8 ++++---- src/internal.c | 12 +++++++----- src/tls.c | 25 +++++++++++++++++++++---- wolfssl/ssl.h | 7 +++++++ 4 files changed, 39 insertions(+), 13 deletions(-) diff --git a/examples/server/server.c b/examples/server/server.c index bf4b435b2..0b660a56e 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -791,7 +791,7 @@ while (1) { /* allow resume option */ XMEMCPY(key_name, myKey_ctx.name, WOLFSSL_TICKET_NAME_SZ); ret = wc_RNG_GenerateBlock(&rng, iv, WOLFSSL_TICKET_IV_SZ); - if (ret != 0) return ret; + if (ret != 0) return WOLFSSL_TICKET_RET_REJECT; /* build aad from key name, iv, and length */ XMEMCPY(tmp, key_name, WOLFSSL_TICKET_NAME_SZ); @@ -805,7 +805,7 @@ while (1) { /* allow resume option */ ticket, inLen, ticket, mac); - if (ret != 0) return ret; + if (ret != 0) return WOLFSSL_TICKET_RET_REJECT; *outLen = inLen; /* no padding in this mode */ } else { /* decrypt */ @@ -821,11 +821,11 @@ while (1) { /* allow resume option */ ticket, inLen, mac, ticket); - if (ret != 0) return ret; + if (ret != 0) return WOLFSSL_TICKET_RET_REJECT; *outLen = inLen; /* no padding in this mode */ } - return 0; + return WOLFSSL_TICKET_RET_OK; } #endif diff --git a/src/internal.c b/src/internal.c index 37ba1246d..c1aaf2884 100644 --- a/src/internal.c +++ b/src/internal.c @@ -9337,8 +9337,9 @@ static void PickHashSigAlgo(WOLFSSL* ssl, #endif #ifdef HAVE_SESSION_TICKET - ret = ret || - (!ssl->expect_session_ticket && ssl->session.ticketLen > 0); + /* server may send blank ticket which may not be expected to indicate + * exisiting one ok but will also be sending a new one */ + ret = ret || (ssl->session.ticketLen > 0); #endif ret = ret || @@ -13746,7 +13747,7 @@ int DoSessionTicket(WOLFSSL* ssl, ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv, et->mac, 1, et->enc_ticket, sizeof(InternalTicket), &encLen); - if (ret == 0) { + if (ret == WOLFSSL_TICKET_RET_OK) { if (encLen < (int)sizeof(InternalTicket) || encLen > WOLFSSL_TICKET_ENC_SZ) { WOLFSSL_MSG("Bad user ticket encrypt size"); @@ -13790,14 +13791,15 @@ int DoSessionTicket(WOLFSSL* ssl, ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv, et->enc_ticket + inLen, 0, et->enc_ticket, inLen, &outLen); - if (ret != 0) return ret; + if (ret == WOLFSSL_TICKET_RET_FATAL || ret < 0) return ret; if (outLen > inLen || outLen < (int)sizeof(InternalTicket)) { WOLFSSL_MSG("Bad user ticket decrypt len"); return BAD_TICKET_KEY_CB_SZ; } /* get master secret */ - XMEMCPY(ssl->arrays->masterSecret, it->msecret, SECRET_LEN); + if (ret == WOLFSSL_TICKET_RET_OK || ret == WOLFSSL_TICKET_RET_CREATE) + XMEMCPY(ssl->arrays->masterSecret, it->msecret, SECRET_LEN); return ret; } diff --git a/src/tls.c b/src/tls.c index edf64ed18..c2a368652 100644 --- a/src/tls.c +++ b/src/tls.c @@ -1844,15 +1844,32 @@ static int TLSX_SessionTicket_Parse(WOLFSSL* ssl, byte* input, word16 length, if (ret == SSL_SUCCESS) { ret = 0; TLSX_SetResponse(ssl, SESSION_TICKET); /* send blank ticket */ - ssl->options.createTicket = 1; /* will send ticket msg */ - ssl->options.useTicket = 1; + ssl->options.createTicket = 1; /* will send ticket msg */ + ssl->options.useTicket = 1; } } else { /* got actual ticket from client */ ret = DoClientTicket(ssl, input, length); - if (ret == 0) { /* use ticket to resume */ + if (ret == WOLFSSL_TICKET_RET_OK) { /* use ticket to resume */ + WOLFSSL_MSG("Using exisitng client ticket"); ssl->options.useTicket = 1; - ssl->options.resuming = 1; + ssl->options.resuming = 1; + } else if (ret == WOLFSSL_TICKET_RET_CREATE) { + WOLFSSL_MSG("Using existing client ticket, creating new one"); + ret = TLSX_UseSessionTicket(&ssl->extensions, NULL); + if (ret == SSL_SUCCESS) { + ret = 0; + TLSX_SetResponse(ssl, SESSION_TICKET); + /* send blank ticket */ + ssl->options.createTicket = 1; /* will send ticket msg */ + ssl->options.useTicket = 1; + ssl->options.resuming = 1; + } + } else if (ret == WOLFSSL_TICKET_RET_REJECT) { + WOLFSSL_MSG("Process client ticket rejected, not using"); + ret = 0; /* not fatal */ + } else if (ret == WOLFSSL_TICKET_RET_FATAL || ret < 0) { + WOLFSSL_MSG("Process client ticket fatal error, not using"); } } } diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 3c235f22c..67ffde075 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -1376,6 +1376,13 @@ WOLFSSL_API int wolfSSL_set_SessionTicket_cb(WOLFSSL*, #define WOLFSSL_TICKET_IV_SZ 16 #define WOLFSSL_TICKET_MAC_SZ 32 +enum TicketEncRet { + WOLFSSL_TICKET_RET_FATAL = -1, /* fatal error, don't use ticket */ + WOLFSSL_TICKET_RET_OK = 0, /* ok, use ticket */ + WOLFSSL_TICKET_RET_REJECT, /* don't use ticket, but not fatal */ + WOLFSSL_TICKET_RET_CREATE /* existing ticket ok and create new one */ +}; + typedef int (*SessionTicketEncCb)(WOLFSSL*, unsigned char key_name[WOLFSSL_TICKET_NAME_SZ], unsigned char iv[WOLFSSL_TICKET_IV_SZ], From 74cc2274fad5b1c0f544ae96eaa6207226b4fdf8 Mon Sep 17 00:00:00 2001 From: toddouska Date: Fri, 15 May 2015 15:30:29 -0700 Subject: [PATCH 081/350] add tiket key cleanup to help valgrind --- examples/server/server.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/examples/server/server.c b/examples/server/server.c index 0b660a56e..7d9af8d99 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -67,8 +67,9 @@ #if defined(HAVE_SESSION_TICKET) && defined(HAVE_CHACHA) && \ defined(HAVE_POLY1305) #include - static int TicketInit(void); - static int myTicketEncCb(WOLFSSL* ssl, byte key_name[16], byte iv[16], + static int TicketInit(void); + static void TicketCleanup(void); + static int myTicketEncCb(WOLFSSL* ssl, byte key_name[16], byte iv[16], byte mac[32], int enc, byte* ticket, int inLen, int* outLen); #endif @@ -664,6 +665,11 @@ while (1) { /* allow resume option */ fdCloseSession(Task_self()); #endif +#if defined(HAVE_SESSION_TICKET) && defined(HAVE_CHACHA) && \ + defined(HAVE_POLY1305) + TicketCleanup(); +#endif + #ifndef CYASSL_TIRTOS return 0; #endif @@ -773,6 +779,11 @@ while (1) { /* allow resume option */ return 0; } + static void TicketCleanup(void) + { + wc_FreeRng(&rng); + } + static int myTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ], byte iv[WOLFSSL_TICKET_IV_SZ], From cedd41432c9f72f8e1ba73807b00d995a2a723c1 Mon Sep 17 00:00:00 2001 From: toddouska Date: Fri, 15 May 2015 16:10:38 -0700 Subject: [PATCH 082/350] fix windows session ticket warnings --- src/internal.c | 2 +- src/ssl.c | 2 +- src/tls.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/internal.c b/src/internal.c index c1aaf2884..4e534dce0 100644 --- a/src/internal.c +++ b/src/internal.c @@ -13753,7 +13753,7 @@ int DoSessionTicket(WOLFSSL* ssl, WOLFSSL_MSG("Bad user ticket encrypt size"); return BAD_TICKET_KEY_CB_SZ; } - c16toa(encLen, et->enc_len); + c16toa((word16)encLen, et->enc_len); ssl->session.ticketLen = (word16)(encLen + WOLFSSL_TICKET_FIXED_SZ); if (encLen < WOLFSSL_TICKET_ENC_SZ) { /* move mac up since whole enc buffer not used */ diff --git a/src/ssl.c b/src/ssl.c index 9136d0faa..d6c76fe05 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -920,7 +920,7 @@ WOLFSSL_API int wolfSSL_set_SessionTicket(WOLFSSL* ssl, byte* buf, word32 bufSz) if (bufSz > 0) XMEMCPY(ssl->session.ticket, buf, bufSz); - ssl->session.ticketLen = bufSz; + ssl->session.ticketLen = (word16)bufSz; return SSL_SUCCESS; } diff --git a/src/tls.c b/src/tls.c index c2a368652..ca94c5b71 100644 --- a/src/tls.c +++ b/src/tls.c @@ -1807,7 +1807,7 @@ static word16 TLSX_SessionTicket_GetSize(SessionTicket* ticket, int isRequest) static word16 TLSX_SessionTicket_Write(SessionTicket* ticket, byte* output, int isRequest) { - int offset = 0; /* empty ticket */ + word16 offset = 0; /* empty ticket */ if (isRequest && ticket) { XMEMCPY(output + offset, ticket->data, ticket->size); From 8ff17b66f3d899751c9e89e415c07527299bfd39 Mon Sep 17 00:00:00 2001 From: toddouska Date: Mon, 18 May 2015 09:13:34 -0700 Subject: [PATCH 083/350] add session tickets to echoserver example too --- examples/echoserver/echoserver.c | 15 ++++- examples/server/server.c | 94 -------------------------------- wolfssl/test.h | 92 ++++++++++++++++++++++++++++++- 3 files changed, 103 insertions(+), 98 deletions(-) diff --git a/examples/echoserver/echoserver.c b/examples/echoserver/echoserver.c index c71ee3400..6b5c575e6 100644 --- a/examples/echoserver/echoserver.c +++ b/examples/echoserver/echoserver.c @@ -53,7 +53,6 @@ #include "examples/echoserver/echoserver.h" - #define SVR_COMMAND_SIZE 256 static void SignalReady(void* args, word16 port) @@ -143,6 +142,13 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args) CyaSSL_CTX_set_default_passwd_cb(ctx, PasswordCallBack); #endif +#if defined(HAVE_SESSION_TICKET) && defined(HAVE_CHACHA) && \ + defined(HAVE_POLY1305) + if (TicketInit() != 0) + err_sys("unable to setup Session Ticket Key context"); + wolfSSL_CTX_set_TicketEncCb(ctx, myTicketEncCb); +#endif + #ifndef NO_FILESYSTEM if (doPSK == 0) { #ifdef HAVE_NTRU @@ -337,6 +343,11 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args) fdCloseSession(Task_self()); #endif +#if defined(HAVE_SESSION_TICKET) && defined(HAVE_CHACHA) && \ + defined(HAVE_POLY1305) + TicketCleanup(); +#endif + #ifndef CYASSL_TIRTOS return 0; #endif @@ -382,5 +393,3 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args) #endif /* NO_MAIN_DRIVER */ - - diff --git a/examples/server/server.c b/examples/server/server.c index 7d9af8d99..5ebfb7d38 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -64,15 +64,6 @@ int myHsDoneCb(WOLFSSL* ssl, void* user_ctx); #endif -#if defined(HAVE_SESSION_TICKET) && defined(HAVE_CHACHA) && \ - defined(HAVE_POLY1305) - #include - static int TicketInit(void); - static void TicketCleanup(void); - static int myTicketEncCb(WOLFSSL* ssl, byte key_name[16], byte iv[16], - byte mac[32], int enc, byte* ticket, int inLen, - int* outLen); -#endif static void NonBlockingSSL_Accept(SSL* ssl) @@ -755,88 +746,3 @@ while (1) { /* allow resume option */ #endif -#if defined(HAVE_SESSION_TICKET) && defined(HAVE_CHACHA) && \ - defined(HAVE_POLY1305) - typedef struct key_ctx { - byte name[WOLFSSL_TICKET_NAME_SZ]; /* name for this context */ - byte key[16]; /* cipher key */ - } key_ctx; - - static key_ctx myKey_ctx; - static RNG rng; - - static int TicketInit(void) - { - int ret = wc_InitRng(&rng); - if (ret != 0) return ret; - - ret = wc_RNG_GenerateBlock(&rng, myKey_ctx.key, sizeof(myKey_ctx.key)); - if (ret != 0) return ret; - - ret = wc_RNG_GenerateBlock(&rng, myKey_ctx.name,sizeof(myKey_ctx.name)); - if (ret != 0) return ret; - - return 0; - } - - static void TicketCleanup(void) - { - wc_FreeRng(&rng); - } - - static int myTicketEncCb(WOLFSSL* ssl, - byte key_name[WOLFSSL_TICKET_NAME_SZ], - byte iv[WOLFSSL_TICKET_IV_SZ], - byte mac[WOLFSSL_TICKET_MAC_SZ], - int enc, byte* ticket, int inLen, int* outLen) - { - (void)ssl; - - int ret; - word16 sLen = htons(inLen); - byte aad[WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + 2]; - int aadSz = WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + 2; - byte* tmp = aad; - - if (enc) { - XMEMCPY(key_name, myKey_ctx.name, WOLFSSL_TICKET_NAME_SZ); - - ret = wc_RNG_GenerateBlock(&rng, iv, WOLFSSL_TICKET_IV_SZ); - if (ret != 0) return WOLFSSL_TICKET_RET_REJECT; - - /* build aad from key name, iv, and length */ - XMEMCPY(tmp, key_name, WOLFSSL_TICKET_NAME_SZ); - tmp += WOLFSSL_TICKET_NAME_SZ; - XMEMCPY(tmp, iv, WOLFSSL_TICKET_IV_SZ); - tmp += WOLFSSL_TICKET_IV_SZ; - XMEMCPY(tmp, &sLen, 2); - - ret = wc_ChaCha20Poly1305_Encrypt(myKey_ctx.key, iv, - aad, aadSz, - ticket, inLen, - ticket, - mac); - if (ret != 0) return WOLFSSL_TICKET_RET_REJECT; - *outLen = inLen; /* no padding in this mode */ - } else { - /* decrypt */ - /* build aad from key name, iv, and length */ - XMEMCPY(tmp, key_name, WOLFSSL_TICKET_NAME_SZ); - tmp += WOLFSSL_TICKET_NAME_SZ; - XMEMCPY(tmp, iv, WOLFSSL_TICKET_IV_SZ); - tmp += WOLFSSL_TICKET_IV_SZ; - XMEMCPY(tmp, &sLen, 2); - - ret = wc_ChaCha20Poly1305_Decrypt(myKey_ctx.key, iv, - aad, aadSz, - ticket, inLen, - mac, - ticket); - if (ret != 0) return WOLFSSL_TICKET_RET_REJECT; - *outLen = inLen; /* no padding in this mode */ - } - - return WOLFSSL_TICKET_RET_OK; - } - -#endif diff --git a/wolfssl/test.h b/wolfssl/test.h index 837924258..9879735e8 100644 --- a/wolfssl/test.h +++ b/wolfssl/test.h @@ -1835,5 +1835,95 @@ static INLINE const char* mymktemp(char *tempfn, int len, int num) return tempfn; } -#endif /* wolfSSL_TEST_H */ + +#if defined(HAVE_SESSION_TICKET) && defined(HAVE_CHACHA) && \ + defined(HAVE_POLY1305) + + #include + + typedef struct key_ctx { + byte name[WOLFSSL_TICKET_NAME_SZ]; /* name for this context */ + byte key[16]; /* cipher key */ + } key_ctx; + + static key_ctx myKey_ctx; + static RNG rng; + + static INLINE int TicketInit(void) + { + int ret = wc_InitRng(&rng); + if (ret != 0) return ret; + + ret = wc_RNG_GenerateBlock(&rng, myKey_ctx.key, sizeof(myKey_ctx.key)); + if (ret != 0) return ret; + + ret = wc_RNG_GenerateBlock(&rng, myKey_ctx.name,sizeof(myKey_ctx.name)); + if (ret != 0) return ret; + + return 0; + } + + static INLINE void TicketCleanup(void) + { + wc_FreeRng(&rng); + } + + static INLINE int myTicketEncCb(WOLFSSL* ssl, + byte key_name[WOLFSSL_TICKET_NAME_SZ], + byte iv[WOLFSSL_TICKET_IV_SZ], + byte mac[WOLFSSL_TICKET_MAC_SZ], + int enc, byte* ticket, int inLen, int* outLen) + { + (void)ssl; + + int ret; + word16 sLen = htons(inLen); + byte aad[WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + 2]; + int aadSz = WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + 2; + byte* tmp = aad; + + if (enc) { + XMEMCPY(key_name, myKey_ctx.name, WOLFSSL_TICKET_NAME_SZ); + + ret = wc_RNG_GenerateBlock(&rng, iv, WOLFSSL_TICKET_IV_SZ); + if (ret != 0) return WOLFSSL_TICKET_RET_REJECT; + + /* build aad from key name, iv, and length */ + XMEMCPY(tmp, key_name, WOLFSSL_TICKET_NAME_SZ); + tmp += WOLFSSL_TICKET_NAME_SZ; + XMEMCPY(tmp, iv, WOLFSSL_TICKET_IV_SZ); + tmp += WOLFSSL_TICKET_IV_SZ; + XMEMCPY(tmp, &sLen, 2); + + ret = wc_ChaCha20Poly1305_Encrypt(myKey_ctx.key, iv, + aad, aadSz, + ticket, inLen, + ticket, + mac); + if (ret != 0) return WOLFSSL_TICKET_RET_REJECT; + *outLen = inLen; /* no padding in this mode */ + } else { + /* decrypt */ + /* build aad from key name, iv, and length */ + XMEMCPY(tmp, key_name, WOLFSSL_TICKET_NAME_SZ); + tmp += WOLFSSL_TICKET_NAME_SZ; + XMEMCPY(tmp, iv, WOLFSSL_TICKET_IV_SZ); + tmp += WOLFSSL_TICKET_IV_SZ; + XMEMCPY(tmp, &sLen, 2); + + ret = wc_ChaCha20Poly1305_Decrypt(myKey_ctx.key, iv, + aad, aadSz, + ticket, inLen, + mac, + ticket); + if (ret != 0) return WOLFSSL_TICKET_RET_REJECT; + *outLen = inLen; /* no padding in this mode */ + } + + return WOLFSSL_TICKET_RET_OK; + } + +#endif /* HAVE_SESSION_TICKET && CHACHA20 && POLY1305 */ + +#endif /* wolfSSL_TEST_H */ From e730aa571cc3e703e486f525e34cd85f1a53feec Mon Sep 17 00:00:00 2001 From: toddouska Date: Mon, 18 May 2015 09:29:25 -0700 Subject: [PATCH 084/350] add sanity checks to user session ticket encrypt callback --- src/internal.c | 36 +++++++++++++++++++++++++++++++++++- wolfssl/error-ssl.h | 1 + 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/internal.c b/src/internal.c index 4e534dce0..aa69f8310 100644 --- a/src/internal.c +++ b/src/internal.c @@ -8021,6 +8021,9 @@ const char* wolfSSL_ERR_reason_error_string(unsigned long e) case BAD_TICKET_MSG_SZ: return "Bad session ticket message Size Error"; + case BAD_TICKET_ENCRYPT: + return "Bad user ticket callback encrypt Error"; + default : return "unknown error number"; } @@ -13728,6 +13731,7 @@ int DoSessionTicket(WOLFSSL* ssl, ExternalTicket* et = (ExternalTicket*)ssl->session.ticket; int encLen; int ret; + byte zeros[WOLFSSL_TICKET_MAC_SZ]; /* biggest cmp size */ /* build internal */ it.pv.major = ssl->version.major; @@ -13753,6 +13757,36 @@ int DoSessionTicket(WOLFSSL* ssl, WOLFSSL_MSG("Bad user ticket encrypt size"); return BAD_TICKET_KEY_CB_SZ; } + + /* sanity checks on encrypt callback */ + + /* internal ticket can't be the same if encrypted */ + if (XMEMCMP(et->enc_ticket, &it, sizeof(InternalTicket)) == 0) { + WOLFSSL_MSG("User ticket encrypt didn't encrypt"); + return BAD_TICKET_ENCRYPT; + } + + XMEMSET(zeros, 0, sizeof(zeros)); + + /* name */ + if (XMEMCMP(et->key_name, zeros, WOLFSSL_TICKET_NAME_SZ) == 0) { + WOLFSSL_MSG("User ticket encrypt didn't set name"); + return BAD_TICKET_ENCRYPT; + } + + /* iv */ + if (XMEMCMP(et->iv, zeros, WOLFSSL_TICKET_IV_SZ) == 0) { + WOLFSSL_MSG("User ticket encrypt didn't set iv"); + return BAD_TICKET_ENCRYPT; + } + + /* mac */ + if (XMEMCMP(et->mac, zeros, WOLFSSL_TICKET_MAC_SZ) == 0) { + WOLFSSL_MSG("User ticket encrypt didn't set mac"); + return BAD_TICKET_ENCRYPT; + } + + /* set size */ c16toa((word16)encLen, et->enc_len); ssl->session.ticketLen = (word16)(encLen + WOLFSSL_TICKET_FIXED_SZ); if (encLen < WOLFSSL_TICKET_ENC_SZ) { @@ -13765,7 +13799,7 @@ int DoSessionTicket(WOLFSSL* ssl, } - /* Parse ticket sent by client */ + /* Parse ticket sent by client, returns callback return value */ int DoClientTicket(WOLFSSL* ssl, const byte* input, word32 len) { ExternalTicket* et; diff --git a/wolfssl/error-ssl.h b/wolfssl/error-ssl.h index abeb5bdd9..d9dc80dc0 100644 --- a/wolfssl/error-ssl.h +++ b/wolfssl/error-ssl.h @@ -131,6 +131,7 @@ enum wolfSSL_ErrorCodes { BAD_TICKET_KEY_CB_SZ = -398, /* Bad session ticket key cb size */ BAD_TICKET_MSG_SZ = -399, /* Bad session ticket msg size */ + BAD_TICKET_ENCRYPT = -400, /* Bad user ticket encrypt */ /* add strings to SetErrorString !!!!! */ From 8b52330877a25f2b16a3c53dc5e64cfdb3cd5918 Mon Sep 17 00:00:00 2001 From: toddouska Date: Mon, 18 May 2015 09:48:15 -0700 Subject: [PATCH 085/350] add key name compare for session ticket callback example --- wolfssl/test.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/wolfssl/test.h b/wolfssl/test.h index 9879735e8..31d90f12b 100644 --- a/wolfssl/test.h +++ b/wolfssl/test.h @@ -1905,6 +1905,13 @@ static INLINE const char* mymktemp(char *tempfn, int len, int num) *outLen = inLen; /* no padding in this mode */ } else { /* decrypt */ + + /* see if we know this key */ + if (XMEMCMP(key_name, myKey_ctx.name, WOLFSSL_TICKET_NAME_SZ) != 0){ + printf("client presented unknown ticket key name "); + return WOLFSSL_TICKET_RET_FATAL; + } + /* build aad from key name, iv, and length */ XMEMCPY(tmp, key_name, WOLFSSL_TICKET_NAME_SZ); tmp += WOLFSSL_TICKET_NAME_SZ; From bbec7011d4590b25c5ce458e5aa0e64f54471b2c Mon Sep 17 00:00:00 2001 From: toddouska Date: Mon, 18 May 2015 13:15:13 -0700 Subject: [PATCH 086/350] add session ticket hint interval setter --- src/ssl.c | 11 +++++++++++ wolfssl/ssl.h | 1 + 2 files changed, 12 insertions(+) diff --git a/src/ssl.c b/src/ssl.c index d6c76fe05..df41ecb0a 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -878,6 +878,17 @@ int wolfSSL_CTX_set_TicketEncCb(WOLFSSL_CTX* ctx, SessionTicketEncCb cb) return SSL_SUCCESS; } +/* set hint interval, SSL_SUCCESS on ok */ +int wolfSSL_CTX_set_TicketHint(WOLFSSL_CTX* ctx, int hint) +{ + if (ctx == NULL) + return BAD_FUNC_ARG; + + ctx->ticketHint = hint; + + return SSL_SUCCESS; +} + #endif /* !defined(NO_WOLFSSL_CLIENT) && defined(HAVE_SESSION_TICKET) */ /* Session Ticket */ diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 67ffde075..aaa100db8 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -1390,6 +1390,7 @@ typedef int (*SessionTicketEncCb)(WOLFSSL*, int enc, unsigned char*, int, int*); WOLFSSL_API int wolfSSL_CTX_set_TicketEncCb(WOLFSSL_CTX* ctx, SessionTicketEncCb); +WOLFSSL_API int wolfSSL_CTX_set_TicketHint(WOLFSSL_CTX* ctx, int); #endif /* NO_WOLFSSL_SERVER */ From 9a10210a2a4f06c46a905dd9270619c0f21287ae Mon Sep 17 00:00:00 2001 From: John Safranek Date: Tue, 19 May 2015 09:52:30 -0700 Subject: [PATCH 087/350] replaced always-true comparison in PrintSessionStats with preprocessor checks --- src/ssl.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index df41ecb0a..258b91db6 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -6224,16 +6224,17 @@ int wolfSSL_get_session_stats(word32* active, word32* total, word32* peak, } printf(" chi-square = %5.1f, d.f. = %d\n", chiSquare, SESSION_ROWS - 1); - if (SESSION_ROWS == 11) + #if (SESSION_ROWS == 11) printf(" .05 p value = 18.3, chi-square should be less\n"); - else if (SESSION_ROWS == 211) + #elif (SESSION_ROWS == 211) printf(".05 p value = 244.8, chi-square should be less\n"); - else if (SESSION_ROWS == 5981) + #elif (SESSION_ROWS == 5981) printf(".05 p value = 6161.0, chi-square should be less\n"); - else if (SESSION_ROWS == 3) + #elif (SESSION_ROWS == 3) printf(".05 p value = 6.0, chi-square should be less\n"); - else if (SESSION_ROWS == 2861) + #elif (SESSION_ROWS == 2861) printf(".05 p value = 2985.5, chi-square should be less\n"); + #endif printf("\n"); return ret; From 50a80bbcd25cb272c74680f381d26c4f2c03de67 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Tue, 19 May 2015 14:37:03 -0700 Subject: [PATCH 088/350] update Windows FIPS preprocessor flags in project file --- IDE/WIN/wolfssl-fips.vcxproj | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/IDE/WIN/wolfssl-fips.vcxproj b/IDE/WIN/wolfssl-fips.vcxproj index 94341ec5f..4e67a2250 100644 --- a/IDE/WIN/wolfssl-fips.vcxproj +++ b/IDE/WIN/wolfssl-fips.vcxproj @@ -120,7 +120,7 @@ Disabled ./;../../;%(AdditionalIncludeDirectories) - OPENSSL_EXTRA;HAVE_FIPS;HAVE_AESGCM;HAVE_HASHDRBG;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;NO_RC4;NO_RABBIT;NO_DSA;NO_MD4;%(PreprocessorDefinitions) + OPENSSL_EXTRA;HAVE_THREAD_LS;HAVE_FIPS;HAVE_AESGCM;HAVE_HASHDRBG;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;NO_RC4;NO_RABBIT;NO_DSA;NO_MD4;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 @@ -132,7 +132,7 @@ Disabled ./;../../;%(AdditionalIncludeDirectories) - OPENSSL_EXTRA;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) + OPENSSL_EXTRA;HAVE_THREAD_LS;BUILDING_WOLFSSL;WOLFSSL_DLL;HAVE_FIPS;HAVE_AESGCM;HAVE_HASHDRBG;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;NO_RC4;NO_RABBIT;NO_DSA;NO_MD4;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -145,7 +145,7 @@ Disabled ./;../../;%(AdditionalIncludeDirectories) - OPENSSL_EXTRA;HAVE_FIPS;HAVE_AESGCM;HAVE_HASHDRBG;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;NO_RC4;NO_RABBIT;NO_DSA;NO_MD4;%(PreprocessorDefinitions) + OPENSSL_EXTRA;HAVE_THREAD_LS;HAVE_FIPS;HAVE_AESGCM;HAVE_HASHDRBG;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;NO_RC4;NO_RABBIT;NO_DSA;NO_MD4;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 @@ -157,20 +157,23 @@ Disabled ./;../../;%(AdditionalIncludeDirectories) - OPENSSL_EXTRA;WOLFSSL_RIPEMD;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) + OPENSSL_EXTRA;HAVE_THREAD_LS;BUILDING_WOLFSSL;WOLFSSL_DLL;HAVE_FIPS;HAVE_AESGCM;HAVE_HASHDRBG;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;NO_RC4;NO_RABBIT;NO_DSA;NO_MD4;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 ProgramDatabase 4206;4214;4706;%(DisableSpecificWarnings) + + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + MaxSpeed true ./;../../;%(AdditionalIncludeDirectories) - OPENSSL_EXTRA;HAVE_FIPS;HAVE_AESGCM;HAVE_HASHDRBG;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;NO_RC4;NO_RABBIT;NO_DSA;NO_MD4;%(PreprocessorDefinitions) + OPENSSL_EXTRA;HAVE_THREAD_LS;HAVE_FIPS;HAVE_AESGCM;HAVE_HASHDRBG;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;NO_RC4;NO_RABBIT;NO_DSA;NO_MD4;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 @@ -182,7 +185,7 @@ MaxSpeed true ./;../../;%(AdditionalIncludeDirectories) - OPENSSL_EXTRA;HAVE_FIPS;HAVE_AESGCM;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) + OPENSSL_EXTRA;HAVE_THREAD_LS;BUILDING_WOLFSSL;WOLFSSL_DLL;HAVE_FIPS;HAVE_AESGCM;HAVE_HASHDRBG;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;NO_RC4;NO_RABBIT;NO_DSA;NO_MD4;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 @@ -194,7 +197,7 @@ MaxSpeed true ./;../../;%(AdditionalIncludeDirectories) - OPENSSL_EXTRA;HAVE_FIPS;HAVE_AESGCM;HAVE_HASHDRBG;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;NO_RC4;NO_RABBIT;NO_DSA;NO_MD4;%(PreprocessorDefinitions) + OPENSSL_EXTRA;HAVE_THREAD_LS;HAVE_FIPS;HAVE_AESGCM;HAVE_HASHDRBG;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;NO_RC4;NO_RABBIT;NO_DSA;NO_MD4;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 @@ -206,7 +209,7 @@ MaxSpeed true ./;../../;%(AdditionalIncludeDirectories) - OPENSSL_EXTRA;WOLFSSL_SHA512;NO_PSK;BUILDING_WOLFSSL;WOLFSSL_DLL;%(PreprocessorDefinitions) + OPENSSL_EXTRA;HAVE_THREAD_LS;BUILDING_WOLFSSL;WOLFSSL_DLL;HAVE_FIPS;HAVE_AESGCM;HAVE_HASHDRBG;WOLFSSL_SHA384;WOLFSSL_SHA512;NO_PSK;NO_RC4;NO_RABBIT;NO_DSA;NO_MD4;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 @@ -214,9 +217,6 @@ - - $(IntDir)ctaocrypt\ - $(IntDir)ctaocrypt\ @@ -307,4 +307,4 @@ - + \ No newline at end of file From 1a315fd89e97a413e30e9d4f4ed92508f317df99 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Thu, 21 May 2015 13:31:02 +0900 Subject: [PATCH 089/350] Initial TI crypt/hash --- wolfcrypt/src/port/ti/ti-aes.c | 548 ++++++++++++++++++++++++++++++++ wolfcrypt/src/port/ti/ti-ccm.c | 81 +++++ wolfcrypt/src/port/ti/ti-des3.c | 181 +++++++++++ wolfcrypt/src/port/ti/ti-hash.c | 231 ++++++++++++++ 4 files changed, 1041 insertions(+) create mode 100644 wolfcrypt/src/port/ti/ti-aes.c create mode 100644 wolfcrypt/src/port/ti/ti-ccm.c create mode 100644 wolfcrypt/src/port/ti/ti-des3.c create mode 100644 wolfcrypt/src/port/ti/ti-hash.c diff --git a/wolfcrypt/src/port/ti/ti-aes.c b/wolfcrypt/src/port/ti/ti-aes.c new file mode 100644 index 000000000..11a0680b6 --- /dev/null +++ b/wolfcrypt/src/port/ti/ti-aes.c @@ -0,0 +1,548 @@ +/* port/ti/ti-aes.c + * + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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. + * + * wolfSSL 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 + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#ifndef NO_AES + + +#if defined(WOLFSSL_TI_CRYPT) +#include +#include + +#include +#include +#include + +#include "inc/hw_aes.h" +#include "inc/hw_memmap.h" +#include "inc/hw_ints.h" +#include "driverlib/aes.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom_map.h" +#include "driverlib/rom.h" + +static int AesSetIV(Aes* aes, const byte* iv) +{ + if (aes == NULL) + return BAD_FUNC_ARG; + + if (iv) + XMEMCPY(aes->reg, iv, AES_BLOCK_SIZE); + else + XMEMSET(aes->reg, 0, AES_BLOCK_SIZE); + + return 0; +} + +WOLFSSL_API int wc_AesSetKey(Aes* aes, const byte* key, word32 len, const byte* iv, + int dir) +{ + if(!wolfSSL_TI_CCMInit())return 1 ; + if ((aes == NULL) || (key == NULL) || (iv == NULL)) + return BAD_FUNC_ARG; + if(!((dir == AES_ENCRYPTION) || (dir == AES_DECRYPTION))) + return BAD_FUNC_ARG; + + switch(len) { + case 16: aes->keylen = AES_CFG_KEY_SIZE_128BIT ; break ; + case 24: aes->keylen = AES_CFG_KEY_SIZE_192BIT ; break ; + case 32: aes->keylen = AES_CFG_KEY_SIZE_256BIT ; break ; + default: return BAD_FUNC_ARG; + } + + XMEMCPY(aes->key, key, len) ; + #ifdef WOLFSSL_AES_COUNTER + aes->left = 0; + #endif /* WOLFSSL_AES_COUNTER */ + return AesSetIV(aes, iv); +} + +#define AES_CFG_MODE_CTR_NOCTR AES_CFG_MODE_CTR+100 +#define IS_ALIGN16(p) (((unsigned int)(p)&0xf) == 0) + +static int AesAlign16(Aes* aes, byte* out, const byte* in, word32 sz, word32 dir, word32 mode) +{ + wolfSSL_TI_lockCCM() ; + ROM_AESReset(AES_BASE); + ROM_AESConfigSet(AES_BASE, (aes->keylen | dir | + (mode==AES_CFG_MODE_CTR_NOCTR ? AES_CFG_MODE_CTR : mode))); + AESIVSet(AES_BASE, aes->reg); + ROM_AESKey1Set(AES_BASE, aes->key, aes->keylen); + if((dir == AES_CFG_DIR_DECRYPT)&& (mode == AES_CFG_MODE_CBC)) + /* if input and output same will overwrite input iv */ + XMEMCPY(aes->tmp, in + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE); + ROM_AESDataProcess(AES_BASE, (uint32_t *)in, (uint32_t *)out, sz); + wolfSSL_TI_unlockCCM() ; + + /* store iv for next call */ + if(mode == AES_CFG_MODE_CBC){ + if(dir == AES_CFG_DIR_ENCRYPT) + XMEMCPY(aes->reg, out + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE); + else + XMEMCPY(aes->reg, aes->tmp, AES_BLOCK_SIZE); + } + + if(mode == AES_CFG_MODE_CTR) { + do { + int i ; + for (i = AES_BLOCK_SIZE - 1; i >= 0; i--) { + if (++((byte *)aes->reg)[i]) + break ; + } + sz -= AES_BLOCK_SIZE ; + } while((int)sz > 0) ; + } + + return 0 ; +} + +static int AesProcess(Aes* aes, byte* out, const byte* in, word32 sz, word32 dir, word32 mode) +{ + const byte * in_p ; byte * out_p ; + word32 size ; + #define TI_BUFFSIZE 1024 + byte buff[TI_BUFFSIZE] ; + + if ((aes == NULL) || (in == NULL) || (out == NULL)) + return BAD_FUNC_ARG; + if(sz % AES_BLOCK_SIZE) + return BAD_FUNC_ARG; + + while(sz > 0) { + size = sz ; in_p = in ; out_p = out ; + if(!IS_ALIGN16(in)){ + size = sz>TI_BUFFSIZE ? TI_BUFFSIZE : sz ; + XMEMCPY(buff, in, size) ; + in_p = (const byte *)buff ; + } + if(!IS_ALIGN16(out)){ + size = sz>TI_BUFFSIZE ? TI_BUFFSIZE : sz ; + out_p = buff ; + } + + AesAlign16(aes, out_p, in_p, size, dir, mode) ; + + if(!IS_ALIGN16(out)){ + XMEMCPY(out, buff, size) ; + } + sz -= size ; in += size ; out += size ; + } + + return 0 ; +} + +WOLFSSL_API int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) +{ + return AesProcess(aes, out, in, sz, AES_CFG_DIR_ENCRYPT, AES_CFG_MODE_CBC) ; +} + +WOLFSSL_API int wc_AesCbcDecrypt(Aes* aes, byte* out, const byte* in, word32 sz) +{ + return AesProcess(aes, out, in, sz, AES_CFG_DIR_DECRYPT, AES_CFG_MODE_CBC) ; +} + +#ifdef WOLFSSL_AES_COUNTER +WOLFSSL_API void wc_AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) +{ + char out_block[AES_BLOCK_SIZE] ; + int odd ; + int even ; + char *tmp ; /* (char *)aes->tmp, for short */ + + tmp = (char *)aes->tmp ; + if(aes->left) { + if((aes->left + sz) >= AES_BLOCK_SIZE){ + odd = AES_BLOCK_SIZE - aes->left ; + } else { + odd = sz ; + } + XMEMCPY(tmp+aes->left, in, odd) ; + if((odd+aes->left) == AES_BLOCK_SIZE){ + AesProcess(aes, (byte *)out_block, (byte const *)tmp, AES_BLOCK_SIZE, + AES_CFG_DIR_ENCRYPT, AES_CFG_MODE_CTR) ; + XMEMCPY(out, out_block+aes->left, odd) ; + aes->left = 0 ; + XMEMSET(tmp, 0x0, AES_BLOCK_SIZE) ; + } + in += odd ; + out+= odd ; + sz -= odd ; + } + odd = sz % AES_BLOCK_SIZE ; /* if there is tail flagment */ + if(sz / AES_BLOCK_SIZE) { + even = (sz/AES_BLOCK_SIZE)*AES_BLOCK_SIZE ; + AesProcess(aes, out, in, even, AES_CFG_DIR_ENCRYPT, AES_CFG_MODE_CTR); + out += even ; + in += even ; + } + if(odd) { + XMEMSET(tmp+aes->left, 0x0, AES_BLOCK_SIZE - aes->left) ; + XMEMCPY(tmp+aes->left, in, odd) ; + AesProcess(aes, (byte *)out_block, (byte const *)tmp, AES_BLOCK_SIZE, + AES_CFG_DIR_ENCRYPT, + AES_CFG_MODE_CTR_NOCTR /* Counter mode without counting IV */ + ); + XMEMCPY(out, out_block+aes->left,odd) ; + aes->left += odd ; + } +} +#endif + +/* AES-DIRECT */ +#if defined(WOLFSSL_AES_DIRECT) +WOLFSSL_API void wc_AesEncryptDirect(Aes* aes, byte* out, const byte* in) +{ + AesProcess(aes, out, in, AES_BLOCK_SIZE, AES_CFG_DIR_ENCRYPT, AES_CFG_MODE_CBC) ; +} +WOLFSSL_API void wc_AesDecryptDirect(Aes* aes, byte* out, const byte* in) +{ + AesProcess(aes, out, in, AES_BLOCK_SIZE, AES_CFG_DIR_DECRYPT, AES_CFG_MODE_CBC) ; +} +WOLFSSL_API int wc_AesSetKeyDirect(Aes* aes, const byte* key, word32 len, + const byte* iv, int dir) +{ + return(wc_AesSetKey(aes, key, len, iv, dir)) ; +} +#endif + + +#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) + +static int AesAuthSetKey(Aes* aes, const byte* key, word32 keySz) +{ + byte nonce[AES_BLOCK_SIZE]; + + if ((aes == NULL) || (key == NULL)) + return BAD_FUNC_ARG ; + if (!((keySz == 16) || (keySz == 24) || (keySz == 32))) + return BAD_FUNC_ARG ; + + XMEMSET(nonce, 0, sizeof(nonce)); + return wc_AesSetKey(aes, key, keySz, nonce, AES_ENCRYPTION); +} + + +static int AesAuthArgCheck(Aes* aes, byte* out, const byte* in, word32 inSz, + const byte* nonce, word32 nonceSz, + const byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz, word32 *M, word32 *L) +{ + if((aes == NULL)||(nonce == NULL)||(authTag== NULL)||(authIn == NULL)) + return BAD_FUNC_ARG; + if((inSz != 0) && ((out == NULL)||(in == NULL))) + return BAD_FUNC_ARG; + + switch(authTagSz){ + case 4: + *M = AES_CFG_CCM_M_4; break ; + case 6: + *M = AES_CFG_CCM_M_6; break ; + case 8: + *M = AES_CFG_CCM_M_8; break ; + case 10: + *M = AES_CFG_CCM_M_10; break ; + case 12: + *M = AES_CFG_CCM_M_12; break ; + case 14: + *M = AES_CFG_CCM_M_14; break ; + case 16: + *M = AES_CFG_CCM_M_16; break ; + default: + return 1 ; + } + + switch(nonceSz){ + case 7: + *L = AES_CFG_CCM_L_8; break ; + case 8: + *L = AES_CFG_CCM_L_7; break ; + case 9: + *L = AES_CFG_CCM_L_6; break ; + case 10: + *L = AES_CFG_CCM_L_5; break ; + case 11: + *L = AES_CFG_CCM_L_4; break ; + case 12: + *L = AES_CFG_CCM_L_3; break ; + case 13: + *L = AES_CFG_CCM_L_2; break ; + case 14: + *L = AES_CFG_CCM_L_1; break ; + default: + return 1; + } + return 0 ; +} + +static void AesAuthSetIv(Aes *aes, const byte *nonce, word32 len, word32 L, int mode) { + + if(mode == AES_CFG_MODE_CCM){ + XMEMSET(aes->reg, 0, 16) ; + switch(L){ + case AES_CFG_CCM_L_8: + aes->reg[0] = 0x7; break ; + case AES_CFG_CCM_L_7: + aes->reg[0] = 0x6; break ; + case AES_CFG_CCM_L_6: + aes->reg[0] = 0x5; break ; + case AES_CFG_CCM_L_5: + aes->reg[0] = 0x4; break ; + case AES_CFG_CCM_L_4: + aes->reg[0] = 0x3; break ; + case AES_CFG_CCM_L_3: + aes->reg[0] = 0x2; break ; + case AES_CFG_CCM_L_2: + aes->reg[0] = 0x1; break ; + case AES_CFG_CCM_L_1: + aes->reg[0] = 0x0; break ; + } + XMEMCPY(((byte *)aes->reg)+1, nonce, len) ; + } else { + byte *b = (byte *)aes->reg ; + XMEMSET(aes->reg, 0, AES_BLOCK_SIZE); + XMEMCPY(aes->reg, nonce, len); + b[AES_BLOCK_SIZE-4] = 0 ; + b[AES_BLOCK_SIZE-3] = 0 ; + b[AES_BLOCK_SIZE-2] = 0 ; + b[AES_BLOCK_SIZE-1] = 1 ; + } +} + +#define RoundUp16(n) ((n+15)&0xfffffff0) +#define FREE_ALL \ + if(in_save) XFREE(in_save, NULL, DYNAMIC_TYPE_TMP_BUFFER);\ + if(out_save) XFREE(out_save, NULL, DYNAMIC_TYPE_TMP_BUFFER);\ + if(authIn_save)XFREE(authIn_save, NULL, DYNAMIC_TYPE_TMP_BUFFER);\ + if(nonce_save) XFREE(nonce_save, NULL, DYNAMIC_TYPE_TMP_BUFFER); + +static int AesAuthEncrypt(Aes* aes, byte* out, const byte* in, word32 inSz, + const byte* nonce, word32 nonceSz, + byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz, int mode) +{ + word32 M, L ; + byte *in_a, *in_save ; + byte *out_a, *out_save ; + byte *authIn_a, *authIn_save ; + byte *nonce_a, *nonce_save ; + word32 tmpTag[4] ; + int ret ; + + if(AesAuthArgCheck(aes, out, in, inSz, nonce, nonceSz, authTag, authTagSz, authIn, authInSz, &M, &L) + == BAD_FUNC_ARG)return BAD_FUNC_ARG ; + + /* 16 byte padding */ + in_save = NULL ; out_save = NULL ; authIn_save = NULL ; nonce_save = NULL ; + if((inSz%16)==0){ + in_save = NULL ; in_a = (byte *)in ; + out_save = NULL ; out_a = out ; + } else { + if((in_save = XMALLOC(RoundUp16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ + FREE_ALL; return MEMORY_E ; } + in_a = in_save ; XMEMSET(in_a, 0, RoundUp16(inSz)) ; XMEMCPY(in_a, in, inSz) ; + + if((out_save = XMALLOC(RoundUp16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ + FREE_ALL; return MEMORY_E ; } + out_a = out_save ; + } + + if((authInSz%16)==0){ + authIn_save = NULL ; authIn_a = (byte *)authIn ; + } else { + if((authIn_save = XMALLOC(RoundUp16(authInSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ + FREE_ALL; return MEMORY_E ; } + authIn_a = authIn_save ; XMEMSET(authIn_a, 0, RoundUp16(authInSz)) ; XMEMCPY(authIn_a, authIn, authInSz) ; + } + + if((nonceSz%16)==0){ + nonce_save = NULL ; nonce_a = (byte *)nonce ; + } else { + if((nonce_save = XMALLOC(RoundUp16(nonceSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ + FREE_ALL; return MEMORY_E; } + nonce_a = nonce_save ; XMEMSET(nonce_a, 0, RoundUp16(nonceSz)) ; XMEMCPY(nonce_a, nonce, nonceSz) ; + } + + /* do aes-ccm */ + AesAuthSetIv(aes, nonce, nonceSz, L, mode) ; + ROM_AESReset(AES_BASE); + ROM_AESConfigSet(AES_BASE, (aes->keylen | AES_CFG_DIR_ENCRYPT | + AES_CFG_CTR_WIDTH_128 | + mode | ((mode== AES_CFG_MODE_CCM) ? (L | M) : 0 ))) ; + ROM_AESIVSet(AES_BASE, aes->reg); + ROM_AESKey1Set(AES_BASE, aes->key, aes->keylen); + ret = ROM_AESDataProcessAuth(AES_BASE, (unsigned int*)in_a, (unsigned int *)out_a, inSz, + (unsigned int*)authIn_a, authInSz, (unsigned int *)tmpTag); + if(ret == false){ + XMEMSET(out, 0, inSz) ; + XMEMSET(authTag, 0, authTagSz) ; + } else { + XMEMCPY(out, out_a, inSz) ; + XMEMCPY(authTag, tmpTag, authTagSz) ; + } + + FREE_ALL; + return 0 ; +} + +static int AesAuthDecrypt(Aes* aes, byte* out, const byte* in, word32 inSz, + const byte* nonce, word32 nonceSz, + const byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz, int mode) +{ + word32 M, L ; + byte *in_a, *in_save ; + byte *out_a, *out_save ; + byte *authIn_a, *authIn_save ; + byte *nonce_a, *nonce_save ; + word32 tmpTag[4] ; + bool ret ; + + if(AesAuthArgCheck(aes, out, in, inSz, nonce, nonceSz, authTag, authTagSz, authIn, authInSz, &M, &L) + == BAD_FUNC_ARG)return BAD_FUNC_ARG ; + + /* 16 byte padding */ + in_save = NULL ; out_save = NULL ; authIn_save = NULL ; nonce_save = NULL ; + if((inSz%16)==0){ + in_save = NULL ; in_a = (byte *)in ; + out_save = NULL ; out_a = out ; + } else { + if((in_save = XMALLOC(RoundUp16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ + FREE_ALL; return MEMORY_E;} + in_a = in_save ; XMEMSET(in_a, 0, RoundUp16(inSz)) ; XMEMCPY(in_a, in, inSz) ; + + if((out_save = XMALLOC(RoundUp16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ + FREE_ALL; return MEMORY_E;} + out_a = out_save ; + } + + if((authInSz%16)==0){ + authIn_save = NULL ; authIn_a = (byte *)authIn ; + } else { + if((authIn_save = XMALLOC(RoundUp16(authInSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ + FREE_ALL; return MEMORY_E; } + authIn_a = authIn_save ; XMEMSET(authIn_a, 0, RoundUp16(authInSz)) ; XMEMCPY(authIn_a, authIn, authInSz) ; + } + + if((nonceSz%16)==0){ + nonce_save = NULL ; nonce_a = (byte *)nonce ; + } else { + if((nonce_save = XMALLOC(RoundUp16(nonceSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ + FREE_ALL; return MEMORY_E; } + nonce_a = nonce_save ; XMEMSET(nonce_a, 0, RoundUp16(nonceSz)) ; XMEMCPY(nonce_a, nonce, nonceSz) ; + } + + /* do aes-ccm */ + AesAuthSetIv(aes, nonce, nonceSz, L, mode) ; + ROM_AESReset(AES_BASE); + ROM_AESConfigSet(AES_BASE, (aes->keylen | AES_CFG_DIR_DECRYPT | + AES_CFG_CTR_WIDTH_128 | + mode | ((mode== AES_CFG_MODE_CCM) ? (L | M) : 0 ))) ; + ROM_AESIVSet(AES_BASE, aes->reg); + ROM_AESKey1Set(AES_BASE, aes->key, aes->keylen); + ret = ROM_AESDataProcessAuth(AES_BASE, (unsigned int*)in_a, (unsigned int *)out_a, inSz, + (unsigned int*)authIn_a, authInSz, (unsigned int *)tmpTag); + if((ret == false) || (XMEMCMP(authTag, tmpTag, authTagSz) != 0)){ + XMEMSET(out, 0, inSz) ; + ret = false ; + } else { + XMEMCPY(out, out_a, inSz) ; + } + + FREE_ALL ; + return ret==true ? 0 : 1 ; +} +#endif + + +#ifdef HAVE_AESGCM +WOLFSSL_API int wc_AesGcmSetKey(Aes* aes, const byte* key, word32 len) +{ + return AesAuthSetKey(aes, key, len) ; +} + +WOLFSSL_API int wc_AesGcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, + const byte* iv, word32 ivSz, + byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz) +{ + return AesAuthEncrypt(aes, out, in, sz, iv, ivSz, authTag, authTagSz, + authIn, authInSz, AES_CFG_MODE_GCM_HY0CALC) ; +} +WOLFSSL_API int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, + const byte* iv, word32 ivSz, + const byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz) +{ + return AesAuthDecrypt(aes, out, in, sz, iv, ivSz, authTag, authTagSz, + authIn, authInSz, AES_CFG_MODE_GCM_HY0CALC) ; +} + +WOLFSSL_API int wc_GmacSetKey(Gmac* gmac, const byte* key, word32 len) +{ + return AesAuthSetKey(&gmac->aes, key, len) ; +} + +WOLFSSL_API int wc_GmacUpdate(Gmac* gmac, const byte* iv, word32 ivSz, + const byte* authIn, word32 authInSz, + byte* authTag, word32 authTagSz) +{ + return AesAuthEncrypt(&gmac->aes, NULL, NULL, 0, iv, ivSz, authTag, authTagSz, + authIn, authInSz, AES_CFG_MODE_GCM_HY0CALC) ; +} + +#endif /* HAVE_AESGCM */ + +#ifdef HAVE_AESCCM +WOLFSSL_API void wc_AesCcmSetKey(Aes* aes, const byte* key, word32 keySz) +{ + AesAuthSetKey(aes, key, keySz) ; +} + +WOLFSSL_API void wc_AesCcmEncrypt(Aes* aes, byte* out, const byte* in, word32 inSz, + const byte* nonce, word32 nonceSz, + byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz) +{ + AesAuthEncrypt(aes, out, in, inSz, nonce, nonceSz, authTag, authTagSz, + authIn, authInSz, AES_CFG_MODE_CCM) ; +} + +WOLFSSL_API int wc_AesCcmDecrypt(Aes* aes, byte* out, const byte* in, word32 inSz, + const byte* nonce, word32 nonceSz, + const byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz) +{ + return AesAuthDecrypt(aes, out, in, inSz, nonce, nonceSz, authTag, authTagSz, + authIn, authInSz, AES_CFG_MODE_CCM) ; +} +#endif /* HAVE_AESCCM */ + +#endif /* WOLFSSL_TI_CRYPT */ + +#endif /* NO_AES */ + + + diff --git a/wolfcrypt/src/port/ti/ti-ccm.c b/wolfcrypt/src/port/ti/ti-ccm.c new file mode 100644 index 000000000..801cc9bb5 --- /dev/null +++ b/wolfcrypt/src/port/ti/ti-ccm.c @@ -0,0 +1,81 @@ +/* port/ti/ti_ccm.c + * + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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. + * + * wolfSSL 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 + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#if defined(WOLFSSL_TI_CRYPT) || defined(WOLFSSL_TI_HASH) + + +#include +#include + +#include "driverlib/sysctl.h" +#include "driverlib/rom_map.h" +#include "driverlib/rom.h" + +#ifndef SINGLE_THREADED + static wolfSSL_Mutex TI_CCM_Mutex ; +#endif + +#define TIMEOUT 500000 +#define WAIT(stat) { volatile int i ; for(i=0; i +#endif + +#include + +#ifndef NO_DES + +#if defined(WOLFSSL_TI_CRYPT) +#include +#include + +#include +#include +#include + +#include "inc/hw_des.h" +#include "inc/hw_memmap.h" +#include "inc/hw_ints.h" +#include "driverlib/des.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom_map.h" +#include "driverlib/rom.h" + +static int DesSetIV(Des* des, const byte* iv, int tri) +{ + if (des == NULL) + return BAD_FUNC_ARG; + + if (iv) + XMEMCPY(des->reg, iv, tri == DES_CFG_TRIPLE ? DES3_IVLEN : DES_IVLEN); + else + XMEMSET(des->reg, 0, tri == DES_CFG_TRIPLE ? DES3_IVLEN : DES_IVLEN); + + return 0; +} + +static int DesSetKey(Des* des, const byte* key, const byte* iv,int dir, int tri) +{ + if(!wolfSSL_TI_CCMInit())return 1 ; + if ((des == NULL) || (key == NULL) || (iv == NULL)) + return BAD_FUNC_ARG; + if(!((dir == DES_ENCRYPTION) || (dir == DES_DECRYPTION))) + return BAD_FUNC_ARG; + + XMEMCPY(des->key, key, tri == DES_CFG_SINGLE ? DES_KEYLEN : DES3_KEYLEN) ; + return DesSetIV(des, iv, tri); +} + +static int DesCbcAlign16(Des* des, byte* out, const byte* in, word32 sz, word32 dir, word32 tri) +{ + + wolfSSL_TI_lockCCM() ; + ROM_DESReset(DES_BASE); + ROM_DESConfigSet(DES_BASE, (dir | DES_CFG_MODE_CBC | tri)); + DESIVSet(DES_BASE, des->reg); + ROM_DESKeySet(DES_BASE, des->key); + if(dir == DES_CFG_DIR_DECRYPT) + /* if input and output same will overwrite input iv */ + XMEMCPY(des->tmp, in + sz - DES_BLOCK_SIZE, DES_BLOCK_SIZE); + ROM_DESDataProcess(DES_BASE, (uint32_t *)in, (uint32_t *)out, sz); + wolfSSL_TI_unlockCCM() ; + + /* store iv for next call */ + if(dir == DES_CFG_DIR_ENCRYPT) + XMEMCPY(des->reg, out + sz - DES_BLOCK_SIZE, DES_BLOCK_SIZE); + else + XMEMCPY(des->reg, des->tmp, DES_BLOCK_SIZE); + + return 0 ; +} + +#define IS_ALIGN16(p) (((unsigned int)(p)&0xf) == 0) + +static int DesCbc(Des* des, byte* out, const byte* in, word32 sz, word32 dir, word32 tri) +{ + const byte * in_p ; byte * out_p ; + word32 size ; + #define TI_BUFFSIZE 1024 + byte buff[TI_BUFFSIZE] ; + if ((des == NULL) || (in == NULL) || (out == NULL)) + return BAD_FUNC_ARG; + if(sz % DES_BLOCK_SIZE) + return BAD_FUNC_ARG; + + while(sz > 0) { + size = sz ; in_p = in ; out_p = out ; + if(!IS_ALIGN16(in)){ + size = sz>TI_BUFFSIZE ? TI_BUFFSIZE : sz ; + XMEMCPY(buff, in, size) ; + in_p = (const byte *)buff ; + } + if(!IS_ALIGN16(out)){ + size = sz>TI_BUFFSIZE ? TI_BUFFSIZE : sz ; + out_p = (byte *)buff ; + } + + DesCbcAlign16(des, out_p, in_p, size, dir, tri) ; + + if(!IS_ALIGN16(out)){ + XMEMCPY(out, buff, size) ; + } + sz -= size ; in += size ; out += size ; + } + return 0 ; +} + +WOLFSSL_API int wc_Des_SetKey(Des* des, const byte* key, const byte* iv,int dir) +{ + return DesSetKey(des, key, iv, dir, DES_CFG_SINGLE) ; +} + +WOLFSSL_API void wc_Des_SetIV(Des* des, const byte* iv) +{ + DesSetIV(des, iv, DES_CFG_SINGLE) ; +} + +WOLFSSL_API int wc_Des3_SetKey(Des3* des, const byte* key, const byte* iv,int dir) +{ + return DesSetKey((Des *)des, key, iv, dir, DES_CFG_TRIPLE) ; +} + +WOLFSSL_API int wc_Des3_SetIV(Des3* des, const byte* iv) +{ + return DesSetIV((Des *)des, iv, DES_CFG_TRIPLE) ; +} + + +WOLFSSL_API int wc_Des_CbcEncrypt(Des* des, byte* out, const byte* in, word32 sz) +{ + return DesCbc(des, out, in, sz, DES_CFG_DIR_ENCRYPT, DES_CFG_SINGLE) ; +} + +WOLFSSL_API int wc_Des_CbcDecrypt(Des* des, byte* out, const byte* in, word32 sz) +{ + return DesCbc(des, out, in, sz, DES_CFG_DIR_DECRYPT, DES_CFG_SINGLE) ; +} + +WOLFSSL_API int wc_Des_CbcDecryptWithKey(byte* out, const byte* in, word32 sz, + const byte* key, const byte* iv) +{ return 0 ;} + +WOLFSSL_API int wc_Des3_CbcEncrypt(Des3* des, byte* out, const byte* in, word32 sz) +{ + return DesCbc((Des *)des, out, in, sz, DES_CFG_DIR_ENCRYPT, DES_CFG_TRIPLE) ; +} + +WOLFSSL_API int wc_Des3_CbcDecrypt(Des3* des, byte* out, const byte* in, word32 sz) +{ + return DesCbc((Des *)des, out, in, sz, DES_CFG_DIR_DECRYPT, DES_CFG_TRIPLE) ; +} + +WOLFSSL_API int wc_Des3_CbcDecryptWithKey(byte* out, const byte* in, word32 sz, + const byte* key, const byte* iv) +{ return 0 ; } + + +#endif /* WOLFSSL_TI_CRYPT */ + +#endif /* NO_DES */ diff --git a/wolfcrypt/src/port/ti/ti-hash.c b/wolfcrypt/src/port/ti/ti-hash.c new file mode 100644 index 000000000..223874b20 --- /dev/null +++ b/wolfcrypt/src/port/ti/ti-hash.c @@ -0,0 +1,231 @@ +/* port/ti/ti-hash.h + * + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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. + * + * wolfSSL 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 + */ + + +#ifndef WOLFSSL_TI_HASH_H +#define WOLFSSL_TI_HASH_H + +#include + +#if defined(WOLFSSL_TI_HASH) + +#ifdef __cplusplus + extern "C" { +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "inc/hw_memmap.h" +#include "inc/hw_shamd5.h" +#include "inc/hw_ints.h" +#include "driverlib/shamd5.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom_map.h" +#include "driverlib/rom.h" + +static int hashInit(wolfssl_TI_Hash *hash) { + hash->used = 0 ; + hash->msg = 0 ; + hash->len = 0 ; + return 0 ; +} + +static int hashUpdate(wolfssl_TI_Hash *hash, const byte* data, word32 len) +{ + void *p ; + if((hash== NULL) || (data == NULL))return BAD_FUNC_ARG; + if(hash->len < hash->used+len) { + if(hash->msg == NULL) { + p = XMALLOC(hash->used+len, NULL, DYNAMIC_TYPE_TMP_BUFFER); + } else { + p = XREALLOC(hash->msg, hash->used+len, NULL, DYNAMIC_TYPE_TMP_BUFFER); + } + if(p == 0)return 1 ; + hash->msg = p ; + hash->len = hash->used+len ; + } + XMEMCPY(hash->msg+hash->used, data, len) ; + hash->used += len ; + return 0 ; +} + +static int hashFinal(wolfssl_TI_Hash *hash, byte* result, word32 algo, word32 hsize) +{ + uint32_t h[16] ; + wolfSSL_TI_lockCCM() ; + ROM_SHAMD5Reset(SHAMD5_BASE); + ROM_SHAMD5ConfigSet(SHAMD5_BASE, algo); + ROM_SHAMD5DataProcess(SHAMD5_BASE, + (uint32_t *)hash->msg, hash->used, h); + XMEMCPY(result, h, hsize) ; + wolfSSL_TI_unlockCCM() ; + XFREE(hash->msg, NULL, DYNAMIC_TYPE_TMP_BUFFER); + hashInit(hash) ; + return 0 ; +} + +static int hashHash(const byte* data, word32 len, byte* hash, word32 algo, word32 hsize) +{ + int ret = 0; +#ifdef WOLFSSL_SMALL_STACK + wolfssl_TI_Hash* hash_desc; +#else + wolfssl_TI_Hash hash_desc[1]; +#endif + +#ifdef WOLFSSL_SMALL_STACK + hash_desc = (wolfssl_TI_Hash*)XMALLOC(sizeof(wolfssl_TI_Hash), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (hash_desc == NULL) + return MEMORY_E; +#endif + + if ((ret = hashInit(hash_desc)) != 0) { + WOLFSSL_MSG("Hash Init failed"); + } + else { + hashUpdate(hash_desc, data, len); + hashFinal(hash_desc, hash, algo, hsize); + } + +#ifdef WOLFSSL_SMALL_STACK + XFREE(hash, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return ret; +} + +#if !defined(NO_MD5) + +void wc_InitMd5(Md5* md5) +{ + if (md5 == NULL) + return ; + if(!wolfSSL_TI_CCMInit())return ; + hashInit((wolfssl_TI_Hash *)md5) ; +} + +void wc_Md5Update(Md5* md5, const byte* data, word32 len) +{ + hashUpdate((wolfssl_TI_Hash *)md5, data, len) ; +} + +void wc_Md5Final(Md5* md5, byte* hash) +{ + hashFinal((wolfssl_TI_Hash *)md5, hash, SHAMD5_ALGO_MD5, MD5_DIGEST_SIZE) ; +} + +WOLFSSL_API int wc_Md5Hash(const byte*data, word32 len, byte*hash) +{ + return hashHash(data, len, hash, SHAMD5_ALGO_MD5, MD5_DIGEST_SIZE) ; +} + +#endif /* NO_MD5 */ + +#if !defined(NO_SHA) + +WOLFSSL_API int wc_InitSha(Sha* sha) +{ + if (sha == NULL) + return 1 ; + if(!wolfSSL_TI_CCMInit())return 1 ; + return hashInit((wolfssl_TI_Hash *)sha) ; +} + +WOLFSSL_API int wc_ShaUpdate(Sha* sha, const byte* data, word32 len) +{ + return hashUpdate((wolfssl_TI_Hash *)sha, data, len) ; +} + +WOLFSSL_API int wc_ShaFinal(Sha* sha, byte* hash) +{ + return hashFinal((wolfssl_TI_Hash *)sha, hash, SHAMD5_ALGO_SHA1, SHA_DIGEST_SIZE) ; +} +WOLFSSL_API int wc_ShaHash(const byte*data, word32 len, byte*hash) +{ + return hashHash(data, len, hash, SHAMD5_ALGO_SHA1, SHA_DIGEST_SIZE) ; +} + +#endif /* NO_SHA */ + +#if defined(HAVE_SHA224) +WOLFSSL_API int wc_InitSha224(Sha224* sha224) +{ + if (sha224 == NULL) + return 1 ; + if(!wolfSSL_TI_CCMInit())return 1 ; + return hashInit((wolfssl_TI_Hash *)sha224) ; +} + +WOLFSSL_API int wc_Sha224Update(Sha224* sha224, const byte* data, word32 len) +{ + return hashUpdate((wolfssl_TI_Hash *)sha224, data, len) ; +} + +WOLFSSL_API int wc_Sha224Final(Sha224* sha224, byte* hash) +{ + return hashFinal((wolfssl_TI_Hash *)sha224, hash, SHAMD5_ALGO_SHA224, SHA224_DIGEST_SIZE) ; +} + +WOLFSSL_API int wc_Sha224Hash(const byte* data, word32 len, byte*hash) +{ + return hashHash(data, len, hash, SHAMD5_ALGO_SHA224, SHA224_DIGEST_SIZE) ; +} + +#endif /* HAVE_SHA224 */ + +#if !defined(NO_SHA256) +WOLFSSL_API int wc_InitSha256(Sha256* sha256) +{ + if (sha256 == NULL) + return 1 ; + if(!wolfSSL_TI_CCMInit())return 1 ; + return hashInit((wolfssl_TI_Hash *)sha256) ; +} + +WOLFSSL_API int wc_Sha256Update(Sha256* sha256, const byte* data, word32 len) +{ + return hashUpdate((wolfssl_TI_Hash *)sha256, data, len) ; +} + +WOLFSSL_API int wc_Sha256Final(Sha256* sha256, byte* hash) +{ + return hashFinal((wolfssl_TI_Hash *)sha256, hash, SHAMD5_ALGO_SHA256, SHA256_DIGEST_SIZE) ; +} + +WOLFSSL_API int wc_Sha256Hash(const byte* data, word32 len, byte*hash) +{ + return hashHash(data, len, hash, SHAMD5_ALGO_SHA256, SHA256_DIGEST_SIZE) ; +} + +#endif /* NO_SHA256 */ + +#endif /* WOLFSSL_TI_HASH */ + +#endif /* WOLFSSL_TI_HASH_H */ From b5654092ecce93997d464cde0a62abc961e926fb Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Thu, 21 May 2015 13:42:02 +0900 Subject: [PATCH 090/350] Added Md5GetHash for BuildCertHashes --- src/include.am | 2 + src/internal.c | 6 +- wolfcrypt/src/md5.c | 818 +++---- wolfcrypt/src/port/ti/ti-hash.c | 99 +- wolfcrypt/src/sha.c | 925 ++++---- wolfcrypt/src/sha256.c | 3540 ++++++++++++++++--------------- wolfssl/wolfcrypt/md5.h | 181 +- wolfssl/wolfcrypt/sha.h | 168 +- wolfssl/wolfcrypt/sha256.h | 166 +- 9 files changed, 3045 insertions(+), 2860 deletions(-) mode change 100755 => 100644 wolfcrypt/src/sha256.c diff --git a/src/include.am b/src/include.am index a89d7d472..1dcf24a2b 100644 --- a/src/include.am +++ b/src/include.am @@ -191,6 +191,8 @@ if BUILD_PKCS7 src_libwolfssl_la_SOURCES += wolfcrypt/src/pkcs7.c endif +src_libwolfssl_la_SOURCES += wolfcrypt/src/port/ti/ti-hash.c + # ssl files src_libwolfssl_la_SOURCES += \ src/internal.c \ diff --git a/src/internal.c b/src/internal.c index aa69f8310..48f226201 100644 --- a/src/internal.c +++ b/src/internal.c @@ -6925,14 +6925,14 @@ static int BuildCertHashes(WOLFSSL* ssl, Hashes* hashes) if (ssl->options.tls) { #if ! defined( NO_OLD_TLS ) - wc_Md5Final(&ssl->hsHashes->hashMd5, hashes->md5); - wc_ShaFinal(&ssl->hsHashes->hashSha, hashes->sha); + wc_Md5GetHash(&ssl->hsHashes->hashMd5, hashes->md5); + wc_ShaGetHash(&ssl->hsHashes->hashSha, hashes->sha); #endif if (IsAtLeastTLSv1_2(ssl)) { int ret; #ifndef NO_SHA256 - ret = wc_Sha256Final(&ssl->hsHashes->hashSha256,hashes->sha256); + ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256,hashes->sha256); if (ret != 0) return ret; #endif diff --git a/wolfcrypt/src/md5.c b/wolfcrypt/src/md5.c index d2583bd9b..a3e76eda8 100644 --- a/wolfcrypt/src/md5.c +++ b/wolfcrypt/src/md5.c @@ -1,392 +1,426 @@ -/* md5.c - * - * Copyright (C) 2006-2015 wolfSSL Inc. - * - * This file is part of wolfSSL. (formerly known as CyaSSL) - * - * wolfSSL 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. - * - * wolfSSL 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 - */ - - -#ifdef HAVE_CONFIG_H - #include -#endif - -#include - -#if !defined(NO_MD5) - -#ifdef WOLFSSL_PIC32MZ_HASH -#define wc_InitMd5 wc_InitMd5_sw -#define wc_Md5Update wc_Md5Update_sw -#define wc_Md5Final wc_Md5Final_sw -#endif - -#include -#include - -#ifdef NO_INLINE - #include -#else - #include -#endif - -#ifdef FREESCALE_MMCAU - #include "cau_api.h" - #define XTRANSFORM(S,B) cau_md5_hash_n((B), 1, (unsigned char*)(S)->digest) -#else - #define XTRANSFORM(S,B) Transform((S)) -#endif - - -#ifdef STM32F2_HASH - /* - * STM32F2 hardware MD5 support through the STM32F2 standard peripheral - * library. Documentation located in STM32F2xx Standard Peripheral Library - * document (See note in README). - */ - #include "stm32f2xx.h" - - void wc_InitMd5(Md5* md5) - { - /* STM32F2 struct notes: - * md5->buffer = first 4 bytes used to hold partial block if needed - * md5->buffLen = num bytes currently stored in md5->buffer - * md5->loLen = num bytes that have been written to STM32 FIFO - */ - XMEMSET(md5->buffer, 0, MD5_REG_SIZE); - - md5->buffLen = 0; - md5->loLen = 0; - - /* initialize HASH peripheral */ - HASH_DeInit(); - - /* configure algo used, algo mode, datatype */ - HASH->CR &= ~ (HASH_CR_ALGO | HASH_CR_DATATYPE | HASH_CR_MODE); - HASH->CR |= (HASH_AlgoSelection_MD5 | HASH_AlgoMode_HASH - | HASH_DataType_8b); - - /* reset HASH processor */ - HASH->CR |= HASH_CR_INIT; - } - - void wc_Md5Update(Md5* md5, const byte* data, word32 len) - { - word32 i = 0; - word32 fill = 0; - word32 diff = 0; - - /* if saved partial block is available */ - if (md5->buffLen > 0) { - fill = 4 - md5->buffLen; - - /* if enough data to fill, fill and push to FIFO */ - if (fill <= len) { - XMEMCPY((byte*)md5->buffer + md5->buffLen, data, fill); - HASH_DataIn(*(uint32_t*)md5->buffer); - - data += fill; - len -= fill; - md5->loLen += 4; - md5->buffLen = 0; - } else { - /* append partial to existing stored block */ - XMEMCPY((byte*)md5->buffer + md5->buffLen, data, len); - md5->buffLen += len; - return; - } - } - - /* write input block in the IN FIFO */ - for (i = 0; i < len; i += 4) - { - diff = len - i; - if (diff < 4) { - /* store incomplete last block, not yet in FIFO */ - XMEMSET(md5->buffer, 0, MD5_REG_SIZE); - XMEMCPY((byte*)md5->buffer, data, diff); - md5->buffLen = diff; - } else { - HASH_DataIn(*(uint32_t*)data); - data+=4; - } - } - - /* keep track of total data length thus far */ - md5->loLen += (len - md5->buffLen); - } - - void wc_Md5Final(Md5* md5, byte* hash) - { - __IO uint16_t nbvalidbitsdata = 0; - - /* finish reading any trailing bytes into FIFO */ - if (md5->buffLen > 0) { - HASH_DataIn(*(uint32_t*)md5->buffer); - md5->loLen += md5->buffLen; - } - - /* calculate number of valid bits in last word of input data */ - nbvalidbitsdata = 8 * (md5->loLen % MD5_REG_SIZE); - - /* configure number of valid bits in last word of the data */ - HASH_SetLastWordValidBitsNbr(nbvalidbitsdata); - - /* start HASH processor */ - HASH_StartDigest(); - - /* wait until Busy flag == RESET */ - while (HASH_GetFlagStatus(HASH_FLAG_BUSY) != RESET) {} - - /* read message digest */ - md5->digest[0] = HASH->HR[0]; - md5->digest[1] = HASH->HR[1]; - md5->digest[2] = HASH->HR[2]; - md5->digest[3] = HASH->HR[3]; - - ByteReverseWords(md5->digest, md5->digest, MD5_DIGEST_SIZE); - - XMEMCPY(hash, md5->digest, MD5_DIGEST_SIZE); - - wc_InitMd5(md5); /* reset state */ - } - -#else /* CTaoCrypt software implementation */ - -#ifndef WOLFSSL_HAVE_MIN -#define WOLFSSL_HAVE_MIN - - static INLINE word32 min(word32 a, word32 b) - { - return a > b ? b : a; - } - -#endif /* WOLFSSL_HAVE_MIN */ - - -void wc_InitMd5(Md5* md5) -{ - md5->digest[0] = 0x67452301L; - md5->digest[1] = 0xefcdab89L; - md5->digest[2] = 0x98badcfeL; - md5->digest[3] = 0x10325476L; - - md5->buffLen = 0; - md5->loLen = 0; - md5->hiLen = 0; -} - -#ifndef FREESCALE_MMCAU - -static void Transform(Md5* md5) -{ -#define F1(x, y, z) (z ^ (x & (y ^ z))) -#define F2(x, y, z) F1(z, x, y) -#define F3(x, y, z) (x ^ y ^ z) -#define F4(x, y, z) (y ^ (x | ~z)) - -#define MD5STEP(f, w, x, y, z, data, s) \ - w = rotlFixed(w + f(x, y, z) + data, s) + x - - /* Copy context->state[] to working vars */ - word32 a = md5->digest[0]; - word32 b = md5->digest[1]; - word32 c = md5->digest[2]; - word32 d = md5->digest[3]; - - MD5STEP(F1, a, b, c, d, md5->buffer[0] + 0xd76aa478, 7); - MD5STEP(F1, d, a, b, c, md5->buffer[1] + 0xe8c7b756, 12); - MD5STEP(F1, c, d, a, b, md5->buffer[2] + 0x242070db, 17); - MD5STEP(F1, b, c, d, a, md5->buffer[3] + 0xc1bdceee, 22); - MD5STEP(F1, a, b, c, d, md5->buffer[4] + 0xf57c0faf, 7); - MD5STEP(F1, d, a, b, c, md5->buffer[5] + 0x4787c62a, 12); - MD5STEP(F1, c, d, a, b, md5->buffer[6] + 0xa8304613, 17); - MD5STEP(F1, b, c, d, a, md5->buffer[7] + 0xfd469501, 22); - MD5STEP(F1, a, b, c, d, md5->buffer[8] + 0x698098d8, 7); - MD5STEP(F1, d, a, b, c, md5->buffer[9] + 0x8b44f7af, 12); - MD5STEP(F1, c, d, a, b, md5->buffer[10] + 0xffff5bb1, 17); - MD5STEP(F1, b, c, d, a, md5->buffer[11] + 0x895cd7be, 22); - MD5STEP(F1, a, b, c, d, md5->buffer[12] + 0x6b901122, 7); - MD5STEP(F1, d, a, b, c, md5->buffer[13] + 0xfd987193, 12); - MD5STEP(F1, c, d, a, b, md5->buffer[14] + 0xa679438e, 17); - MD5STEP(F1, b, c, d, a, md5->buffer[15] + 0x49b40821, 22); - - MD5STEP(F2, a, b, c, d, md5->buffer[1] + 0xf61e2562, 5); - MD5STEP(F2, d, a, b, c, md5->buffer[6] + 0xc040b340, 9); - MD5STEP(F2, c, d, a, b, md5->buffer[11] + 0x265e5a51, 14); - MD5STEP(F2, b, c, d, a, md5->buffer[0] + 0xe9b6c7aa, 20); - MD5STEP(F2, a, b, c, d, md5->buffer[5] + 0xd62f105d, 5); - MD5STEP(F2, d, a, b, c, md5->buffer[10] + 0x02441453, 9); - MD5STEP(F2, c, d, a, b, md5->buffer[15] + 0xd8a1e681, 14); - MD5STEP(F2, b, c, d, a, md5->buffer[4] + 0xe7d3fbc8, 20); - MD5STEP(F2, a, b, c, d, md5->buffer[9] + 0x21e1cde6, 5); - MD5STEP(F2, d, a, b, c, md5->buffer[14] + 0xc33707d6, 9); - MD5STEP(F2, c, d, a, b, md5->buffer[3] + 0xf4d50d87, 14); - MD5STEP(F2, b, c, d, a, md5->buffer[8] + 0x455a14ed, 20); - MD5STEP(F2, a, b, c, d, md5->buffer[13] + 0xa9e3e905, 5); - MD5STEP(F2, d, a, b, c, md5->buffer[2] + 0xfcefa3f8, 9); - MD5STEP(F2, c, d, a, b, md5->buffer[7] + 0x676f02d9, 14); - MD5STEP(F2, b, c, d, a, md5->buffer[12] + 0x8d2a4c8a, 20); - - MD5STEP(F3, a, b, c, d, md5->buffer[5] + 0xfffa3942, 4); - MD5STEP(F3, d, a, b, c, md5->buffer[8] + 0x8771f681, 11); - MD5STEP(F3, c, d, a, b, md5->buffer[11] + 0x6d9d6122, 16); - MD5STEP(F3, b, c, d, a, md5->buffer[14] + 0xfde5380c, 23); - MD5STEP(F3, a, b, c, d, md5->buffer[1] + 0xa4beea44, 4); - MD5STEP(F3, d, a, b, c, md5->buffer[4] + 0x4bdecfa9, 11); - MD5STEP(F3, c, d, a, b, md5->buffer[7] + 0xf6bb4b60, 16); - MD5STEP(F3, b, c, d, a, md5->buffer[10] + 0xbebfbc70, 23); - MD5STEP(F3, a, b, c, d, md5->buffer[13] + 0x289b7ec6, 4); - MD5STEP(F3, d, a, b, c, md5->buffer[0] + 0xeaa127fa, 11); - MD5STEP(F3, c, d, a, b, md5->buffer[3] + 0xd4ef3085, 16); - MD5STEP(F3, b, c, d, a, md5->buffer[6] + 0x04881d05, 23); - MD5STEP(F3, a, b, c, d, md5->buffer[9] + 0xd9d4d039, 4); - MD5STEP(F3, d, a, b, c, md5->buffer[12] + 0xe6db99e5, 11); - MD5STEP(F3, c, d, a, b, md5->buffer[15] + 0x1fa27cf8, 16); - MD5STEP(F3, b, c, d, a, md5->buffer[2] + 0xc4ac5665, 23); - - MD5STEP(F4, a, b, c, d, md5->buffer[0] + 0xf4292244, 6); - MD5STEP(F4, d, a, b, c, md5->buffer[7] + 0x432aff97, 10); - MD5STEP(F4, c, d, a, b, md5->buffer[14] + 0xab9423a7, 15); - MD5STEP(F4, b, c, d, a, md5->buffer[5] + 0xfc93a039, 21); - MD5STEP(F4, a, b, c, d, md5->buffer[12] + 0x655b59c3, 6); - MD5STEP(F4, d, a, b, c, md5->buffer[3] + 0x8f0ccc92, 10); - MD5STEP(F4, c, d, a, b, md5->buffer[10] + 0xffeff47d, 15); - MD5STEP(F4, b, c, d, a, md5->buffer[1] + 0x85845dd1, 21); - MD5STEP(F4, a, b, c, d, md5->buffer[8] + 0x6fa87e4f, 6); - MD5STEP(F4, d, a, b, c, md5->buffer[15] + 0xfe2ce6e0, 10); - MD5STEP(F4, c, d, a, b, md5->buffer[6] + 0xa3014314, 15); - MD5STEP(F4, b, c, d, a, md5->buffer[13] + 0x4e0811a1, 21); - MD5STEP(F4, a, b, c, d, md5->buffer[4] + 0xf7537e82, 6); - MD5STEP(F4, d, a, b, c, md5->buffer[11] + 0xbd3af235, 10); - MD5STEP(F4, c, d, a, b, md5->buffer[2] + 0x2ad7d2bb, 15); - MD5STEP(F4, b, c, d, a, md5->buffer[9] + 0xeb86d391, 21); - - /* Add the working vars back into digest state[] */ - md5->digest[0] += a; - md5->digest[1] += b; - md5->digest[2] += c; - md5->digest[3] += d; -} - -#endif /* FREESCALE_MMCAU */ - - -static INLINE void AddLength(Md5* md5, word32 len) -{ - word32 tmp = md5->loLen; - if ( (md5->loLen += len) < tmp) - md5->hiLen++; /* carry low to high */ -} - - -void wc_Md5Update(Md5* md5, const byte* data, word32 len) -{ - /* do block size increments */ - byte* local = (byte*)md5->buffer; - - while (len) { - word32 add = min(len, MD5_BLOCK_SIZE - md5->buffLen); - XMEMCPY(&local[md5->buffLen], data, add); - - md5->buffLen += add; - data += add; - len -= add; - - if (md5->buffLen == MD5_BLOCK_SIZE) { - #if defined(BIG_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) - ByteReverseWords(md5->buffer, md5->buffer, MD5_BLOCK_SIZE); - #endif - XTRANSFORM(md5, local); - AddLength(md5, MD5_BLOCK_SIZE); - md5->buffLen = 0; - } - } -} - - -void wc_Md5Final(Md5* md5, byte* hash) -{ - byte* local = (byte*)md5->buffer; - - AddLength(md5, md5->buffLen); /* before adding pads */ - - local[md5->buffLen++] = 0x80; /* add 1 */ - - /* pad with zeros */ - if (md5->buffLen > MD5_PAD_SIZE) { - XMEMSET(&local[md5->buffLen], 0, MD5_BLOCK_SIZE - md5->buffLen); - md5->buffLen += MD5_BLOCK_SIZE - md5->buffLen; - - #if defined(BIG_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) - ByteReverseWords(md5->buffer, md5->buffer, MD5_BLOCK_SIZE); - #endif - XTRANSFORM(md5, local); - md5->buffLen = 0; - } - XMEMSET(&local[md5->buffLen], 0, MD5_PAD_SIZE - md5->buffLen); - - /* put lengths in bits */ - md5->hiLen = (md5->loLen >> (8*sizeof(md5->loLen) - 3)) + - (md5->hiLen << 3); - md5->loLen = md5->loLen << 3; - - /* store lengths */ - #if defined(BIG_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) - ByteReverseWords(md5->buffer, md5->buffer, MD5_BLOCK_SIZE); - #endif - /* ! length ordering dependent on digest endian type ! */ - XMEMCPY(&local[MD5_PAD_SIZE], &md5->loLen, sizeof(word32)); - XMEMCPY(&local[MD5_PAD_SIZE + sizeof(word32)], &md5->hiLen, sizeof(word32)); - - XTRANSFORM(md5, local); - #ifdef BIG_ENDIAN_ORDER - ByteReverseWords(md5->digest, md5->digest, MD5_DIGEST_SIZE); - #endif - XMEMCPY(hash, md5->digest, MD5_DIGEST_SIZE); - - wc_InitMd5(md5); /* reset state */ -} - -#endif /* STM32F2_HASH */ - - -int wc_Md5Hash(const byte* data, word32 len, byte* hash) -{ -#ifdef WOLFSSL_SMALL_STACK - Md5* md5; -#else - Md5 md5[1]; -#endif - -#ifdef WOLFSSL_SMALL_STACK - md5 = (Md5*)XMALLOC(sizeof(Md5), NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (md5 == NULL) - return MEMORY_E; -#endif - - wc_InitMd5(md5); - wc_Md5Update(md5, data, len); - wc_Md5Final(md5, hash); - -#ifdef WOLFSSL_SMALL_STACK - XFREE(md5, NULL, DYNAMIC_TYPE_TMP_BUFFER); -#endif - - return 0; -} - -#endif /* NO_MD5 */ +/* md5.c + * + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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. + * + * wolfSSL 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 + */ + + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#if !defined(NO_MD5) && !defined(WOLFSSL_TI_HASH) + +#ifdef WOLFSSL_PIC32MZ_HASH +#define wc_InitMd5 wc_InitMd5_sw +#define wc_Md5Update wc_Md5Update_sw +#define wc_Md5Final wc_Md5Final_sw +#endif + +#include +#include + +#ifdef NO_INLINE + #include +#else + #include +#endif + +#ifdef FREESCALE_MMCAU + #include "cau_api.h" + #define XTRANSFORM(S,B) cau_md5_hash_n((B), 1, (unsigned char*)(S)->digest) +#else + #define XTRANSFORM(S,B) Transform((S)) +#endif + + +#ifdef STM32F2_HASH + /* + * STM32F2 hardware MD5 support through the STM32F2 standard peripheral + * library. Documentation located in STM32F2xx Standard Peripheral Library + * document (See note in README). + */ + #include "stm32f2xx.h" + + void wc_InitMd5(Md5* md5) + { + /* STM32F2 struct notes: + * md5->buffer = first 4 bytes used to hold partial block if needed + * md5->buffLen = num bytes currently stored in md5->buffer + * md5->loLen = num bytes that have been written to STM32 FIFO + */ + XMEMSET(md5->buffer, 0, MD5_REG_SIZE); + + md5->buffLen = 0; + md5->loLen = 0; + + /* initialize HASH peripheral */ + HASH_DeInit(); + + /* configure algo used, algo mode, datatype */ + HASH->CR &= ~ (HASH_CR_ALGO | HASH_CR_DATATYPE | HASH_CR_MODE); + HASH->CR |= (HASH_AlgoSelection_MD5 | HASH_AlgoMode_HASH + | HASH_DataType_8b); + + /* reset HASH processor */ + HASH->CR |= HASH_CR_INIT; + } + + void wc_Md5Update(Md5* md5, const byte* data, word32 len) + { + word32 i = 0; + word32 fill = 0; + word32 diff = 0; + + /* if saved partial block is available */ + if (md5->buffLen > 0) { + fill = 4 - md5->buffLen; + + /* if enough data to fill, fill and push to FIFO */ + if (fill <= len) { + XMEMCPY((byte*)md5->buffer + md5->buffLen, data, fill); + HASH_DataIn(*(uint32_t*)md5->buffer); + + data += fill; + len -= fill; + md5->loLen += 4; + md5->buffLen = 0; + } else { + /* append partial to existing stored block */ + XMEMCPY((byte*)md5->buffer + md5->buffLen, data, len); + md5->buffLen += len; + return; + } + } + + /* write input block in the IN FIFO */ + for (i = 0; i < len; i += 4) + { + diff = len - i; + if (diff < 4) { + /* store incomplete last block, not yet in FIFO */ + XMEMSET(md5->buffer, 0, MD5_REG_SIZE); + XMEMCPY((byte*)md5->buffer, data, diff); + md5->buffLen = diff; + } else { + HASH_DataIn(*(uint32_t*)data); + data+=4; + } + } + + /* keep track of total data length thus far */ + md5->loLen += (len - md5->buffLen); + } + + void wc_Md5Final(Md5* md5, byte* hash) + { + __IO uint16_t nbvalidbitsdata = 0; + + /* finish reading any trailing bytes into FIFO */ + if (md5->buffLen > 0) { + HASH_DataIn(*(uint32_t*)md5->buffer); + md5->loLen += md5->buffLen; + } + + /* calculate number of valid bits in last word of input data */ + nbvalidbitsdata = 8 * (md5->loLen % MD5_REG_SIZE); + + /* configure number of valid bits in last word of the data */ + HASH_SetLastWordValidBitsNbr(nbvalidbitsdata); + + /* start HASH processor */ + HASH_StartDigest(); + + /* wait until Busy flag == RESET */ + while (HASH_GetFlagStatus(HASH_FLAG_BUSY) != RESET) {} + + /* read message digest */ + md5->digest[0] = HASH->HR[0]; + md5->digest[1] = HASH->HR[1]; + md5->digest[2] = HASH->HR[2]; + md5->digest[3] = HASH->HR[3]; + + ByteReverseWords(md5->digest, md5->digest, MD5_DIGEST_SIZE); + + XMEMCPY(hash, md5->digest, MD5_DIGEST_SIZE); + + wc_InitMd5(md5); /* reset state */ + } + +#elif defined(WOLFSSL_IT_HASH) + + /* defined in port/ti_md5.c */ + +#else /* CTaoCrypt software implementation */ + +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN + + static INLINE word32 min(word32 a, word32 b) + { + return a > b ? b : a; + } + +#endif /* WOLFSSL_HAVE_MIN */ + +#ifdef TI_HASH_TEST +void wc_InitMd5_ti(Md5* md5) ; +void wc_Md5Update_ti(Md5* md5, const byte* data, word32 len) ; +void wc_Md5Final_ti(Md5* md5, byte* hash) ; +#endif + +void wc_InitMd5(Md5* md5) +{ + md5->digest[0] = 0x67452301L; + md5->digest[1] = 0xefcdab89L; + md5->digest[2] = 0x98badcfeL; + md5->digest[3] = 0x10325476L; + + md5->buffLen = 0; + md5->loLen = 0; + md5->hiLen = 0; + +#ifdef TI_HASH_TEST + wc_InitMd5_ti(md5) ; +#endif +} + +#ifndef FREESCALE_MMCAU + +static void Transform(Md5* md5) +{ +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define F2(x, y, z) F1(z, x, y) +#define F3(x, y, z) (x ^ y ^ z) +#define F4(x, y, z) (y ^ (x | ~z)) + +#define MD5STEP(f, w, x, y, z, data, s) \ + w = rotlFixed(w + f(x, y, z) + data, s) + x + + /* Copy context->state[] to working vars */ + word32 a = md5->digest[0]; + word32 b = md5->digest[1]; + word32 c = md5->digest[2]; + word32 d = md5->digest[3]; + + MD5STEP(F1, a, b, c, d, md5->buffer[0] + 0xd76aa478, 7); + MD5STEP(F1, d, a, b, c, md5->buffer[1] + 0xe8c7b756, 12); + MD5STEP(F1, c, d, a, b, md5->buffer[2] + 0x242070db, 17); + MD5STEP(F1, b, c, d, a, md5->buffer[3] + 0xc1bdceee, 22); + MD5STEP(F1, a, b, c, d, md5->buffer[4] + 0xf57c0faf, 7); + MD5STEP(F1, d, a, b, c, md5->buffer[5] + 0x4787c62a, 12); + MD5STEP(F1, c, d, a, b, md5->buffer[6] + 0xa8304613, 17); + MD5STEP(F1, b, c, d, a, md5->buffer[7] + 0xfd469501, 22); + MD5STEP(F1, a, b, c, d, md5->buffer[8] + 0x698098d8, 7); + MD5STEP(F1, d, a, b, c, md5->buffer[9] + 0x8b44f7af, 12); + MD5STEP(F1, c, d, a, b, md5->buffer[10] + 0xffff5bb1, 17); + MD5STEP(F1, b, c, d, a, md5->buffer[11] + 0x895cd7be, 22); + MD5STEP(F1, a, b, c, d, md5->buffer[12] + 0x6b901122, 7); + MD5STEP(F1, d, a, b, c, md5->buffer[13] + 0xfd987193, 12); + MD5STEP(F1, c, d, a, b, md5->buffer[14] + 0xa679438e, 17); + MD5STEP(F1, b, c, d, a, md5->buffer[15] + 0x49b40821, 22); + + MD5STEP(F2, a, b, c, d, md5->buffer[1] + 0xf61e2562, 5); + MD5STEP(F2, d, a, b, c, md5->buffer[6] + 0xc040b340, 9); + MD5STEP(F2, c, d, a, b, md5->buffer[11] + 0x265e5a51, 14); + MD5STEP(F2, b, c, d, a, md5->buffer[0] + 0xe9b6c7aa, 20); + MD5STEP(F2, a, b, c, d, md5->buffer[5] + 0xd62f105d, 5); + MD5STEP(F2, d, a, b, c, md5->buffer[10] + 0x02441453, 9); + MD5STEP(F2, c, d, a, b, md5->buffer[15] + 0xd8a1e681, 14); + MD5STEP(F2, b, c, d, a, md5->buffer[4] + 0xe7d3fbc8, 20); + MD5STEP(F2, a, b, c, d, md5->buffer[9] + 0x21e1cde6, 5); + MD5STEP(F2, d, a, b, c, md5->buffer[14] + 0xc33707d6, 9); + MD5STEP(F2, c, d, a, b, md5->buffer[3] + 0xf4d50d87, 14); + MD5STEP(F2, b, c, d, a, md5->buffer[8] + 0x455a14ed, 20); + MD5STEP(F2, a, b, c, d, md5->buffer[13] + 0xa9e3e905, 5); + MD5STEP(F2, d, a, b, c, md5->buffer[2] + 0xfcefa3f8, 9); + MD5STEP(F2, c, d, a, b, md5->buffer[7] + 0x676f02d9, 14); + MD5STEP(F2, b, c, d, a, md5->buffer[12] + 0x8d2a4c8a, 20); + + MD5STEP(F3, a, b, c, d, md5->buffer[5] + 0xfffa3942, 4); + MD5STEP(F3, d, a, b, c, md5->buffer[8] + 0x8771f681, 11); + MD5STEP(F3, c, d, a, b, md5->buffer[11] + 0x6d9d6122, 16); + MD5STEP(F3, b, c, d, a, md5->buffer[14] + 0xfde5380c, 23); + MD5STEP(F3, a, b, c, d, md5->buffer[1] + 0xa4beea44, 4); + MD5STEP(F3, d, a, b, c, md5->buffer[4] + 0x4bdecfa9, 11); + MD5STEP(F3, c, d, a, b, md5->buffer[7] + 0xf6bb4b60, 16); + MD5STEP(F3, b, c, d, a, md5->buffer[10] + 0xbebfbc70, 23); + MD5STEP(F3, a, b, c, d, md5->buffer[13] + 0x289b7ec6, 4); + MD5STEP(F3, d, a, b, c, md5->buffer[0] + 0xeaa127fa, 11); + MD5STEP(F3, c, d, a, b, md5->buffer[3] + 0xd4ef3085, 16); + MD5STEP(F3, b, c, d, a, md5->buffer[6] + 0x04881d05, 23); + MD5STEP(F3, a, b, c, d, md5->buffer[9] + 0xd9d4d039, 4); + MD5STEP(F3, d, a, b, c, md5->buffer[12] + 0xe6db99e5, 11); + MD5STEP(F3, c, d, a, b, md5->buffer[15] + 0x1fa27cf8, 16); + MD5STEP(F3, b, c, d, a, md5->buffer[2] + 0xc4ac5665, 23); + + MD5STEP(F4, a, b, c, d, md5->buffer[0] + 0xf4292244, 6); + MD5STEP(F4, d, a, b, c, md5->buffer[7] + 0x432aff97, 10); + MD5STEP(F4, c, d, a, b, md5->buffer[14] + 0xab9423a7, 15); + MD5STEP(F4, b, c, d, a, md5->buffer[5] + 0xfc93a039, 21); + MD5STEP(F4, a, b, c, d, md5->buffer[12] + 0x655b59c3, 6); + MD5STEP(F4, d, a, b, c, md5->buffer[3] + 0x8f0ccc92, 10); + MD5STEP(F4, c, d, a, b, md5->buffer[10] + 0xffeff47d, 15); + MD5STEP(F4, b, c, d, a, md5->buffer[1] + 0x85845dd1, 21); + MD5STEP(F4, a, b, c, d, md5->buffer[8] + 0x6fa87e4f, 6); + MD5STEP(F4, d, a, b, c, md5->buffer[15] + 0xfe2ce6e0, 10); + MD5STEP(F4, c, d, a, b, md5->buffer[6] + 0xa3014314, 15); + MD5STEP(F4, b, c, d, a, md5->buffer[13] + 0x4e0811a1, 21); + MD5STEP(F4, a, b, c, d, md5->buffer[4] + 0xf7537e82, 6); + MD5STEP(F4, d, a, b, c, md5->buffer[11] + 0xbd3af235, 10); + MD5STEP(F4, c, d, a, b, md5->buffer[2] + 0x2ad7d2bb, 15); + MD5STEP(F4, b, c, d, a, md5->buffer[9] + 0xeb86d391, 21); + + /* Add the working vars back into digest state[] */ + md5->digest[0] += a; + md5->digest[1] += b; + md5->digest[2] += c; + md5->digest[3] += d; +} + +#endif /* FREESCALE_MMCAU */ + + +static INLINE void AddLength(Md5* md5, word32 len) +{ + word32 tmp = md5->loLen; + if ( (md5->loLen += len) < tmp) + md5->hiLen++; /* carry low to high */ +} + + +void wc_Md5Update(Md5* md5, const byte* data, word32 len) +{ + /* do block size increments */ + byte* local = (byte*)md5->buffer; + + while (len) { + word32 add = min(len, MD5_BLOCK_SIZE - md5->buffLen); + XMEMCPY(&local[md5->buffLen], data, add); + + md5->buffLen += add; + data += add; + len -= add; + + if (md5->buffLen == MD5_BLOCK_SIZE) { + #if defined(BIG_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) + ByteReverseWords(md5->buffer, md5->buffer, MD5_BLOCK_SIZE); + #endif + XTRANSFORM(md5, local); + AddLength(md5, MD5_BLOCK_SIZE); + md5->buffLen = 0; + } + } +#ifdef TI_HASH_TEST + wc_Md5Update_ti(md5, data, len) ; +#endif + +} + + +void wc_Md5Final(Md5* md5, byte* hash) +{ + byte* local = (byte*)md5->buffer; + + AddLength(md5, md5->buffLen); /* before adding pads */ + + local[md5->buffLen++] = 0x80; /* add 1 */ + + /* pad with zeros */ + if (md5->buffLen > MD5_PAD_SIZE) { + XMEMSET(&local[md5->buffLen], 0, MD5_BLOCK_SIZE - md5->buffLen); + md5->buffLen += MD5_BLOCK_SIZE - md5->buffLen; + + #if defined(BIG_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) + ByteReverseWords(md5->buffer, md5->buffer, MD5_BLOCK_SIZE); + #endif + XTRANSFORM(md5, local); + md5->buffLen = 0; + } + XMEMSET(&local[md5->buffLen], 0, MD5_PAD_SIZE - md5->buffLen); + + /* put lengths in bits */ + md5->hiLen = (md5->loLen >> (8*sizeof(md5->loLen) - 3)) + + (md5->hiLen << 3); + md5->loLen = md5->loLen << 3; + + /* store lengths */ + #if defined(BIG_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) + ByteReverseWords(md5->buffer, md5->buffer, MD5_BLOCK_SIZE); + #endif + /* ! length ordering dependent on digest endian type ! */ + XMEMCPY(&local[MD5_PAD_SIZE], &md5->loLen, sizeof(word32)); + XMEMCPY(&local[MD5_PAD_SIZE + sizeof(word32)], &md5->hiLen, sizeof(word32)); + + XTRANSFORM(md5, local); + #ifdef BIG_ENDIAN_ORDER + ByteReverseWords(md5->digest, md5->digest, MD5_DIGEST_SIZE); + #endif + XMEMCPY(hash, md5->digest, MD5_DIGEST_SIZE); + + wc_InitMd5(md5); /* reset state */ + +#ifdef TI_HASH_TEST + wc_Md5Final_ti(md5, hash) ; +#endif +} + +#endif /* STM32F2_HASH */ + + +int wc_Md5Hash(const byte* data, word32 len, byte* hash) +{ +#ifdef WOLFSSL_SMALL_STACK + Md5* md5; +#else + Md5 md5[1]; +#endif + +#ifdef WOLFSSL_SMALL_STACK + md5 = (Md5*)XMALLOC(sizeof(Md5), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (md5 == NULL) + return MEMORY_E; +#endif + + wc_InitMd5(md5); + wc_Md5Update(md5, data, len); + wc_Md5Final(md5, hash); + +#ifdef WOLFSSL_SMALL_STACK + XFREE(md5, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return 0; +} + +#if defined(WOLFSSL_TI_HASH)||defined(TI_HASH_TEST) +#include "wolfssl/wolfcrypt/port/ti/ti-hash.h" +#endif +void wc_Md5GetHash(Md5* md5, byte* hash) +{ +#if defined(WOLFSSL_TI_HASH) || defined(TI_HASH_TEST) + wc_Md5GetHash_ti(md5, hash) ; +#else + Md5 save = *md5 ; + wc_Md5Final(md5, hash) ; + *md5 = save ; +#endif +} +#endif /* NO_MD5 */ diff --git a/wolfcrypt/src/port/ti/ti-hash.c b/wolfcrypt/src/port/ti/ti-hash.c index 223874b20..7647dcdb4 100644 --- a/wolfcrypt/src/port/ti/ti-hash.c +++ b/wolfcrypt/src/port/ti/ti-hash.c @@ -1,4 +1,4 @@ -/* port/ti/ti-hash.h +/* port/ti/ti-hash.c * * Copyright (C) 2006-2015 wolfSSL Inc. * @@ -20,12 +20,9 @@ */ -#ifndef WOLFSSL_TI_HASH_H -#define WOLFSSL_TI_HASH_H - #include -#if defined(WOLFSSL_TI_HASH) +#if defined(WOLFSSL_TI_HASH)||defined(TI_HASH_TEST) #ifdef __cplusplus extern "C" { @@ -41,7 +38,8 @@ #include #include #include - + +#if !defined(TI_HASH_TEST) #include "inc/hw_memmap.h" #include "inc/hw_shamd5.h" #include "inc/hw_ints.h" @@ -49,6 +47,7 @@ #include "driverlib/sysctl.h" #include "driverlib/rom_map.h" #include "driverlib/rom.h" +#endif static int hashInit(wolfssl_TI_Hash *hash) { hash->used = 0 ; @@ -60,6 +59,7 @@ static int hashInit(wolfssl_TI_Hash *hash) { static int hashUpdate(wolfssl_TI_Hash *hash, const byte* data, word32 len) { void *p ; + if((hash== NULL) || (data == NULL))return BAD_FUNC_ARG; if(hash->len < hash->used+len) { if(hash->msg == NULL) { @@ -77,8 +77,10 @@ static int hashUpdate(wolfssl_TI_Hash *hash, const byte* data, word32 len) } static int hashFinal(wolfssl_TI_Hash *hash, byte* result, word32 algo, word32 hsize) -{ +{ + #if !defined(TI_HASH_TEST) uint32_t h[16] ; + wolfSSL_TI_lockCCM() ; ROM_SHAMD5Reset(SHAMD5_BASE); ROM_SHAMD5ConfigSet(SHAMD5_BASE, algo); @@ -86,11 +88,38 @@ static int hashFinal(wolfssl_TI_Hash *hash, byte* result, word32 algo, word32 hs (uint32_t *)hash->msg, hash->used, h); XMEMCPY(result, h, hsize) ; wolfSSL_TI_unlockCCM() ; + #else + (void) result ; + (void) algo ; + (void) hsize ; + #endif XFREE(hash->msg, NULL, DYNAMIC_TYPE_TMP_BUFFER); hashInit(hash) ; return 0 ; } +static int hashGetHash(wolfssl_TI_Hash *hash, byte* result, word32 algo, word32 hsize) +{ + #if !defined(TI_HASH_TEST) + uint32_t h[16] ; + + wolfSSL_TI_lockCCM() ; + ROM_SHAMD5Reset(SHAMD5_BASE); + ROM_SHAMD5ConfigSet(SHAMD5_BASE, algo); + ROM_SHAMD5DataProcess(SHAMD5_BASE, + (uint32_t *)hash->msg, hash->used, h); + XMEMCPY(result, h, hsize) ; + wolfSSL_TI_unlockCCM() ; + #else + (void) hash ; + (void) result ; + (void) algo ; + (void) hsize ; + #endif + return 0 ; +} + +#ifndef TI_HASH_TEST static int hashHash(const byte* data, word32 len, byte* hash, word32 algo, word32 hsize) { int ret = 0; @@ -120,34 +149,80 @@ static int hashHash(const byte* data, word32 len, byte* hash, word32 algo, word3 return ret; } +#endif #if !defined(NO_MD5) +#ifdef TI_HASH_TEST +#define SHAMD5_ALGO_MD5 1 +void wc_InitMd5_ti(Md5* md5) ; +void wc_Md5Update_ti(Md5* md5, const byte* data, word32 len); +void wc_Md5Final_ti(Md5* md5, byte* hash); +bool wolfSSL_TI_CCMInit(void) ; +bool wolfSSL_TI_CCMInit(void) { return true ; } +#endif + +#ifdef TI_HASH_TEST +void wc_InitMd5_ti(Md5* md5) +#else void wc_InitMd5(Md5* md5) +#endif { if (md5 == NULL) return ; if(!wolfSSL_TI_CCMInit())return ; + #ifdef TI_HASH_TEST + hashInit(&(md5->ti)) ; + #else hashInit((wolfssl_TI_Hash *)md5) ; + #endif } +#ifdef TI_HASH_TEST +void wc_Md5Update_ti(Md5* md5, const byte* data, word32 len) +#else void wc_Md5Update(Md5* md5, const byte* data, word32 len) +#endif { + #ifdef TI_HASH_TEST + hashUpdate(&(md5->ti), data, len) ; + #else hashUpdate((wolfssl_TI_Hash *)md5, data, len) ; + #endif } +#ifdef TI_HASH_TEST +void wc_Md5Final_ti(Md5* md5, byte* hash) +#else void wc_Md5Final(Md5* md5, byte* hash) +#endif { - hashFinal((wolfssl_TI_Hash *)md5, hash, SHAMD5_ALGO_MD5, MD5_DIGEST_SIZE) ; + #ifdef TI_HASH_TEST + hashFinal(&(md5->ti), hash, SHAMD5_ALGO_MD5, MD5_DIGEST_SIZE) ; + #else + hashFinal((wolfssl_TI_Hash *)md5, hash, SHAMD5_ALGO_MD5, MD5_DIGEST_SIZE) ; + #endif } + +void wc_Md5GetHash_ti(Md5* md5, byte* hash) +{ + hashGetHash(&(md5->ti), hash, SHAMD5_ALGO_MD5, MD5_DIGEST_SIZE) ; + #ifdef TI_HASH_TEST + wc_Md5Final(md5, hash) ; + #endif +} + +#ifndef TI_HASH_TEST WOLFSSL_API int wc_Md5Hash(const byte*data, word32 len, byte*hash) { return hashHash(data, len, hash, SHAMD5_ALGO_MD5, MD5_DIGEST_SIZE) ; } +#endif #endif /* NO_MD5 */ +#ifndef TI_HASH_TEST #if !defined(NO_SHA) WOLFSSL_API int wc_InitSha(Sha* sha) @@ -223,9 +298,7 @@ WOLFSSL_API int wc_Sha256Hash(const byte* data, word32 len, byte*hash) { return hashHash(data, len, hash, SHAMD5_ALGO_SHA256, SHA256_DIGEST_SIZE) ; } +#endif +#endif /* TI_HASH_TEST */ -#endif /* NO_SHA256 */ - -#endif /* WOLFSSL_TI_HASH */ - -#endif /* WOLFSSL_TI_HASH_H */ +#endif diff --git a/wolfcrypt/src/sha.c b/wolfcrypt/src/sha.c index 0109b8363..2a91116a2 100644 --- a/wolfcrypt/src/sha.c +++ b/wolfcrypt/src/sha.c @@ -1,452 +1,473 @@ -/* sha.c - * - * Copyright (C) 2006-2015 wolfSSL Inc. - * - * This file is part of wolfSSL. (formerly known as CyaSSL) - * - * wolfSSL 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. - * - * wolfSSL 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 - */ - - -#ifdef HAVE_CONFIG_H - #include -#endif - -#include - -#if !defined(NO_SHA) - -#include -#include -#include - -#ifdef NO_INLINE - #include -#else - #include -#endif - -/* fips wrapper calls, user can call direct */ -#ifdef HAVE_FIPS - int wc_InitSha(Sha* sha) - { - return InitSha_fips(sha); - } - - - int wc_ShaUpdate(Sha* sha, const byte* data, word32 len) - { - return ShaUpdate_fips(sha, data, len); - } - - - int wc_ShaFinal(Sha* sha, byte* out) - { - return ShaFinal_fips(sha,out); - } - - int wc_ShaHash(const byte* data, word32 sz, byte* out) - { - return ShaHash(data, sz, out); - } - -#else /* else build without fips */ - -#ifdef WOLFSSL_PIC32MZ_HASH -#define wc_InitSha wc_InitSha_sw -#define wc_ShaUpdate wc_ShaUpdate_sw -#define wc_ShaFinal wc_ShaFinal_sw -#endif - - -#ifdef FREESCALE_MMCAU - #include "cau_api.h" - #define XTRANSFORM(S,B) cau_sha1_hash_n((B), 1, ((S))->digest) -#else - #define XTRANSFORM(S,B) Transform((S)) -#endif - -#ifdef STM32F2_HASH -/* - * STM32F2 hardware SHA1 support through the STM32F2 standard peripheral - * library. Documentation located in STM32F2xx Standard Peripheral Library - * document (See note in README). - */ -#include "stm32f2xx.h" -#include "stm32f2xx_hash.h" - -int wc_InitSha(Sha* sha) -{ - /* STM32F2 struct notes: - * sha->buffer = first 4 bytes used to hold partial block if needed - * sha->buffLen = num bytes currently stored in sha->buffer - * sha->loLen = num bytes that have been written to STM32 FIFO - */ - XMEMSET(sha->buffer, 0, SHA_REG_SIZE); - sha->buffLen = 0; - sha->loLen = 0; - - /* initialize HASH peripheral */ - HASH_DeInit(); - - /* configure algo used, algo mode, datatype */ - HASH->CR &= ~ (HASH_CR_ALGO | HASH_CR_DATATYPE | HASH_CR_MODE); - HASH->CR |= (HASH_AlgoSelection_SHA1 | HASH_AlgoMode_HASH - | HASH_DataType_8b); - - /* reset HASH processor */ - HASH->CR |= HASH_CR_INIT; - - return 0; -} - -int wc_ShaUpdate(Sha* sha, const byte* data, word32 len) -{ - word32 i = 0; - word32 fill = 0; - word32 diff = 0; - - /* if saved partial block is available */ - if (sha->buffLen) { - fill = 4 - sha->buffLen; - - /* if enough data to fill, fill and push to FIFO */ - if (fill <= len) { - XMEMCPY((byte*)sha->buffer + sha->buffLen, data, fill); - HASH_DataIn(*(uint32_t*)sha->buffer); - - data += fill; - len -= fill; - sha->loLen += 4; - sha->buffLen = 0; - } else { - /* append partial to existing stored block */ - XMEMCPY((byte*)sha->buffer + sha->buffLen, data, len); - sha->buffLen += len; - return; - } - } - - /* write input block in the IN FIFO */ - for(i = 0; i < len; i += 4) - { - diff = len - i; - if ( diff < 4) { - /* store incomplete last block, not yet in FIFO */ - XMEMSET(sha->buffer, 0, SHA_REG_SIZE); - XMEMCPY((byte*)sha->buffer, data, diff); - sha->buffLen = diff; - } else { - HASH_DataIn(*(uint32_t*)data); - data+=4; - } - } - - /* keep track of total data length thus far */ - sha->loLen += (len - sha->buffLen); - - return 0; -} - -int wc_ShaFinal(Sha* sha, byte* hash) -{ - __IO uint16_t nbvalidbitsdata = 0; - - /* finish reading any trailing bytes into FIFO */ - if (sha->buffLen) { - HASH_DataIn(*(uint32_t*)sha->buffer); - sha->loLen += sha->buffLen; - } - - /* calculate number of valid bits in last word of input data */ - nbvalidbitsdata = 8 * (sha->loLen % SHA_REG_SIZE); - - /* configure number of valid bits in last word of the data */ - HASH_SetLastWordValidBitsNbr(nbvalidbitsdata); - - /* start HASH processor */ - HASH_StartDigest(); - - /* wait until Busy flag == RESET */ - while (HASH_GetFlagStatus(HASH_FLAG_BUSY) != RESET) {} - - /* read message digest */ - sha->digest[0] = HASH->HR[0]; - sha->digest[1] = HASH->HR[1]; - sha->digest[2] = HASH->HR[2]; - sha->digest[3] = HASH->HR[3]; - sha->digest[4] = HASH->HR[4]; - - ByteReverseWords(sha->digest, sha->digest, SHA_DIGEST_SIZE); - - XMEMCPY(hash, sha->digest, SHA_DIGEST_SIZE); - - return wc_InitSha(sha); /* reset state */ -} - -#else /* wc_ software implementation */ - -#ifndef WOLFSSL_HAVE_MIN -#define WOLFSSL_HAVE_MIN - - static INLINE word32 min(word32 a, word32 b) - { - return a > b ? b : a; - } - -#endif /* WOLFSSL_HAVE_MIN */ - - -int wc_InitSha(Sha* sha) -{ -#ifdef FREESCALE_MMCAU - cau_sha1_initialize_output(sha->digest); -#else - sha->digest[0] = 0x67452301L; - sha->digest[1] = 0xEFCDAB89L; - sha->digest[2] = 0x98BADCFEL; - sha->digest[3] = 0x10325476L; - sha->digest[4] = 0xC3D2E1F0L; -#endif - - sha->buffLen = 0; - sha->loLen = 0; - sha->hiLen = 0; - - return 0; -} - -#ifndef FREESCALE_MMCAU - -#define blk0(i) (W[i] = sha->buffer[i]) -#define blk1(i) (W[(i)&15] = \ -rotlFixed(W[((i)+13)&15]^W[((i)+8)&15]^W[((i)+2)&15]^W[(i)&15],1)) - -#define f1(x,y,z) ((z)^((x) &((y)^(z)))) -#define f2(x,y,z) ((x)^(y)^(z)) -#define f3(x,y,z) (((x)&(y))|((z)&((x)|(y)))) -#define f4(x,y,z) ((x)^(y)^(z)) - -/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ -#define R0(v,w,x,y,z,i) (z)+= f1((w),(x),(y)) + blk0((i)) + 0x5A827999+ \ -rotlFixed((v),5); (w) = rotlFixed((w),30); -#define R1(v,w,x,y,z,i) (z)+= f1((w),(x),(y)) + blk1((i)) + 0x5A827999+ \ -rotlFixed((v),5); (w) = rotlFixed((w),30); -#define R2(v,w,x,y,z,i) (z)+= f2((w),(x),(y)) + blk1((i)) + 0x6ED9EBA1+ \ -rotlFixed((v),5); (w) = rotlFixed((w),30); -#define R3(v,w,x,y,z,i) (z)+= f3((w),(x),(y)) + blk1((i)) + 0x8F1BBCDC+ \ -rotlFixed((v),5); (w) = rotlFixed((w),30); -#define R4(v,w,x,y,z,i) (z)+= f4((w),(x),(y)) + blk1((i)) + 0xCA62C1D6+ \ -rotlFixed((v),5); (w) = rotlFixed((w),30); - -static void Transform(Sha* sha) -{ - word32 W[SHA_BLOCK_SIZE / sizeof(word32)]; - - /* Copy context->state[] to working vars */ - word32 a = sha->digest[0]; - word32 b = sha->digest[1]; - word32 c = sha->digest[2]; - word32 d = sha->digest[3]; - word32 e = sha->digest[4]; - -#ifdef USE_SLOW_SHA - word32 t, i; - - for (i = 0; i < 16; i++) { - R0(a, b, c, d, e, i); - t = e; e = d; d = c; c = b; b = a; a = t; - } - - for (; i < 20; i++) { - R1(a, b, c, d, e, i); - t = e; e = d; d = c; c = b; b = a; a = t; - } - - for (; i < 40; i++) { - R2(a, b, c, d, e, i); - t = e; e = d; d = c; c = b; b = a; a = t; - } - - for (; i < 60; i++) { - R3(a, b, c, d, e, i); - t = e; e = d; d = c; c = b; b = a; a = t; - } - - for (; i < 80; i++) { - R4(a, b, c, d, e, i); - t = e; e = d; d = c; c = b; b = a; a = t; - } -#else - /* nearly 1 K bigger in code size but 25% faster */ - /* 4 rounds of 20 operations each. Loop unrolled. */ - R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); - R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); - R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); - R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); - - R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); - - R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); - R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); - R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); - R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); - R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); - - R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); - R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); - R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); - R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); - R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); - - R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); - R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); - R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); - R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); - R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); -#endif - - /* Add the working vars back into digest state[] */ - sha->digest[0] += a; - sha->digest[1] += b; - sha->digest[2] += c; - sha->digest[3] += d; - sha->digest[4] += e; -} - -#endif /* FREESCALE_MMCAU */ - - -static INLINE void AddLength(Sha* sha, word32 len) -{ - word32 tmp = sha->loLen; - if ( (sha->loLen += len) < tmp) - sha->hiLen++; /* carry low to high */ -} - - -int wc_ShaUpdate(Sha* sha, const byte* data, word32 len) -{ - /* do block size increments */ - byte* local = (byte*)sha->buffer; - - while (len) { - word32 add = min(len, SHA_BLOCK_SIZE - sha->buffLen); - XMEMCPY(&local[sha->buffLen], data, add); - - sha->buffLen += add; - data += add; - len -= add; - - if (sha->buffLen == SHA_BLOCK_SIZE) { -#if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) - ByteReverseWords(sha->buffer, sha->buffer, SHA_BLOCK_SIZE); -#endif - XTRANSFORM(sha, local); - AddLength(sha, SHA_BLOCK_SIZE); - sha->buffLen = 0; - } - } - - return 0; -} - - -int wc_ShaFinal(Sha* sha, byte* hash) -{ - byte* local = (byte*)sha->buffer; - - AddLength(sha, sha->buffLen); /* before adding pads */ - - local[sha->buffLen++] = 0x80; /* add 1 */ - - /* pad with zeros */ - if (sha->buffLen > SHA_PAD_SIZE) { - XMEMSET(&local[sha->buffLen], 0, SHA_BLOCK_SIZE - sha->buffLen); - sha->buffLen += SHA_BLOCK_SIZE - sha->buffLen; - -#if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) - ByteReverseWords(sha->buffer, sha->buffer, SHA_BLOCK_SIZE); -#endif - XTRANSFORM(sha, local); - sha->buffLen = 0; - } - XMEMSET(&local[sha->buffLen], 0, SHA_PAD_SIZE - sha->buffLen); - - /* put lengths in bits */ - sha->hiLen = (sha->loLen >> (8*sizeof(sha->loLen) - 3)) + - (sha->hiLen << 3); - sha->loLen = sha->loLen << 3; - - /* store lengths */ -#if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) - ByteReverseWords(sha->buffer, sha->buffer, SHA_BLOCK_SIZE); -#endif - /* ! length ordering dependent on digest endian type ! */ - XMEMCPY(&local[SHA_PAD_SIZE], &sha->hiLen, sizeof(word32)); - XMEMCPY(&local[SHA_PAD_SIZE + sizeof(word32)], &sha->loLen, sizeof(word32)); - -#ifdef FREESCALE_MMCAU - /* Kinetis requires only these bytes reversed */ - ByteReverseWords(&sha->buffer[SHA_PAD_SIZE/sizeof(word32)], - &sha->buffer[SHA_PAD_SIZE/sizeof(word32)], - 2 * sizeof(word32)); -#endif - - XTRANSFORM(sha, local); -#ifdef LITTLE_ENDIAN_ORDER - ByteReverseWords(sha->digest, sha->digest, SHA_DIGEST_SIZE); -#endif - XMEMCPY(hash, sha->digest, SHA_DIGEST_SIZE); - - return wc_InitSha(sha); /* reset state */ -} - -#endif /* STM32F2_HASH */ - - -int wc_ShaHash(const byte* data, word32 len, byte* hash) -{ - int ret = 0; -#ifdef WOLFSSL_SMALL_STACK - Sha* sha; -#else - Sha sha[1]; -#endif - -#ifdef WOLFSSL_SMALL_STACK - sha = (Sha*)XMALLOC(sizeof(Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (sha == NULL) - return MEMORY_E; -#endif - - if ((ret = wc_InitSha(sha)) != 0) { - WOLFSSL_MSG("wc_InitSha failed"); - } - else { - wc_ShaUpdate(sha, data, len); - wc_ShaFinal(sha, hash); - } - -#ifdef WOLFSSL_SMALL_STACK - XFREE(sha, NULL, DYNAMIC_TYPE_TMP_BUFFER); -#endif - - return ret; - -} -#endif /* HAVE_FIPS */ -#endif /* NO_SHA */ - +/* sha.c + * + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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. + * + * wolfSSL 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 + */ + + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#if !defined(NO_SHA) && !defined(WOLFSSL_TI_HASH) + +#include +#include +#include + +#ifdef NO_INLINE + #include +#else + #include +#endif + +/* fips wrapper calls, user can call direct */ +#ifdef HAVE_FIPS + int wc_InitSha(Sha* sha) + { + return InitSha_fips(sha); + } + + + int wc_ShaUpdate(Sha* sha, const byte* data, word32 len) + { + return ShaUpdate_fips(sha, data, len); + } + + + int wc_ShaFinal(Sha* sha, byte* out) + { + return ShaFinal_fips(sha,out); + } + + int wc_ShaHash(const byte* data, word32 sz, byte* out) + { + return ShaHash(data, sz, out); + } + +#else /* else build without fips */ + +#ifdef WOLFSSL_PIC32MZ_HASH +#define wc_InitSha wc_InitSha_sw +#define wc_ShaUpdate wc_ShaUpdate_sw +#define wc_ShaFinal wc_ShaFinal_sw +#endif + + +#ifdef FREESCALE_MMCAU + #include "cau_api.h" + #define XTRANSFORM(S,B) cau_sha1_hash_n((B), 1, ((S))->digest) +#else + #define XTRANSFORM(S,B) Transform((S)) +#endif + +#ifdef STM32F2_HASH +/* + * STM32F2 hardware SHA1 support through the STM32F2 standard peripheral + * library. Documentation located in STM32F2xx Standard Peripheral Library + * document (See note in README). + */ +#include "stm32f2xx.h" +#include "stm32f2xx_hash.h" + +int wc_InitSha(Sha* sha) +{ + /* STM32F2 struct notes: + * sha->buffer = first 4 bytes used to hold partial block if needed + * sha->buffLen = num bytes currently stored in sha->buffer + * sha->loLen = num bytes that have been written to STM32 FIFO + */ + XMEMSET(sha->buffer, 0, SHA_REG_SIZE); + sha->buffLen = 0; + sha->loLen = 0; + + /* initialize HASH peripheral */ + HASH_DeInit(); + + /* configure algo used, algo mode, datatype */ + HASH->CR &= ~ (HASH_CR_ALGO | HASH_CR_DATATYPE | HASH_CR_MODE); + HASH->CR |= (HASH_AlgoSelection_SHA1 | HASH_AlgoMode_HASH + | HASH_DataType_8b); + + /* reset HASH processor */ + HASH->CR |= HASH_CR_INIT; + + return 0; +} + +int wc_ShaUpdate(Sha* sha, const byte* data, word32 len) +{ + word32 i = 0; + word32 fill = 0; + word32 diff = 0; + + /* if saved partial block is available */ + if (sha->buffLen) { + fill = 4 - sha->buffLen; + + /* if enough data to fill, fill and push to FIFO */ + if (fill <= len) { + XMEMCPY((byte*)sha->buffer + sha->buffLen, data, fill); + HASH_DataIn(*(uint32_t*)sha->buffer); + + data += fill; + len -= fill; + sha->loLen += 4; + sha->buffLen = 0; + } else { + /* append partial to existing stored block */ + XMEMCPY((byte*)sha->buffer + sha->buffLen, data, len); + sha->buffLen += len; + return; + } + } + + /* write input block in the IN FIFO */ + for(i = 0; i < len; i += 4) + { + diff = len - i; + if ( diff < 4) { + /* store incomplete last block, not yet in FIFO */ + XMEMSET(sha->buffer, 0, SHA_REG_SIZE); + XMEMCPY((byte*)sha->buffer, data, diff); + sha->buffLen = diff; + } else { + HASH_DataIn(*(uint32_t*)data); + data+=4; + } + } + + /* keep track of total data length thus far */ + sha->loLen += (len - sha->buffLen); + + return 0; +} + +int wc_ShaFinal(Sha* sha, byte* hash) +{ + __IO uint16_t nbvalidbitsdata = 0; + + /* finish reading any trailing bytes into FIFO */ + if (sha->buffLen) { + HASH_DataIn(*(uint32_t*)sha->buffer); + sha->loLen += sha->buffLen; + } + + /* calculate number of valid bits in last word of input data */ + nbvalidbitsdata = 8 * (sha->loLen % SHA_REG_SIZE); + + /* configure number of valid bits in last word of the data */ + HASH_SetLastWordValidBitsNbr(nbvalidbitsdata); + + /* start HASH processor */ + HASH_StartDigest(); + + /* wait until Busy flag == RESET */ + while (HASH_GetFlagStatus(HASH_FLAG_BUSY) != RESET) {} + + /* read message digest */ + sha->digest[0] = HASH->HR[0]; + sha->digest[1] = HASH->HR[1]; + sha->digest[2] = HASH->HR[2]; + sha->digest[3] = HASH->HR[3]; + sha->digest[4] = HASH->HR[4]; + + ByteReverseWords(sha->digest, sha->digest, SHA_DIGEST_SIZE); + + XMEMCPY(hash, sha->digest, SHA_DIGEST_SIZE); + + return wc_InitSha(sha); /* reset state */ +} + +#elif defined(WOLFSSL_TI_HASH) + + /* defined in port/ti/ti_sha.c */ + +#else /* wc_ software implementation */ + +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN + + static INLINE word32 min(word32 a, word32 b) + { + return a > b ? b : a; + } + +#endif /* WOLFSSL_HAVE_MIN */ + + +int wc_InitSha(Sha* sha) +{ +#ifdef FREESCALE_MMCAU + cau_sha1_initialize_output(sha->digest); +#else + sha->digest[0] = 0x67452301L; + sha->digest[1] = 0xEFCDAB89L; + sha->digest[2] = 0x98BADCFEL; + sha->digest[3] = 0x10325476L; + sha->digest[4] = 0xC3D2E1F0L; +#endif + + sha->buffLen = 0; + sha->loLen = 0; + sha->hiLen = 0; + + return 0; +} + +#ifndef FREESCALE_MMCAU + +#define blk0(i) (W[i] = sha->buffer[i]) +#define blk1(i) (W[(i)&15] = \ +rotlFixed(W[((i)+13)&15]^W[((i)+8)&15]^W[((i)+2)&15]^W[(i)&15],1)) + +#define f1(x,y,z) ((z)^((x) &((y)^(z)))) +#define f2(x,y,z) ((x)^(y)^(z)) +#define f3(x,y,z) (((x)&(y))|((z)&((x)|(y)))) +#define f4(x,y,z) ((x)^(y)^(z)) + +/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ +#define R0(v,w,x,y,z,i) (z)+= f1((w),(x),(y)) + blk0((i)) + 0x5A827999+ \ +rotlFixed((v),5); (w) = rotlFixed((w),30); +#define R1(v,w,x,y,z,i) (z)+= f1((w),(x),(y)) + blk1((i)) + 0x5A827999+ \ +rotlFixed((v),5); (w) = rotlFixed((w),30); +#define R2(v,w,x,y,z,i) (z)+= f2((w),(x),(y)) + blk1((i)) + 0x6ED9EBA1+ \ +rotlFixed((v),5); (w) = rotlFixed((w),30); +#define R3(v,w,x,y,z,i) (z)+= f3((w),(x),(y)) + blk1((i)) + 0x8F1BBCDC+ \ +rotlFixed((v),5); (w) = rotlFixed((w),30); +#define R4(v,w,x,y,z,i) (z)+= f4((w),(x),(y)) + blk1((i)) + 0xCA62C1D6+ \ +rotlFixed((v),5); (w) = rotlFixed((w),30); + +static void Transform(Sha* sha) +{ + word32 W[SHA_BLOCK_SIZE / sizeof(word32)]; + + /* Copy context->state[] to working vars */ + word32 a = sha->digest[0]; + word32 b = sha->digest[1]; + word32 c = sha->digest[2]; + word32 d = sha->digest[3]; + word32 e = sha->digest[4]; + +#ifdef USE_SLOW_SHA + word32 t, i; + + for (i = 0; i < 16; i++) { + R0(a, b, c, d, e, i); + t = e; e = d; d = c; c = b; b = a; a = t; + } + + for (; i < 20; i++) { + R1(a, b, c, d, e, i); + t = e; e = d; d = c; c = b; b = a; a = t; + } + + for (; i < 40; i++) { + R2(a, b, c, d, e, i); + t = e; e = d; d = c; c = b; b = a; a = t; + } + + for (; i < 60; i++) { + R3(a, b, c, d, e, i); + t = e; e = d; d = c; c = b; b = a; a = t; + } + + for (; i < 80; i++) { + R4(a, b, c, d, e, i); + t = e; e = d; d = c; c = b; b = a; a = t; + } +#else + /* nearly 1 K bigger in code size but 25% faster */ + /* 4 rounds of 20 operations each. Loop unrolled. */ + R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); + R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); + R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); + R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); + + R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); + + R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); + R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); + R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); + R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); + R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); + + R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); + R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); + R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); + R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); + R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); + + R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); + R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); + R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); + R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); + R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); +#endif + + /* Add the working vars back into digest state[] */ + sha->digest[0] += a; + sha->digest[1] += b; + sha->digest[2] += c; + sha->digest[3] += d; + sha->digest[4] += e; +} + +#endif /* FREESCALE_MMCAU */ + + +static INLINE void AddLength(Sha* sha, word32 len) +{ + word32 tmp = sha->loLen; + if ( (sha->loLen += len) < tmp) + sha->hiLen++; /* carry low to high */ +} + + +int wc_ShaUpdate(Sha* sha, const byte* data, word32 len) +{ + /* do block size increments */ + byte* local = (byte*)sha->buffer; + + while (len) { + word32 add = min(len, SHA_BLOCK_SIZE - sha->buffLen); + XMEMCPY(&local[sha->buffLen], data, add); + + sha->buffLen += add; + data += add; + len -= add; + + if (sha->buffLen == SHA_BLOCK_SIZE) { +#if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) + ByteReverseWords(sha->buffer, sha->buffer, SHA_BLOCK_SIZE); +#endif + XTRANSFORM(sha, local); + AddLength(sha, SHA_BLOCK_SIZE); + sha->buffLen = 0; + } + } + + return 0; +} + + +int wc_ShaFinal(Sha* sha, byte* hash) +{ + byte* local = (byte*)sha->buffer; + + AddLength(sha, sha->buffLen); /* before adding pads */ + + local[sha->buffLen++] = 0x80; /* add 1 */ + + /* pad with zeros */ + if (sha->buffLen > SHA_PAD_SIZE) { + XMEMSET(&local[sha->buffLen], 0, SHA_BLOCK_SIZE - sha->buffLen); + sha->buffLen += SHA_BLOCK_SIZE - sha->buffLen; + +#if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) + ByteReverseWords(sha->buffer, sha->buffer, SHA_BLOCK_SIZE); +#endif + XTRANSFORM(sha, local); + sha->buffLen = 0; + } + XMEMSET(&local[sha->buffLen], 0, SHA_PAD_SIZE - sha->buffLen); + + /* put lengths in bits */ + sha->hiLen = (sha->loLen >> (8*sizeof(sha->loLen) - 3)) + + (sha->hiLen << 3); + sha->loLen = sha->loLen << 3; + + /* store lengths */ +#if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) + ByteReverseWords(sha->buffer, sha->buffer, SHA_BLOCK_SIZE); +#endif + /* ! length ordering dependent on digest endian type ! */ + XMEMCPY(&local[SHA_PAD_SIZE], &sha->hiLen, sizeof(word32)); + XMEMCPY(&local[SHA_PAD_SIZE + sizeof(word32)], &sha->loLen, sizeof(word32)); + +#ifdef FREESCALE_MMCAU + /* Kinetis requires only these bytes reversed */ + ByteReverseWords(&sha->buffer[SHA_PAD_SIZE/sizeof(word32)], + &sha->buffer[SHA_PAD_SIZE/sizeof(word32)], + 2 * sizeof(word32)); +#endif + + XTRANSFORM(sha, local); +#ifdef LITTLE_ENDIAN_ORDER + ByteReverseWords(sha->digest, sha->digest, SHA_DIGEST_SIZE); +#endif + XMEMCPY(hash, sha->digest, SHA_DIGEST_SIZE); + + return wc_InitSha(sha); /* reset state */ +} + +#endif /* STM32F2_HASH */ + + +int wc_ShaHash(const byte* data, word32 len, byte* hash) +{ + int ret = 0; +#ifdef WOLFSSL_SMALL_STACK + Sha* sha; +#else + Sha sha[1]; +#endif + +#ifdef WOLFSSL_SMALL_STACK + sha = (Sha*)XMALLOC(sizeof(Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (sha == NULL) + return MEMORY_E; +#endif + + if ((ret = wc_InitSha(sha)) != 0) { + WOLFSSL_MSG("wc_InitSha failed"); + } + else { + wc_ShaUpdate(sha, data, len); + wc_ShaFinal(sha, hash); + } + +#ifdef WOLFSSL_SMALL_STACK + XFREE(sha, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return ret; + +} + +#ifdef WOLFSSL_TI_HASH +#include "wolfssl/wolfcrypt/port/ti/ti-hash.h" +#endif +int wc_ShaGetHash(Sha* sha, byte* hash) +{ +#if defined(WOLFSS_TI_HASH) + wc_ShaGetHash_TI(sha, hash) ; +#else + int ret ; + Sha save = *sha ; + ret = wc_ShaFinal(sha, hash) ; + *sha = save ; + return ret ; +#endif +} + +#endif /* HAVE_FIPS */ +#endif /* NO_SHA */ + diff --git a/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c old mode 100755 new mode 100644 index 2821166b4..ec4eb918b --- a/wolfcrypt/src/sha256.c +++ b/wolfcrypt/src/sha256.c @@ -1,1759 +1,1781 @@ -/* sha256.c - * - * Copyright (C) 2006-2015 wolfSSL Inc. - * - * This file is part of wolfSSL. (formerly known as CyaSSL) - * - * wolfSSL 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. - * - * wolfSSL 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 - */ - -/* code submitted by raphael.huck@efixo.com */ - -#ifdef HAVE_CONFIG_H - #include -#endif - -#include -#include - -#if !defined(NO_SHA256) -#ifdef HAVE_FIPS - -int wc_InitSha256(Sha256* sha) -{ - return InitSha256_fips(sha); -} - - -int wc_Sha256Update(Sha256* sha, const byte* data, word32 len) -{ - return Sha256Update_fips(sha, data, len); -} - - -int wc_Sha256Final(Sha256* sha, byte* out) -{ - return Sha256Final_fips(sha, out); -} - - -int wc_Sha256Hash(const byte* data, word32 len, byte* out) -{ - return Sha256Hash(data, len, out); -} - -#else /* else build without fips */ - -#if !defined (ALIGN32) - #if defined (__GNUC__) - #define ALIGN32 __attribute__ ( (aligned (32))) - #elif defined(_MSC_VER) - /* disable align warning, we want alignment ! */ - #pragma warning(disable: 4324) - #define ALIGN32 __declspec (align (32)) - #else - #define ALIGN32 - #endif -#endif - -#ifdef WOLFSSL_PIC32MZ_HASH -#define wc_InitSha256 wc_InitSha256_sw -#define wc_Sha256Update wc_Sha256Update_sw -#define wc_Sha256Final wc_Sha256Final_sw -#endif - -#ifdef HAVE_FIPS - /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ - #define FIPS_NO_WRAPPERS -#endif - -#if defined(USE_INTEL_SPEEDUP) -#define HAVE_INTEL_AVX1 -#define HAVE_INTEL_AVX2 - -#if defined(DEBUG_XMM) -#include "stdio.h" -#endif - -#endif - -#if defined(HAVE_INTEL_AVX2) -#define HAVE_INTEL_RORX -#endif - - -/***** -Intel AVX1/AVX2 Macro Control Structure - -#define HAVE_INTEL_AVX1 -#define HAVE_INTEL_AVX2 - -#define HAVE_INTEL_RORX - - -int InitSha256(Sha256* sha256) { - Save/Recover XMM, YMM - ... -} - -#if defined(HAVE_INTEL_AVX1)|| defined(HAVE_INTEL_AVX2) - Transform() ; Function prototype -#else - Transform() { } - int Sha256Final() { - Save/Recover XMM, YMM - ... - } -#endif - -#if defined(HAVE_INTEL_AVX1)|| defined(HAVE_INTEL_AVX2) - #if defined(HAVE_INTEL_RORX - #define RND with rorx instuction - #else - #define RND - #endif -#endif - -#if defined(HAVE_INTEL_AVX1) - - #define XMM Instructions/inline asm - - int Transform() { - Stitched Message Sched/Round - } - -#elif defined(HAVE_INTEL_AVX2) - - #define YMM Instructions/inline asm - - int Transform() { - More granural Stitched Message Sched/Round - } - -*/ - - -#if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) - -/* Each platform needs to query info type 1 from cpuid to see if aesni is - * supported. Also, let's setup a macro for proper linkage w/o ABI conflicts - */ - -#ifndef _MSC_VER - #define cpuid(reg, leaf, sub)\ - __asm__ __volatile__ ("cpuid":\ - "=a" (reg[0]), "=b" (reg[1]), "=c" (reg[2]), "=d" (reg[3]) :\ - "a" (leaf), "c"(sub)); - - #define XASM_LINK(f) asm(f) -#else - - #include - #define cpuid(a,b) __cpuid((int*)a,b) - - #define XASM_LINK(f) - -#endif /* _MSC_VER */ - -#define EAX 0 -#define EBX 1 -#define ECX 2 -#define EDX 3 - -#define CPUID_AVX1 0x1 -#define CPUID_AVX2 0x2 -#define CPUID_RDRAND 0x4 -#define CPUID_RDSEED 0x8 -#define CPUID_BMI2 0x10 /* MULX, RORX */ - -#define IS_INTEL_AVX1 (cpuid_flags&CPUID_AVX1) -#define IS_INTEL_AVX2 (cpuid_flags&CPUID_AVX2) -#define IS_INTEL_BMI2 (cpuid_flags&CPUID_BMI2) -#define IS_INTEL_RDRAND (cpuid_flags&CPUID_RDRAND) -#define IS_INTEL_RDSEED (cpuid_flags&CPUID_RDSEED) - -static word32 cpuid_check = 0 ; -static word32 cpuid_flags = 0 ; - -static word32 cpuid_flag(word32 leaf, word32 sub, word32 num, word32 bit) { - int got_intel_cpu=0; - unsigned int reg[5]; - - reg[4] = '\0' ; - cpuid(reg, 0, 0); - if(memcmp((char *)&(reg[EBX]), "Genu", 4) == 0 && - memcmp((char *)&(reg[EDX]), "ineI", 4) == 0 && - memcmp((char *)&(reg[ECX]), "ntel", 4) == 0) { - got_intel_cpu = 1; - } - if (got_intel_cpu) { - cpuid(reg, leaf, sub); - return((reg[num]>>bit)&0x1) ; - } - return 0 ; -} - -static int set_cpuid_flags(void) { - if(cpuid_check==0) { - if(cpuid_flag(1, 0, ECX, 28)){ cpuid_flags |= CPUID_AVX1 ;} - if(cpuid_flag(7, 0, EBX, 5)){ cpuid_flags |= CPUID_AVX2 ; } - if(cpuid_flag(7, 0, EBX, 8)) { cpuid_flags |= CPUID_BMI2 ; } - if(cpuid_flag(1, 0, ECX, 30)){ cpuid_flags |= CPUID_RDRAND ; } - if(cpuid_flag(7, 0, EBX, 18)){ cpuid_flags |= CPUID_RDSEED ; } - cpuid_check = 1 ; - return 0 ; - } - return 1 ; -} - - -/* #if defined(HAVE_INTEL_AVX1/2) at the tail of sha512 */ -static int Transform(Sha256* sha256); - -#if defined(HAVE_INTEL_AVX1) -static int Transform_AVX1(Sha256 *sha256) ; -#endif -#if defined(HAVE_INTEL_AVX2) -static int Transform_AVX2(Sha256 *sha256) ; -static int Transform_AVX1_RORX(Sha256 *sha256) ; -#endif - -static int (*Transform_p)(Sha256* sha256) /* = _Transform */; - -#define XTRANSFORM(sha256, B) (*Transform_p)(sha256) - -static void set_Transform(void) { - if(set_cpuid_flags())return ; - -#if defined(HAVE_INTEL_AVX2) - if(IS_INTEL_AVX2 && IS_INTEL_BMI2){ - Transform_p = Transform_AVX1_RORX; return ; - Transform_p = Transform_AVX2 ; - /* for avoiding warning,"not used" */ - } -#endif -#if defined(HAVE_INTEL_AVX1) - Transform_p = ((IS_INTEL_AVX1) ? Transform_AVX1 : Transform) ; return ; -#endif - Transform_p = Transform ; return ; -} - -#else - #if defined(FREESCALE_MMCAU) - #define XTRANSFORM(sha256, B) Transform(sha256, B) - #else - #define XTRANSFORM(sha256, B) Transform(sha256) - #endif -#endif - -/* Dummy for saving MM_REGs on behalf of Transform */ -#if defined(HAVE_INTEL_AVX2)&& !defined(HAVE_INTEL_AVX1) -#define SAVE_XMM_YMM __asm__ volatile("or %%r8d, %%r8d":::\ - "%ymm4","%ymm5","%ymm6","%ymm7","%ymm8","%ymm9","%ymm10","%ymm11","%ymm12","%ymm13","%ymm14","%ymm15") -#elif defined(HAVE_INTEL_AVX1) -#define SAVE_XMM_YMM __asm__ volatile("or %%r8d, %%r8d":::\ - "xmm0","xmm1","xmm2","xmm3","xmm4","xmm5","xmm6","xmm7","xmm8","xmm9","xmm10",\ - "xmm11","xmm12","xmm13","xmm14","xmm15") -#else -#define SAVE_XMM_YMM -#endif - -#ifdef WOLFSSL_PIC32MZ_HASH -#define InitSha256 InitSha256_sw -#define Sha256Update Sha256Update_sw -#define Sha256Final Sha256Final_sw -#endif - -#include -#include - -#ifdef NO_INLINE - #include -#else - #include -#endif - -#ifdef FREESCALE_MMCAU - #include "cau_api.h" -#endif - -#ifndef WOLFSSL_HAVE_MIN -#define WOLFSSL_HAVE_MIN - - static INLINE word32 min(word32 a, word32 b) - { - return a > b ? b : a; - } - -#endif /* WOLFSSL_HAVE_MIN */ - - -int wc_InitSha256(Sha256* sha256) -{ - #ifdef FREESCALE_MMCAU - cau_sha256_initialize_output(sha256->digest); - #else - sha256->digest[0] = 0x6A09E667L; - sha256->digest[1] = 0xBB67AE85L; - sha256->digest[2] = 0x3C6EF372L; - sha256->digest[3] = 0xA54FF53AL; - sha256->digest[4] = 0x510E527FL; - sha256->digest[5] = 0x9B05688CL; - sha256->digest[6] = 0x1F83D9ABL; - sha256->digest[7] = 0x5BE0CD19L; - #endif - - sha256->buffLen = 0; - sha256->loLen = 0; - sha256->hiLen = 0; - -#if defined(HAVE_INTEL_AVX1)|| defined(HAVE_INTEL_AVX2) - set_Transform() ; /* choose best Transform function under this runtime environment */ -#endif - - return 0; -} - - -#if !defined(FREESCALE_MMCAU) -static const ALIGN32 word32 K[64] = { - 0x428A2F98L, 0x71374491L, 0xB5C0FBCFL, 0xE9B5DBA5L, 0x3956C25BL, - 0x59F111F1L, 0x923F82A4L, 0xAB1C5ED5L, 0xD807AA98L, 0x12835B01L, - 0x243185BEL, 0x550C7DC3L, 0x72BE5D74L, 0x80DEB1FEL, 0x9BDC06A7L, - 0xC19BF174L, 0xE49B69C1L, 0xEFBE4786L, 0x0FC19DC6L, 0x240CA1CCL, - 0x2DE92C6FL, 0x4A7484AAL, 0x5CB0A9DCL, 0x76F988DAL, 0x983E5152L, - 0xA831C66DL, 0xB00327C8L, 0xBF597FC7L, 0xC6E00BF3L, 0xD5A79147L, - 0x06CA6351L, 0x14292967L, 0x27B70A85L, 0x2E1B2138L, 0x4D2C6DFCL, - 0x53380D13L, 0x650A7354L, 0x766A0ABBL, 0x81C2C92EL, 0x92722C85L, - 0xA2BFE8A1L, 0xA81A664BL, 0xC24B8B70L, 0xC76C51A3L, 0xD192E819L, - 0xD6990624L, 0xF40E3585L, 0x106AA070L, 0x19A4C116L, 0x1E376C08L, - 0x2748774CL, 0x34B0BCB5L, 0x391C0CB3L, 0x4ED8AA4AL, 0x5B9CCA4FL, - 0x682E6FF3L, 0x748F82EEL, 0x78A5636FL, 0x84C87814L, 0x8CC70208L, - 0x90BEFFFAL, 0xA4506CEBL, 0xBEF9A3F7L, 0xC67178F2L -}; - -#endif - -#if defined(FREESCALE_MMCAU) - -static int Transform(Sha256* sha256, byte* buf) -{ - cau_sha256_hash_n(buf, 1, sha256->digest); - - return 0; -} - -#endif /* FREESCALE_MMCAU */ - -#define Ch(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) -#define Maj(x,y,z) ((((x) | (y)) & (z)) | ((x) & (y))) -#define R(x, n) (((x)&0xFFFFFFFFU)>>(n)) - -#define S(x, n) rotrFixed(x, n) -#define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22)) -#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25)) -#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3)) -#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10)) - -#define RND(a,b,c,d,e,f,g,h,i) \ - t0 = (h) + Sigma1((e)) + Ch((e), (f), (g)) + K[(i)] + W[(i)]; \ - t1 = Sigma0((a)) + Maj((a), (b), (c)); \ - (d) += t0; \ - (h) = t0 + t1; - -#if !defined(FREESCALE_MMCAU) -static int Transform(Sha256* sha256) -{ - word32 S[8], t0, t1; - int i; - -#ifdef WOLFSSL_SMALL_STACK - word32* W; - - W = (word32*) XMALLOC(sizeof(word32) * 64, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (W == NULL) - return MEMORY_E; -#else - word32 W[64]; -#endif - - /* Copy context->state[] to working vars */ - for (i = 0; i < 8; i++) - S[i] = sha256->digest[i]; - - for (i = 0; i < 16; i++) - W[i] = sha256->buffer[i]; - - for (i = 16; i < 64; i++) - W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15]) + W[i-16]; - - for (i = 0; i < 64; i += 8) { - RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],i+0); - RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],i+1); - RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],i+2); - RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],i+3); - RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],i+4); - RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],i+5); - RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],i+6); - RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],i+7); - } - - /* Add the working vars back into digest state[] */ - for (i = 0; i < 8; i++) { - sha256->digest[i] += S[i]; - } - -#ifdef WOLFSSL_SMALL_STACK - XFREE(W, NULL, DYNAMIC_TYPE_TMP_BUFFER); -#endif - - return 0; -} - -#endif /* #if !defined(FREESCALE_MMCAU) */ - -static INLINE void AddLength(Sha256* sha256, word32 len) -{ - word32 tmp = sha256->loLen; - if ( (sha256->loLen += len) < tmp) - sha256->hiLen++; /* carry low to high */ -} - -int wc_Sha256Update(Sha256* sha256, const byte* data, word32 len) -{ - - /* do block size increments */ - byte* local = (byte*)sha256->buffer; - - SAVE_XMM_YMM ; /* for Intel AVX */ - - while (len) { - word32 add = min(len, SHA256_BLOCK_SIZE - sha256->buffLen); - XMEMCPY(&local[sha256->buffLen], data, add); - - sha256->buffLen += add; - data += add; - len -= add; - - if (sha256->buffLen == SHA256_BLOCK_SIZE) { - int ret; - - #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) - #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) - if(!IS_INTEL_AVX1 && !IS_INTEL_AVX2) - #endif - ByteReverseWords(sha256->buffer, sha256->buffer, - SHA256_BLOCK_SIZE); - #endif - ret = XTRANSFORM(sha256, local); - if (ret != 0) - return ret; - - AddLength(sha256, SHA256_BLOCK_SIZE); - sha256->buffLen = 0; - } - } - - return 0; -} - -int wc_Sha256Final(Sha256* sha256, byte* hash) -{ - byte* local = (byte*)sha256->buffer; - int ret; - - SAVE_XMM_YMM ; /* for Intel AVX */ - - AddLength(sha256, sha256->buffLen); /* before adding pads */ - - local[sha256->buffLen++] = 0x80; /* add 1 */ - - /* pad with zeros */ - if (sha256->buffLen > SHA256_PAD_SIZE) { - XMEMSET(&local[sha256->buffLen], 0, SHA256_BLOCK_SIZE - sha256->buffLen); - sha256->buffLen += SHA256_BLOCK_SIZE - sha256->buffLen; - - #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) - #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) - if(!IS_INTEL_AVX1 && !IS_INTEL_AVX2) - #endif - ByteReverseWords(sha256->buffer, sha256->buffer, SHA256_BLOCK_SIZE); - #endif - - ret = XTRANSFORM(sha256, local); - if (ret != 0) - return ret; - - sha256->buffLen = 0; - } - XMEMSET(&local[sha256->buffLen], 0, SHA256_PAD_SIZE - sha256->buffLen); - - /* put lengths in bits */ - sha256->hiLen = (sha256->loLen >> (8*sizeof(sha256->loLen) - 3)) + - (sha256->hiLen << 3); - sha256->loLen = sha256->loLen << 3; - - /* store lengths */ - #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) - #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) - if(!IS_INTEL_AVX1 && !IS_INTEL_AVX2) - #endif - ByteReverseWords(sha256->buffer, sha256->buffer, SHA256_BLOCK_SIZE); - #endif - /* ! length ordering dependent on digest endian type ! */ - XMEMCPY(&local[SHA256_PAD_SIZE], &sha256->hiLen, sizeof(word32)); - XMEMCPY(&local[SHA256_PAD_SIZE + sizeof(word32)], &sha256->loLen, - sizeof(word32)); - - #if defined(FREESCALE_MMCAU) || defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) - /* Kinetis requires only these bytes reversed */ - #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) - if(IS_INTEL_AVX1 || IS_INTEL_AVX2) - #endif - ByteReverseWords(&sha256->buffer[SHA256_PAD_SIZE/sizeof(word32)], - &sha256->buffer[SHA256_PAD_SIZE/sizeof(word32)], - 2 * sizeof(word32)); - #endif - - ret = XTRANSFORM(sha256, local); - if (ret != 0) - return ret; - - #if defined(LITTLE_ENDIAN_ORDER) - ByteReverseWords(sha256->digest, sha256->digest, SHA256_DIGEST_SIZE); - #endif - XMEMCPY(hash, sha256->digest, SHA256_DIGEST_SIZE); - - return wc_InitSha256(sha256); /* reset state */ -} - - - -int wc_Sha256Hash(const byte* data, word32 len, byte* hash) -{ - int ret = 0; -#ifdef WOLFSSL_SMALL_STACK - Sha256* sha256; -#else - Sha256 sha256[1]; -#endif - -#ifdef WOLFSSL_SMALL_STACK - sha256 = (Sha256*)XMALLOC(sizeof(Sha256), NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (sha256 == NULL) - return MEMORY_E; -#endif - - if ((ret = wc_InitSha256(sha256)) != 0) { - WOLFSSL_MSG("InitSha256 failed"); - } - else if ((ret = wc_Sha256Update(sha256, data, len)) != 0) { - WOLFSSL_MSG("Sha256Update failed"); - } - else if ((ret = wc_Sha256Final(sha256, hash)) != 0) { - WOLFSSL_MSG("Sha256Final failed"); - } - -#ifdef WOLFSSL_SMALL_STACK - XFREE(sha256, NULL, DYNAMIC_TYPE_TMP_BUFFER); -#endif - - return ret; -} - -#if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) - -#define _DigestToReg(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ - { word32 d ;\ - d = sha256->digest[0]; __asm__ volatile("movl %0, %"#S_0::"r"(d):SSE_REGs) ;\ - d = sha256->digest[1]; __asm__ volatile("movl %0, %"#S_1::"r"(d):SSE_REGs) ;\ - d = sha256->digest[2]; __asm__ volatile("movl %0, %"#S_2::"r"(d):SSE_REGs) ;\ - d = sha256->digest[3]; __asm__ volatile("movl %0, %"#S_3::"r"(d):SSE_REGs) ;\ - d = sha256->digest[4]; __asm__ volatile("movl %0, %"#S_4::"r"(d):SSE_REGs) ;\ - d = sha256->digest[5]; __asm__ volatile("movl %0, %"#S_5::"r"(d):SSE_REGs) ;\ - d = sha256->digest[6]; __asm__ volatile("movl %0, %"#S_6::"r"(d):SSE_REGs) ;\ - d = sha256->digest[7]; __asm__ volatile("movl %0, %"#S_7::"r"(d):SSE_REGs) ;\ -} - -#define _RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ - { word32 d ; \ - __asm__ volatile("movl %"#S_0", %0":"=r"(d)::SSE_REGs) ; sha256->digest[0] += d;\ - __asm__ volatile("movl %"#S_1", %0":"=r"(d)::SSE_REGs) ; sha256->digest[1] += d;\ - __asm__ volatile("movl %"#S_2", %0":"=r"(d)::SSE_REGs) ; sha256->digest[2] += d;\ - __asm__ volatile("movl %"#S_3", %0":"=r"(d)::SSE_REGs) ; sha256->digest[3] += d;\ - __asm__ volatile("movl %"#S_4", %0":"=r"(d)::SSE_REGs) ; sha256->digest[4] += d;\ - __asm__ volatile("movl %"#S_5", %0":"=r"(d)::SSE_REGs) ; sha256->digest[5] += d;\ - __asm__ volatile("movl %"#S_6", %0":"=r"(d)::SSE_REGs) ; sha256->digest[6] += d;\ - __asm__ volatile("movl %"#S_7", %0":"=r"(d)::SSE_REGs) ; sha256->digest[7] += d;\ -} - - -#define DigestToReg(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ - _DigestToReg(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 ) - -#define RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ - _RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 ) - - - - -#define S_0 %r15d -#define S_1 %r10d -#define S_2 %r11d -#define S_3 %r12d -#define S_4 %r13d -#define S_5 %r14d -#define S_6 %ebx -#define S_7 %r9d - -#define SSE_REGs "%edi", "%ecx", "%esi", "%edx", "%ebx","%r8","%r9","%r10","%r11","%r12","%r13","%r14","%r15" - -#if defined(HAVE_INTEL_RORX) -#define RND_STEP_RORX_1(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("rorx $6, %"#e", %%edx\n\t":::"%edx",SSE_REGs); /* edx = e>>6 */\ - -#define RND_STEP_RORX_2(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("rorx $11, %"#e",%%edi\n\t":::"%edi",SSE_REGs); /* edi = e>>11 */\ -__asm__ volatile("xorl %%edx, %%edi\n\t":::"%edx","%edi",SSE_REGs); /* edi = (e>>11) ^ (e>>6) */\ -__asm__ volatile("rorx $25, %"#e", %%edx\n\t":::"%edx",SSE_REGs); /* edx = e>>25 */\ - -#define RND_STEP_RORX_3(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("movl %"#f", %%esi\n\t":::"%esi",SSE_REGs); /* esi = f */\ -__asm__ volatile("xorl %"#g", %%esi\n\t":::"%esi",SSE_REGs); /* esi = f ^ g */\ -__asm__ volatile("xorl %%edi, %%edx\n\t":::"%edi","%edx",SSE_REGs); /* edx = Sigma1(e) */\ -__asm__ volatile("andl %"#e", %%esi\n\t":::"%esi",SSE_REGs); /* esi = (f ^ g) & e */\ -__asm__ volatile("xorl %"#g", %%esi\n\t":::"%esi",SSE_REGs); /* esi = Ch(e,f,g) */\ - -#define RND_STEP_RORX_4(a,b,c,d,e,f,g,h,i)\ -/*__asm__ volatile("movl %0, %%edx\n\t"::"m"(w_k):"%edx");*/\ -__asm__ volatile("addl %0, %"#h"\n\t"::"r"(W_K[i]):SSE_REGs); /* h += w_k */\ -__asm__ volatile("addl %%edx, %"#h"\n\t":::"%edx",SSE_REGs); /* h = h + w_k + Sigma1(e) */\ -__asm__ volatile("rorx $2, %"#a", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = a>>2 */\ -__asm__ volatile("rorx $13, %"#a", %%edi\n\t":::"%edi",SSE_REGs);/* edi = a>>13 */\ - -#define RND_STEP_RORX_5(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("rorx $22, %"#a", %%edx\n\t":::"%edx",SSE_REGs); /* edx = a>>22 */\ -__asm__ volatile("xorl %%r8d, %%edi\n\t":::"%edi","%r8",SSE_REGs);/* edi = (a>>2) ^ (a>>13) */\ -__asm__ volatile("xorl %%edi, %%edx\n\t":::"%edi","%edx",SSE_REGs); /* edx = Sigma0(a) */\ - -#define RND_STEP_RORX_6(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("movl %"#b", %%edi\n\t":::"%edi",SSE_REGs); /* edi = b */\ -__asm__ volatile("orl %"#a", %%edi\n\t":::"%edi",SSE_REGs); /* edi = a | b */\ -__asm__ volatile("andl %"#c", %%edi\n\t":::"%edi",SSE_REGs); /* edi = (a | b) & c*/\ -__asm__ volatile("movl %"#b", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = b */\ - -#define RND_STEP_RORX_7(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("addl %%esi, %"#h"\n\t":::"%esi",SSE_REGs); /* h += Ch(e,f,g) */\ -__asm__ volatile("andl %"#a", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = b & a */\ -__asm__ volatile("orl %%edi, %%r8d\n\t":::"%edi","%r8",SSE_REGs); /* r8d = Maj(a,b,c) */\ - -#define RND_STEP_RORX_8(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("addl "#h", "#d"\n\t"); /* d += h + w_k + Sigma1(e) + Ch(e,f,g) */\ -__asm__ volatile("addl %"#h", %%r8d\n\t":::"%r8",SSE_REGs); \ -__asm__ volatile("addl %%edx, %%r8d\n\t":::"%edx","%r8",SSE_REGs); \ -__asm__ volatile("movl %r8d, "#h"\n\t"); - -#endif - -#define RND_STEP_1(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("movl %"#e", %%edx\n\t":::"%edx",SSE_REGs);\ -__asm__ volatile("roll $26, %%edx\n\t":::"%edx",SSE_REGs); /* edx = e>>6 */\ -__asm__ volatile("movl %"#e", %%edi\n\t":::"%edi",SSE_REGs);\ - -#define RND_STEP_2(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("roll $21, %%edi\n\t":::"%edi",SSE_REGs); /* edi = e>>11 */\ -__asm__ volatile("xorl %%edx, %%edi\n\t":::"%edx","%edi",SSE_REGs); /* edi = (e>>11) ^ (e>>6) */\ -__asm__ volatile("movl %"#e", %%edx\n\t":::"%edx",SSE_REGs); /* edx = e */\ -__asm__ volatile("roll $7, %%edx\n\t":::"%edx",SSE_REGs); /* edx = e>>25 */\ - -#define RND_STEP_3(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("movl %"#f", %%esi\n\t":::"%esi",SSE_REGs); /* esi = f */\ -__asm__ volatile("xorl %"#g", %%esi\n\t":::"%esi",SSE_REGs); /* esi = f ^ g */\ -__asm__ volatile("xorl %%edi, %%edx\n\t":::"%edi","%edx",SSE_REGs); /* edx = Sigma1(e) */\ -__asm__ volatile("andl %"#e", %%esi\n\t":::"%esi",SSE_REGs); /* esi = (f ^ g) & e */\ -__asm__ volatile("xorl %"#g", %%esi\n\t":::"%esi",SSE_REGs); /* esi = Ch(e,f,g) */\ - -#define RND_STEP_4(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("addl %0, %"#h"\n\t"::"r"(W_K[i]):SSE_REGs); /* h += w_k */\ -__asm__ volatile("addl %%edx, %"#h"\n\t":::"%edx",SSE_REGs); /* h = h + w_k + Sigma1(e) */\ -__asm__ volatile("movl %"#a", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = a */\ -__asm__ volatile("roll $30, %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = a>>2 */\ -__asm__ volatile("movl %"#a", %%edi\n\t":::"%edi",SSE_REGs); /* edi = a */\ -__asm__ volatile("roll $19, %%edi\n\t":::"%edi",SSE_REGs); /* edi = a>>13 */\ -__asm__ volatile("movl %"#a", %%edx\n\t":::"%edx",SSE_REGs); /* edx = a */\ - -#define RND_STEP_5(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("roll $10, %%edx\n\t":::"%edx",SSE_REGs); /* edx = a>>22 */\ -__asm__ volatile("xorl %%r8d, %%edi\n\t":::"%edi","%r8",SSE_REGs); /* edi = (a>>2) ^ (a>>13) */\ -__asm__ volatile("xorl %%edi, %%edx\n\t":::"%edi","%edx",SSE_REGs);/* edx = Sigma0(a) */\ - -#define RND_STEP_6(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("movl %"#b", %%edi\n\t":::"%edi",SSE_REGs); /* edi = b */\ -__asm__ volatile("orl %"#a", %%edi\n\t":::"%edi",SSE_REGs); /* edi = a | b */\ -__asm__ volatile("andl %"#c", %%edi\n\t":::"%edi",SSE_REGs); /* edi = (a | b) & c */\ -__asm__ volatile("movl %"#b", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = b */\ - -#define RND_STEP_7(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("addl %%esi, %"#h"\n\t":::"%esi",SSE_REGs); /* h += Ch(e,f,g) */\ -__asm__ volatile("andl %"#a", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = b & a */\ -__asm__ volatile("orl %%edi, %%r8d\n\t":::"%edi","%r8",SSE_REGs); /* r8d = Maj(a,b,c) */\ - -#define RND_STEP_8(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("addl "#h", "#d"\n\t"); /* d += h + w_k + Sigma1(e) + Ch(e,f,g) */\ -__asm__ volatile("addl %"#h", %%r8d\n\t":::"%r8",SSE_REGs); \ - /* r8b = h + w_k + Sigma1(e) + Ch(e,f,g) + Maj(a,b,c) */\ -__asm__ volatile("addl %%edx, %%r8d\n\t":::"%edx","%r8",SSE_REGs);\ - /* r8b = h + w_k + Sigma1(e) Sigma0(a) + Ch(e,f,g) + Maj(a,b,c) */\ -__asm__ volatile("movl %%r8d, %"#h"\n\t":::"%r8", SSE_REGs); \ - /* h = h + w_k + Sigma1(e) + Sigma0(a) + Ch(e,f,g) + Maj(a,b,c) */ \ - -#define RND_X(a,b,c,d,e,f,g,h,i) \ - RND_STEP_1(a,b,c,d,e,f,g,h,i); \ - RND_STEP_2(a,b,c,d,e,f,g,h,i); \ - RND_STEP_3(a,b,c,d,e,f,g,h,i); \ - RND_STEP_4(a,b,c,d,e,f,g,h,i); \ - RND_STEP_5(a,b,c,d,e,f,g,h,i); \ - RND_STEP_6(a,b,c,d,e,f,g,h,i); \ - RND_STEP_7(a,b,c,d,e,f,g,h,i); \ - RND_STEP_8(a,b,c,d,e,f,g,h,i); - -#define RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i); -#define RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_7,S_0,S_1,S_2,S_3,S_4,S_5,S_6,_i); -#define RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_6,S_7,S_0,S_1,S_2,S_3,S_4,S_5,_i); -#define RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_5,S_6,S_7,S_0,S_1,S_2,S_3,S_4,_i); -#define RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,_i); -#define RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_3,S_4,S_5,S_6,S_7,S_0,S_1,S_2,_i); -#define RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_2,S_3,S_4,S_5,S_6,S_7,S_0,S_1,_i); -#define RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_0,_i); - - -#define RND_1_3(a,b,c,d,e,f,g,h,i) {\ - RND_STEP_1(a,b,c,d,e,f,g,h,i); \ - RND_STEP_2(a,b,c,d,e,f,g,h,i); \ - RND_STEP_3(a,b,c,d,e,f,g,h,i); \ -} - -#define RND_4_6(a,b,c,d,e,f,g,h,i) {\ - RND_STEP_4(a,b,c,d,e,f,g,h,i); \ - RND_STEP_5(a,b,c,d,e,f,g,h,i); \ - RND_STEP_6(a,b,c,d,e,f,g,h,i); \ -} - -#define RND_7_8(a,b,c,d,e,f,g,h,i) {\ - RND_STEP_7(a,b,c,d,e,f,g,h,i); \ - RND_STEP_8(a,b,c,d,e,f,g,h,i); \ -} - -#define RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i); -#define RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_7,S_0,S_1,S_2,S_3,S_4,S_5,S_6,_i); -#define RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_6,S_7,S_0,S_1,S_2,S_3,S_4,S_5,_i); -#define RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_5,S_6,S_7,S_0,S_1,S_2,S_3,S_4,_i); -#define RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,_i); -#define RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_3,S_4,S_5,S_6,S_7,S_0,S_1,S_2,_i); -#define RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_2,S_3,S_4,S_5,S_6,S_7,S_0,S_1,_i); -#define RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_0,_i); - - -#define RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i); -#define RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_7,S_0,S_1,S_2,S_3,S_4,S_5,S_6,_i); -#define RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_6,S_7,S_0,S_1,S_2,S_3,S_4,S_5,_i); -#define RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_5,S_6,S_7,S_0,S_1,S_2,S_3,S_4,_i); -#define RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,_i); -#define RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_3,S_4,S_5,S_6,S_7,S_0,S_1,S_2,_i); -#define RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_2,S_3,S_4,S_5,S_6,S_7,S_0,S_1,_i); -#define RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_0,_i); - -#define RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i); -#define RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_7,S_0,S_1,S_2,S_3,S_4,S_5,S_6,_i); -#define RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_6,S_7,S_0,S_1,S_2,S_3,S_4,S_5,_i); -#define RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_5,S_6,S_7,S_0,S_1,S_2,S_3,S_4,_i); -#define RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,_i); -#define RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_3,S_4,S_5,S_6,S_7,S_0,S_1,S_2,_i); -#define RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_2,S_3,S_4,S_5,S_6,S_7,S_0,S_1,_i); -#define RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_0,_i); - -#define RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i); -#define RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_7,S_0,S_1,S_2,S_3,S_4,S_5,S_6,_i); -#define RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_6,S_7,S_0,S_1,S_2,S_3,S_4,S_5,_i); -#define RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_5,S_6,S_7,S_0,S_1,S_2,S_3,S_4,_i); -#define RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,_i); -#define RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_3,S_4,S_5,S_6,S_7,S_0,S_1,S_2,_i); -#define RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_2,S_3,S_4,S_5,S_6,S_7,S_0,S_1,_i); -#define RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_0,_i); - -#define FOR(cnt, init, max, inc, loop) \ - __asm__ volatile("movl $"#init", %0\n\t"#loop":"::"m"(cnt):) -#define END(cnt, init, max, inc, loop) \ - __asm__ volatile("addl $"#inc", %0\n\tcmpl $"#max", %0\n\tjle "#loop"\n\t":"=m"(cnt)::) ; - -#endif /* defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) */ - -#if defined(HAVE_INTEL_AVX1) /* inline Assember for Intel AVX1 instructions */ - -#define VPALIGNR(op1,op2,op3,op4) __asm__ volatile("vpalignr $"#op4", %"#op3", %"#op2", %"#op1:::XMM_REGs) -#define VPADDD(op1,op2,op3) __asm__ volatile("vpaddd %"#op3", %"#op2", %"#op1:::XMM_REGs) -#define VPSRLD(op1,op2,op3) __asm__ volatile("vpsrld $"#op3", %"#op2", %"#op1:::XMM_REGs) -#define VPSRLQ(op1,op2,op3) __asm__ volatile("vpsrlq $"#op3", %"#op2", %"#op1:::XMM_REGs) -#define VPSLLD(op1,op2,op3) __asm__ volatile("vpslld $"#op3", %"#op2", %"#op1:::XMM_REGs) -#define VPOR(op1,op2,op3) __asm__ volatile("vpor %"#op3", %"#op2", %"#op1:::XMM_REGs) -#define VPXOR(op1,op2,op3) __asm__ volatile("vpxor %"#op3", %"#op2", %"#op1:::XMM_REGs) -#define VPSHUFD(op1,op2,op3) __asm__ volatile("vpshufd $"#op3", %"#op2", %"#op1:::XMM_REGs) -#define VPSHUFB(op1,op2,op3) __asm__ volatile("vpshufb %"#op3", %"#op2", %"#op1:::XMM_REGs) - -#define MessageSched(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, SHUF_00BA, SHUF_DC00,\ - a,b,c,d,e,f,g,h,_i)\ - RND_STEP_1(a,b,c,d,e,f,g,h,_i);\ - VPALIGNR (XTMP0, X3, X2, 4) ;\ - RND_STEP_2(a,b,c,d,e,f,g,h,_i);\ - VPADDD (XTMP0, XTMP0, X0) ;\ - RND_STEP_3(a,b,c,d,e,f,g,h,_i);\ - VPALIGNR (XTMP1, X1, X0, 4) ; /* XTMP1 = W[-15] */\ - RND_STEP_4(a,b,c,d,e,f,g,h,_i);\ - VPSRLD (XTMP2, XTMP1, 7) ;\ - RND_STEP_5(a,b,c,d,e,f,g,h,_i);\ - VPSLLD (XTMP3, XTMP1, 25) ; /* VPSLLD (XTMP3, XTMP1, (32-7)) */\ - RND_STEP_6(a,b,c,d,e,f,g,h,_i);\ - VPOR (XTMP3, XTMP3, XTMP2) ; /* XTMP1 = W[-15] MY_ROR 7 */\ - RND_STEP_7(a,b,c,d,e,f,g,h,_i);\ - VPSRLD (XTMP2, XTMP1,18) ;\ - RND_STEP_8(a,b,c,d,e,f,g,h,_i);\ -\ - RND_STEP_1(h,a,b,c,d,e,f,g,_i+1);\ - VPSRLD (XTMP4, XTMP1, 3) ; /* XTMP4 = W[-15] >> 3 */\ - RND_STEP_2(h,a,b,c,d,e,f,g,_i+1);\ - VPSLLD (XTMP1, XTMP1, 14) ; /* VPSLLD (XTMP1, XTMP1, (32-18)) */\ - RND_STEP_3(h,a,b,c,d,e,f,g,_i+1);\ - VPXOR (XTMP3, XTMP3, XTMP1) ;\ - RND_STEP_4(h,a,b,c,d,e,f,g,_i+1);\ - VPXOR (XTMP3, XTMP3, XTMP2) ; /* XTMP1 = W[-15] MY_ROR 7 ^ W[-15] MY_ROR 18 */\ - RND_STEP_5(h,a,b,c,d,e,f,g,_i+1);\ - VPXOR (XTMP1, XTMP3, XTMP4) ; /* XTMP1 = s0 */\ - RND_STEP_6(h,a,b,c,d,e,f,g,_i+1);\ - VPSHUFD(XTMP2, X3, 0b11111010) ; /* XTMP2 = W[-2] {BBAA}*/\ - RND_STEP_7(h,a,b,c,d,e,f,g,_i+1);\ - VPADDD (XTMP0, XTMP0, XTMP1) ; /* XTMP0 = W[-16] + W[-7] + s0 */\ - RND_STEP_8(h,a,b,c,d,e,f,g,_i+1);\ -\ - RND_STEP_1(g,h,a,b,c,d,e,f,_i+2);\ - VPSRLD (XTMP4, XTMP2, 10) ; /* XTMP4 = W[-2] >> 10 {BBAA} */\ - RND_STEP_2(g,h,a,b,c,d,e,f,_i+2);\ - VPSRLQ (XTMP3, XTMP2, 19) ; /* XTMP3 = W[-2] MY_ROR 19 {xBxA} */\ - RND_STEP_3(g,h,a,b,c,d,e,f,_i+2);\ - VPSRLQ (XTMP2, XTMP2, 17) ; /* XTMP2 = W[-2] MY_ROR 17 {xBxA} */\ - RND_STEP_4(g,h,a,b,c,d,e,f,_i+2);\ - VPXOR (XTMP2, XTMP2, XTMP3) ;\ - RND_STEP_5(g,h,a,b,c,d,e,f,_i+2);\ - VPXOR (XTMP4, XTMP4, XTMP2) ; /* XTMP4 = s1 {xBxA} */\ - RND_STEP_6(g,h,a,b,c,d,e,f,_i+2);\ - VPSHUFB (XTMP4, XTMP4, SHUF_00BA) ; /* XTMP4 = s1 {00BA} */\ - RND_STEP_7(g,h,a,b,c,d,e,f,_i+2);\ - VPADDD (XTMP0, XTMP0, XTMP4) ; /* XTMP0 = {..., ..., W[1], W[0]} */\ - RND_STEP_8(g,h,a,b,c,d,e,f,_i+2);\ -\ - RND_STEP_1(f,g,h,a,b,c,d,e,_i+3);\ - VPSHUFD (XTMP2, XTMP0, 0b01010000) ; /* XTMP2 = W[-2] {DDCC} */\ - RND_STEP_2(f,g,h,a,b,c,d,e,_i+3);\ - VPSRLD (XTMP5, XTMP2, 10); /* XTMP5 = W[-2] >> 10 {DDCC} */\ - RND_STEP_3(f,g,h,a,b,c,d,e,_i+3);\ - VPSRLQ (XTMP3, XTMP2, 19); /* XTMP3 = W[-2] MY_ROR 19 {xDxC} */\ - RND_STEP_4(f,g,h,a,b,c,d,e,_i+3);\ - VPSRLQ (XTMP2, XTMP2, 17) ; /* XTMP2 = W[-2] MY_ROR 17 {xDxC} */\ - RND_STEP_5(f,g,h,a,b,c,d,e,_i+3);\ - VPXOR (XTMP2, XTMP2, XTMP3) ;\ - RND_STEP_6(f,g,h,a,b,c,d,e,_i+3);\ - VPXOR (XTMP5, XTMP5, XTMP2) ; /* XTMP5 = s1 {xDxC} */\ - RND_STEP_7(f,g,h,a,b,c,d,e,_i+3);\ - VPSHUFB (XTMP5, XTMP5, SHUF_DC00) ; /* XTMP5 = s1 {DC00} */\ - RND_STEP_8(f,g,h,a,b,c,d,e,_i+3);\ - VPADDD (X0, XTMP5, XTMP0) ; /* X0 = {W[3], W[2], W[1], W[0]} */\ - -#if defined(HAVE_INTEL_RORX) - -#define MessageSched_RORX(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, \ - XFER, SHUF_00BA, SHUF_DC00,a,b,c,d,e,f,g,h,_i)\ - RND_STEP_RORX_1(a,b,c,d,e,f,g,h,_i);\ - VPALIGNR (XTMP0, X3, X2, 4) ;\ - RND_STEP_RORX_2(a,b,c,d,e,f,g,h,_i);\ - VPADDD (XTMP0, XTMP0, X0) ;\ - RND_STEP_RORX_3(a,b,c,d,e,f,g,h,_i);\ - VPALIGNR (XTMP1, X1, X0, 4) ; /* XTMP1 = W[-15] */\ - RND_STEP_RORX_4(a,b,c,d,e,f,g,h,_i);\ - VPSRLD (XTMP2, XTMP1, 7) ;\ - RND_STEP_RORX_5(a,b,c,d,e,f,g,h,_i);\ - VPSLLD (XTMP3, XTMP1, 25) ; /* VPSLLD (XTMP3, XTMP1, (32-7)) */\ - RND_STEP_RORX_6(a,b,c,d,e,f,g,h,_i);\ - VPOR (XTMP3, XTMP3, XTMP2) ; /* XTMP1 = W[-15] MY_ROR 7 */\ - RND_STEP_RORX_7(a,b,c,d,e,f,g,h,_i);\ - VPSRLD (XTMP2, XTMP1,18) ;\ - RND_STEP_RORX_8(a,b,c,d,e,f,g,h,_i);\ -\ - RND_STEP_RORX_1(h,a,b,c,d,e,f,g,_i+1);\ - VPSRLD (XTMP4, XTMP1, 3) ; /* XTMP4 = W[-15] >> 3 */\ - RND_STEP_RORX_2(h,a,b,c,d,e,f,g,_i+1);\ - VPSLLD (XTMP1, XTMP1, 14) ; /* VPSLLD (XTMP1, XTMP1, (32-18)) */\ - RND_STEP_RORX_3(h,a,b,c,d,e,f,g,_i+1);\ - VPXOR (XTMP3, XTMP3, XTMP1) ;\ - RND_STEP_RORX_4(h,a,b,c,d,e,f,g,_i+1);\ - VPXOR (XTMP3, XTMP3, XTMP2) ; /* XTMP1 = W[-15] MY_ROR 7 ^ W[-15] MY_ROR 18 */\ - RND_STEP_RORX_5(h,a,b,c,d,e,f,g,_i+1);\ - VPXOR (XTMP1, XTMP3, XTMP4) ; /* XTMP1 = s0 */\ - RND_STEP_RORX_6(h,a,b,c,d,e,f,g,_i+1);\ - VPSHUFD(XTMP2, X3, 0b11111010) ; /* XTMP2 = W[-2] {BBAA}*/\ - RND_STEP_RORX_7(h,a,b,c,d,e,f,g,_i+1);\ - VPADDD (XTMP0, XTMP0, XTMP1) ; /* XTMP0 = W[-16] + W[-7] + s0 */\ - RND_STEP_RORX_8(h,a,b,c,d,e,f,g,_i+1);\ -\ - RND_STEP_RORX_1(g,h,a,b,c,d,e,f,_i+2);\ - VPSRLD (XTMP4, XTMP2, 10) ; /* XTMP4 = W[-2] >> 10 {BBAA} */\ - RND_STEP_RORX_2(g,h,a,b,c,d,e,f,_i+2);\ - VPSRLQ (XTMP3, XTMP2, 19) ; /* XTMP3 = W[-2] MY_ROR 19 {xBxA} */\ - RND_STEP_RORX_3(g,h,a,b,c,d,e,f,_i+2);\ - VPSRLQ (XTMP2, XTMP2, 17) ; /* XTMP2 = W[-2] MY_ROR 17 {xBxA} */\ - RND_STEP_RORX_4(g,h,a,b,c,d,e,f,_i+2);\ - VPXOR (XTMP2, XTMP2, XTMP3) ;\ - RND_STEP_RORX_5(g,h,a,b,c,d,e,f,_i+2);\ - VPXOR (XTMP4, XTMP4, XTMP2) ; /* XTMP4 = s1 {xBxA} */\ - RND_STEP_RORX_6(g,h,a,b,c,d,e,f,_i+2);\ - VPSHUFB (XTMP4, XTMP4, SHUF_00BA) ; /* XTMP4 = s1 {00BA} */\ - RND_STEP_RORX_7(g,h,a,b,c,d,e,f,_i+2);\ - VPADDD (XTMP0, XTMP0, XTMP4) ; /* XTMP0 = {..., ..., W[1], W[0]} */\ - RND_STEP_RORX_8(g,h,a,b,c,d,e,f,_i+2);\ -\ - RND_STEP_RORX_1(f,g,h,a,b,c,d,e,_i+3);\ - VPSHUFD (XTMP2, XTMP0, 0b01010000) ; /* XTMP2 = W[-2] {DDCC} */\ - RND_STEP_RORX_2(f,g,h,a,b,c,d,e,_i+3);\ - VPSRLD (XTMP5, XTMP2, 10); /* XTMP5 = W[-2] >> 10 {DDCC} */\ - RND_STEP_RORX_3(f,g,h,a,b,c,d,e,_i+3);\ - VPSRLQ (XTMP3, XTMP2, 19); /* XTMP3 = W[-2] MY_ROR 19 {xDxC} */\ - RND_STEP_RORX_4(f,g,h,a,b,c,d,e,_i+3);\ - VPSRLQ (XTMP2, XTMP2, 17) ; /* XTMP2 = W[-2] MY_ROR 17 {xDxC} */\ - RND_STEP_RORX_5(f,g,h,a,b,c,d,e,_i+3);\ - VPXOR (XTMP2, XTMP2, XTMP3) ;\ - RND_STEP_RORX_6(f,g,h,a,b,c,d,e,_i+3);\ - VPXOR (XTMP5, XTMP5, XTMP2) ; /* XTMP5 = s1 {xDxC} */\ - RND_STEP_RORX_7(f,g,h,a,b,c,d,e,_i+3);\ - VPSHUFB (XTMP5, XTMP5, SHUF_DC00) ; /* XTMP5 = s1 {DC00} */\ - RND_STEP_RORX_8(f,g,h,a,b,c,d,e,_i+3);\ - VPADDD (X0, XTMP5, XTMP0) ; /* X0 = {W[3], W[2], W[1], W[0]} */\ - -#endif - - -#define W_K_from_buff\ - __asm__ volatile("vmovdqu %0, %%xmm4\n\t"\ - "vpshufb %%xmm13, %%xmm4, %%xmm4\n\t"\ - :: "m"(sha256->buffer[0]):"%xmm4") ;\ - __asm__ volatile("vmovdqu %0, %%xmm5\n\t"\ - "vpshufb %%xmm13, %%xmm5, %%xmm5\n\t"\ - ::"m"(sha256->buffer[4]):"%xmm5") ;\ - __asm__ volatile("vmovdqu %0, %%xmm6\n\t"\ - "vpshufb %%xmm13, %%xmm6, %%xmm6\n\t"\ - ::"m"(sha256->buffer[8]):"%xmm6") ;\ - __asm__ volatile("vmovdqu %0, %%xmm7\n\t"\ - "vpshufb %%xmm13, %%xmm7, %%xmm7\n\t"\ - ::"m"(sha256->buffer[12]):"%xmm7") ;\ - -#define _SET_W_K_XFER(reg, i)\ - __asm__ volatile("vpaddd %0, %"#reg", %%xmm9"::"m"(K[i]):XMM_REGs) ;\ - __asm__ volatile("vmovdqa %%xmm9, %0":"=m"(W_K[i])::XMM_REGs) ; - -#define SET_W_K_XFER(reg, i) _SET_W_K_XFER(reg, i) - -static const ALIGN32 word64 mSHUF_00BA[] = { 0x0b0a090803020100, 0xFFFFFFFFFFFFFFFF } ; /* shuffle xBxA -> 00BA */ -static const ALIGN32 word64 mSHUF_DC00[] = { 0xFFFFFFFFFFFFFFFF, 0x0b0a090803020100 } ; /* shuffle xDxC -> DC00 */ -static const ALIGN32 word64 mBYTE_FLIP_MASK[] = { 0x0405060700010203, 0x0c0d0e0f08090a0b } ; - - -#define _Init_Masks(mask1, mask2, mask3)\ -__asm__ volatile("vmovdqu %0, %"#mask1 ::"m"(mBYTE_FLIP_MASK[0])) ;\ -__asm__ volatile("vmovdqu %0, %"#mask2 ::"m"(mSHUF_00BA[0])) ;\ -__asm__ volatile("vmovdqu %0, %"#mask3 ::"m"(mSHUF_DC00[0])) ; - -#define Init_Masks(BYTE_FLIP_MASK, SHUF_00BA, SHUF_DC00)\ - _Init_Masks(BYTE_FLIP_MASK, SHUF_00BA, SHUF_DC00) - -#define X0 %xmm4 -#define X1 %xmm5 -#define X2 %xmm6 -#define X3 %xmm7 -#define X_ X0 - -#define XTMP0 %xmm0 -#define XTMP1 %xmm1 -#define XTMP2 %xmm2 -#define XTMP3 %xmm3 -#define XTMP4 %xmm8 -#define XTMP5 %xmm9 -#define XFER %xmm10 - -#define SHUF_00BA %xmm11 /* shuffle xBxA -> 00BA */ -#define SHUF_DC00 %xmm12 /* shuffle xDxC -> DC00 */ -#define BYTE_FLIP_MASK %xmm13 - -#define XMM_REGs /* Registers are saved in Sha256Update/Finel */ - /*"xmm4","xmm5","xmm6","xmm7","xmm8","xmm9","xmm10","xmm11","xmm12","xmm13" */ - -static int Transform_AVX1(Sha256* sha256) -{ - - word32 W_K[64] ; /* temp for W+K */ - - #if defined(DEBUG_XMM) - int i, j ; - word32 xmm[29][4*15] ; - #endif - - Init_Masks(BYTE_FLIP_MASK, SHUF_00BA, SHUF_DC00) ; - W_K_from_buff ; /* X0, X1, X2, X3 = W[0..15] ; */ - - DigestToReg(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; - - SET_W_K_XFER(X0, 0) ; - MessageSched(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,0) ; - SET_W_K_XFER(X1, 4) ; - MessageSched(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,4) ; - SET_W_K_XFER(X2, 8) ; - MessageSched(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,8) ; - SET_W_K_XFER(X3, 12) ; - MessageSched(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,12) ; - SET_W_K_XFER(X0, 16) ; - MessageSched(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,16) ; - SET_W_K_XFER(X1, 20) ; - MessageSched(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,20) ; - SET_W_K_XFER(X2, 24) ; - MessageSched(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,24) ; - SET_W_K_XFER(X3, 28) ; - MessageSched(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,28) ; - SET_W_K_XFER(X0, 32) ; - MessageSched(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,32) ; - SET_W_K_XFER(X1, 36) ; - MessageSched(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,36) ; - SET_W_K_XFER(X2, 40) ; - MessageSched(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,40) ; - SET_W_K_XFER(X3, 44) ; - MessageSched(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,44) ; - - SET_W_K_XFER(X0, 48) ; - SET_W_K_XFER(X1, 52) ; - SET_W_K_XFER(X2, 56) ; - SET_W_K_XFER(X3, 60) ; - - RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,48) ; - RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,49) ; - RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,50) ; - RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,51) ; - - RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,52) ; - RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,53) ; - RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,54) ; - RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,55) ; - - RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,56) ; - RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,57) ; - RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,58) ; - RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,59) ; - - RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,60) ; - RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,61) ; - RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,62) ; - RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,63) ; - - RegToDigest(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; - - #if defined(DEBUG_XMM) - for(i=0; i<29; i++) { - for(j=0; j<4*14; j+=4) - printf("xmm%d[%d]=%08x,%08x,%08x,%08x\n", j/4, i, - xmm[i][j],xmm[i][j+1],xmm[i][j+2],xmm[i][j+3]) ; - printf("\n") ; - } - - for(i=0; i<64; i++)printf("W_K[%d]%08x\n", i, W_K[i]) ; - #endif - - return 0; -} - -#if defined(HAVE_INTEL_RORX) -static int Transform_AVX1_RORX(Sha256* sha256) -{ - - word32 W_K[64] ; /* temp for W+K */ - - #if defined(DEBUG_XMM) - int i, j ; - word32 xmm[29][4*15] ; - #endif - - Init_Masks(BYTE_FLIP_MASK, SHUF_00BA, SHUF_DC00) ; - W_K_from_buff ; /* X0, X1, X2, X3 = W[0..15] ; */ - - DigestToReg(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; - SET_W_K_XFER(X0, 0) ; - MessageSched_RORX(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,0) ; - SET_W_K_XFER(X1, 4) ; - MessageSched_RORX(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,4) ; - SET_W_K_XFER(X2, 8) ; - MessageSched_RORX(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,8) ; - SET_W_K_XFER(X3, 12) ; - MessageSched_RORX(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,12) ; - SET_W_K_XFER(X0, 16) ; - MessageSched_RORX(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,16) ; - SET_W_K_XFER(X1, 20) ; - MessageSched_RORX(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,20) ; - SET_W_K_XFER(X2, 24) ; - MessageSched_RORX(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,24) ; - SET_W_K_XFER(X3, 28) ; - MessageSched_RORX(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,28) ; - SET_W_K_XFER(X0, 32) ; - MessageSched_RORX(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,32) ; - SET_W_K_XFER(X1, 36) ; - MessageSched_RORX(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,36) ; - SET_W_K_XFER(X2, 40) ; - MessageSched_RORX(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,40) ; - SET_W_K_XFER(X3, 44) ; - MessageSched_RORX(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,44) ; - - SET_W_K_XFER(X0, 48) ; - SET_W_K_XFER(X1, 52) ; - SET_W_K_XFER(X2, 56) ; - SET_W_K_XFER(X3, 60) ; - - RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,48) ; - RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,49) ; - RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,50) ; - RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,51) ; - - RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,52) ; - RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,53) ; - RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,54) ; - RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,55) ; - - RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,56) ; - RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,57) ; - RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,58) ; - RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,59) ; - - RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,60) ; - RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,61) ; - RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,62) ; - RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,63) ; - - RegToDigest(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; - - #if defined(DEBUG_XMM) - for(i=0; i<29; i++) { - for(j=0; j<4*14; j+=4) - printf("xmm%d[%d]=%08x,%08x,%08x,%08x\n", j/4, i, - xmm[i][j],xmm[i][j+1],xmm[i][j+2],xmm[i][j+3]) ; - printf("\n") ; - } - - for(i=0; i<64; i++)printf("W_K[%d]%08x\n", i, W_K[i]) ; - #endif - - return 0; -} -#endif /* HAVE_INTEL_RORX */ - -#endif /* HAVE_INTEL_AVX1 */ - - -#if defined(HAVE_INTEL_AVX2) - -#define _MOVE_to_REG(ymm, mem) __asm__ volatile("vmovdqu %0, %%"#ymm" ":: "m"(mem):YMM_REGs) ; -#define _MOVE_to_MEM(mem, ymm) __asm__ volatile("vmovdqu %%"#ymm", %0" : "=m"(mem)::YMM_REGs) ; -#define _BYTE_SWAP(ymm, map) __asm__ volatile("vpshufb %0, %%"#ymm", %%"#ymm"\n\t"\ - :: "m"(map):YMM_REGs) ; -#define _MOVE_128(ymm0, ymm1, ymm2, map) __asm__ volatile("vperm2i128 $"#map", %%"\ - #ymm2", %%"#ymm1", %%"#ymm0" ":::YMM_REGs) ; -#define _MOVE_BYTE(ymm0, ymm1, map) __asm__ volatile("vpshufb %0, %%"#ymm1", %%"\ - #ymm0"\n\t":: "m"(map):YMM_REGs) ; -#define _S_TEMP(dest, src, bits, temp) __asm__ volatile("vpsrld $"#bits", %%"\ - #src", %%"#dest"\n\tvpslld $32-"#bits", %%"#src", %%"#temp"\n\tvpor %%"\ - #temp",%%"#dest", %%"#dest" ":::YMM_REGs) ; -#define _AVX2_R(dest, src, bits) __asm__ volatile("vpsrld $"#bits", %%"\ - #src", %%"#dest" ":::YMM_REGs) ; -#define _XOR(dest, src1, src2) __asm__ volatile("vpxor %%"#src1", %%"\ - #src2", %%"#dest" ":::YMM_REGs) ; -#define _OR(dest, src1, src2) __asm__ volatile("vpor %%"#src1", %%"\ - #src2", %%"#dest" ":::YMM_REGs) ; -#define _ADD(dest, src1, src2) __asm__ volatile("vpaddd %%"#src1", %%"\ - #src2", %%"#dest" ":::YMM_REGs) ; -#define _ADD_MEM(dest, src1, mem) __asm__ volatile("vpaddd %0, %%"#src1", %%"\ - #dest" "::"m"(mem):YMM_REGs) ; -#define _BLEND(map, dest, src1, src2) __asm__ volatile("vpblendd $"#map", %%"\ - #src1", %%"#src2", %%"#dest" ":::YMM_REGs) ; - -#define _EXTRACT_XMM_0(xmm, mem) __asm__ volatile("vpextrd $0, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; -#define _EXTRACT_XMM_1(xmm, mem) __asm__ volatile("vpextrd $1, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; -#define _EXTRACT_XMM_2(xmm, mem) __asm__ volatile("vpextrd $2, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; -#define _EXTRACT_XMM_3(xmm, mem) __asm__ volatile("vpextrd $3, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; -#define _EXTRACT_XMM_4(ymm, xmm, mem)\ - __asm__ volatile("vperm2i128 $0x1, %%"#ymm", %%"#ymm", %%"#ymm" ":::YMM_REGs) ;\ - __asm__ volatile("vpextrd $0, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; -#define _EXTRACT_XMM_5(xmm, mem) __asm__ volatile("vpextrd $1, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; -#define _EXTRACT_XMM_6(xmm, mem) __asm__ volatile("vpextrd $2, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; -#define _EXTRACT_XMM_7(xmm, mem) __asm__ volatile("vpextrd $3, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; - -#define _SWAP_YMM_HL(ymm) __asm__ volatile("vperm2i128 $0x1, %%"#ymm", %%"#ymm", %%"#ymm" ":::YMM_REGs) ; -#define SWAP_YMM_HL(ymm) _SWAP_YMM_HL(ymm) - -#define MOVE_to_REG(ymm, mem) _MOVE_to_REG(ymm, mem) -#define MOVE_to_MEM(mem, ymm) _MOVE_to_MEM(mem, ymm) -#define BYTE_SWAP(ymm, map) _BYTE_SWAP(ymm, map) -#define MOVE_128(ymm0, ymm1, ymm2, map) _MOVE_128(ymm0, ymm1, ymm2, map) -#define MOVE_BYTE(ymm0, ymm1, map) _MOVE_BYTE(ymm0, ymm1, map) -#define XOR(dest, src1, src2) _XOR(dest, src1, src2) -#define OR(dest, src1, src2) _OR(dest, src1, src2) -#define ADD(dest, src1, src2) _ADD(dest, src1, src2) -#define ADD_MEM(dest, src1, mem) _ADD_MEM(dest, src1, mem) -#define BLEND(map, dest, src1, src2) _BLEND(map, dest, src1, src2) - -#define S_TMP(dest, src, bits, temp) _S_TEMP(dest, src, bits, temp); -#define AVX2_S(dest, src, bits) S_TMP(dest, src, bits, S_TEMP) -#define AVX2_R(dest, src, bits) _AVX2_R(dest, src, bits) - -#define GAMMA0(dest, src) AVX2_S(dest, src, 7); AVX2_S(G_TEMP, src, 18); \ - XOR(dest, G_TEMP, dest) ; AVX2_R(G_TEMP, src, 3); XOR(dest, G_TEMP, dest) ; -#define GAMMA0_1(dest, src) AVX2_S(dest, src, 7); AVX2_S(G_TEMP, src, 18); -#define GAMMA0_2(dest, src) XOR(dest, G_TEMP, dest) ; AVX2_R(G_TEMP, src, 3); \ - XOR(dest, G_TEMP, dest) ; - -#define GAMMA1(dest, src) AVX2_S(dest, src, 17); AVX2_S(G_TEMP, src, 19); \ - XOR(dest, G_TEMP, dest) ; AVX2_R(G_TEMP, src, 10); XOR(dest, G_TEMP, dest) ; -#define GAMMA1_1(dest, src) AVX2_S(dest, src, 17); AVX2_S(G_TEMP, src, 19); -#define GAMMA1_2(dest, src) XOR(dest, G_TEMP, dest) ; AVX2_R(G_TEMP, src, 10); \ - XOR(dest, G_TEMP, dest) ; - -#define FEEDBACK1_to_W_I_2 MOVE_BYTE(YMM_TEMP0, W_I, mMAP1toW_I_2[0]) ; \ - BLEND(0x0c, W_I_2, YMM_TEMP0, W_I_2) ; -#define FEEDBACK2_to_W_I_2 MOVE_128(YMM_TEMP0, W_I, W_I, 0x08) ; \ - MOVE_BYTE(YMM_TEMP0, YMM_TEMP0, mMAP2toW_I_2[0]) ; BLEND(0x30, W_I_2, YMM_TEMP0, W_I_2) ; -#define FEEDBACK3_to_W_I_2 MOVE_BYTE(YMM_TEMP0, W_I, mMAP3toW_I_2[0]) ; \ - BLEND(0xc0, W_I_2, YMM_TEMP0, W_I_2) ; - -#define FEEDBACK_to_W_I_7 MOVE_128(YMM_TEMP0, W_I, W_I, 0x08) ;\ - MOVE_BYTE(YMM_TEMP0, YMM_TEMP0, mMAPtoW_I_7[0]) ; BLEND(0x80, W_I_7, YMM_TEMP0, W_I_7) ; - -#undef voitle - -#define W_I_16 ymm8 -#define W_I_15 ymm9 -#define W_I_7 ymm10 -#define W_I_2 ymm11 -#define W_I ymm12 -#define G_TEMP ymm13 -#define S_TEMP ymm14 -#define YMM_TEMP0 ymm15 -#define YMM_TEMP0x xmm15 -#define W_I_TEMP ymm7 -#define W_K_TEMP ymm15 -#define W_K_TEMPx xmm15 - -#define YMM_REGs /* Registers are saved in Sha256Update/Finel */ - /* "%ymm7","%ymm8","%ymm9","%ymm10","%ymm11","%ymm12","%ymm13","%ymm14","%ymm15"*/ - - -#define MOVE_15_to_16(w_i_16, w_i_15, w_i_7)\ - __asm__ volatile("vperm2i128 $0x01, %%"#w_i_15", %%"#w_i_15", %%"#w_i_15" ":::YMM_REGs) ;\ - __asm__ volatile("vpblendd $0x08, %%"#w_i_15", %%"#w_i_7", %%"#w_i_16" ":::YMM_REGs) ;\ - __asm__ volatile("vperm2i128 $0x01, %%"#w_i_7", %%"#w_i_7", %%"#w_i_15" ":::YMM_REGs) ;\ - __asm__ volatile("vpblendd $0x80, %%"#w_i_15", %%"#w_i_16", %%"#w_i_16" ":::YMM_REGs) ;\ - __asm__ volatile("vpshufd $0x93, %%"#w_i_16", %%"#w_i_16" ":::YMM_REGs) ;\ - -#define MOVE_7_to_15(w_i_15, w_i_7)\ - __asm__ volatile("vmovdqu %%"#w_i_7", %%"#w_i_15" ":::YMM_REGs) ;\ - -#define MOVE_I_to_7(w_i_7, w_i)\ - __asm__ volatile("vperm2i128 $0x01, %%"#w_i", %%"#w_i", %%"#w_i_7" ":::YMM_REGs) ;\ - __asm__ volatile("vpblendd $0x01, %%"#w_i_7", %%"#w_i", %%"#w_i_7" ":::YMM_REGs) ;\ - __asm__ volatile("vpshufd $0x39, %%"#w_i_7", %%"#w_i_7" ":::YMM_REGs) ;\ - -#define MOVE_I_to_2(w_i_2, w_i)\ - __asm__ volatile("vperm2i128 $0x01, %%"#w_i", %%"#w_i", %%"#w_i_2" ":::YMM_REGs) ;\ - __asm__ volatile("vpshufd $0x0e, %%"#w_i_2", %%"#w_i_2" ":::YMM_REGs) ;\ - -#define ROTATE_W(w_i_16, w_i_15, w_i_7, w_i_2, w_i)\ - MOVE_15_to_16(w_i_16, w_i_15, w_i_7) ; \ - MOVE_7_to_15(w_i_15, w_i_7) ; \ - MOVE_I_to_7(w_i_7, w_i) ; \ - MOVE_I_to_2(w_i_2, w_i) ;\ - -#define _RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ - { word32 d ;\ - __asm__ volatile("movl %"#S_0", %0":"=r"(d)::SSE_REGs) ;\ - sha256->digest[0] += d;\ - __asm__ volatile("movl %"#S_1", %0":"=r"(d)::SSE_REGs) ;\ - sha256->digest[1] += d;\ - __asm__ volatile("movl %"#S_2", %0":"=r"(d)::SSE_REGs) ;\ - sha256->digest[2] += d;\ - __asm__ volatile("movl %"#S_3", %0":"=r"(d)::SSE_REGs) ;\ - sha256->digest[3] += d;\ - __asm__ volatile("movl %"#S_4", %0":"=r"(d)::SSE_REGs) ;\ - sha256->digest[4] += d;\ - __asm__ volatile("movl %"#S_5", %0":"=r"(d)::SSE_REGs) ;\ - sha256->digest[5] += d;\ - __asm__ volatile("movl %"#S_6", %0":"=r"(d)::SSE_REGs) ;\ - sha256->digest[6] += d;\ - __asm__ volatile("movl %"#S_7", %0":"=r"(d)::SSE_REGs) ;\ - sha256->digest[7] += d;\ -} - -#define _DumpS(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ - { word32 d[8] ;\ - __asm__ volatile("movl %"#S_0", %0":"=r"(d[0])::SSE_REGs) ;\ - __asm__ volatile("movl %"#S_1", %0":"=r"(d[1])::SSE_REGs) ;\ - __asm__ volatile("movl %"#S_2", %0":"=r"(d[2])::SSE_REGs) ;\ - __asm__ volatile("movl %"#S_3", %0":"=r"(d[3])::SSE_REGs) ;\ - __asm__ volatile("movl %"#S_4", %0":"=r"(d[4])::SSE_REGs) ;\ - __asm__ volatile("movl %"#S_5", %0":"=r"(d[5])::SSE_REGs) ;\ - __asm__ volatile("movl %"#S_6", %0":"=r"(d[6])::SSE_REGs) ;\ - __asm__ volatile("movl %"#S_7", %0":"=r"(d[7])::SSE_REGs) ;\ - printf("S[0..7]=%08x,%08x,%08x,%08x,%08x,%08x,%08x,%08x\n", d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7]);\ - __asm__ volatile("movl %0, %"#S_0::"r"(d[0]):SSE_REGs) ;\ - __asm__ volatile("movl %0, %"#S_1::"r"(d[1]):SSE_REGs) ;\ - __asm__ volatile("movl %0, %"#S_2::"r"(d[2]):SSE_REGs) ;\ - __asm__ volatile("movl %0, %"#S_3::"r"(d[3]):SSE_REGs) ;\ - __asm__ volatile("movl %0, %"#S_4::"r"(d[4]):SSE_REGs) ;\ - __asm__ volatile("movl %0, %"#S_5::"r"(d[5]):SSE_REGs) ;\ - __asm__ volatile("movl %0, %"#S_6::"r"(d[6]):SSE_REGs) ;\ - __asm__ volatile("movl %0, %"#S_7::"r"(d[7]):SSE_REGs) ;\ -} - - -#define DigestToReg(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ - _DigestToReg(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 ) - -#define RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ - _RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 ) - -#define DumS(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ - _DumpS(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 ) - - - /* Byte swap Masks to ensure that rest of the words are filled with zero's. */ - static const unsigned long mBYTE_FLIP_MASK_16[] = - { 0x0405060700010203, 0x0c0d0e0f08090a0b, 0x0405060700010203, 0x0c0d0e0f08090a0b } ; - static const unsigned long mBYTE_FLIP_MASK_15[] = - { 0x0405060700010203, 0x0c0d0e0f08090a0b, 0x0405060700010203, 0x0c0d0e0f08090a0b } ; - static const unsigned long mBYTE_FLIP_MASK_7 [] = - { 0x0405060700010203, 0x0c0d0e0f08090a0b, 0x0405060700010203, 0x8080808008090a0b } ; - static const unsigned long mBYTE_FLIP_MASK_2 [] = - { 0x0405060700010203, 0x8080808080808080, 0x8080808080808080, 0x8080808080808080 } ; - - static const unsigned long mMAPtoW_I_7[] = - { 0x8080808080808080, 0x8080808080808080, 0x8080808080808080, 0x0302010080808080 } ; - static const unsigned long mMAP1toW_I_2[] = - { 0x8080808080808080, 0x0706050403020100, 0x8080808080808080, 0x8080808080808080 } ; - static const unsigned long mMAP2toW_I_2[] = - { 0x8080808080808080, 0x8080808080808080, 0x0f0e0d0c0b0a0908, 0x8080808080808080 } ; - static const unsigned long mMAP3toW_I_2[] = - { 0x8080808080808080, 0x8080808080808080, 0x8080808080808080, 0x0706050403020100 } ; - -static int Transform_AVX2(Sha256* sha256) -{ - - #ifdef WOLFSSL_SMALL_STACK - word32* W_K; - W_K = (word32*) XMALLOC(sizeof(word32) * 64, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (W_K == NULL) - return MEMORY_E; - #else - word32 W_K[64] ; - #endif - - MOVE_to_REG(W_I_16, sha256->buffer[0]); BYTE_SWAP(W_I_16, mBYTE_FLIP_MASK_16[0]) ; - MOVE_to_REG(W_I_15, sha256->buffer[1]); BYTE_SWAP(W_I_15, mBYTE_FLIP_MASK_15[0]) ; - MOVE_to_REG(W_I, sha256->buffer[8]) ; BYTE_SWAP(W_I, mBYTE_FLIP_MASK_16[0]) ; - MOVE_to_REG(W_I_7, sha256->buffer[16-7]) ; BYTE_SWAP(W_I_7, mBYTE_FLIP_MASK_7[0]) ; - MOVE_to_REG(W_I_2, sha256->buffer[16-2]) ; BYTE_SWAP(W_I_2, mBYTE_FLIP_MASK_2[0]) ; - - DigestToReg(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; - - ADD_MEM(W_K_TEMP, W_I_16, K[0]) ; - MOVE_to_MEM(W_K[0], W_K_TEMP) ; - - RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,0) ; - RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,1) ; - RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,2) ; - RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,3) ; - RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,4) ; - RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,5) ; - RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,6) ; - RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,7) ; - - ADD_MEM(YMM_TEMP0, W_I, K[8]) ; - MOVE_to_MEM(W_K[8], YMM_TEMP0) ; - - /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ - RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,8) ; - GAMMA0_1(W_I_TEMP, W_I_15) ; - RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,8) ; - GAMMA0_2(W_I_TEMP, W_I_15) ; - RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,8) ; - ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ - RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,9) ; - ADD(W_I, W_I_7, W_I_TEMP); - RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,9) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,9) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,10) ; - ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ - RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,10) ; - FEEDBACK1_to_W_I_2 ; - RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,10) ; - FEEDBACK_to_W_I_7 ; - RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,11) ; - ADD(W_I_TEMP, W_I_7, W_I_TEMP); - RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,11) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,11) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,12) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ - RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,12) ; - FEEDBACK2_to_W_I_2 ; - RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,12) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,13) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,13) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ - RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,13) ; - FEEDBACK3_to_W_I_2 ; - RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,14) ; - GAMMA1(YMM_TEMP0, W_I_2) ; - RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,14) ; - RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,14) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ - RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,15) ; - - MOVE_to_REG(YMM_TEMP0, K[16]) ; - RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,15) ; - ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; - RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,15) ; - ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; - MOVE_to_MEM(W_K[16], YMM_TEMP0) ; - - /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ - RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,16) ; - GAMMA0_1(W_I_TEMP, W_I_15) ; - RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,16) ; - GAMMA0_2(W_I_TEMP, W_I_15) ; - RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,16) ; - ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ - RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,17) ; - ADD(W_I, W_I_7, W_I_TEMP); - RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,17) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,17) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,18) ; - ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ - RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,18) ; - FEEDBACK1_to_W_I_2 ; - RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,18) ; - FEEDBACK_to_W_I_7 ; - RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,19) ; - ADD(W_I_TEMP, W_I_7, W_I_TEMP); - RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,19) ; - GAMMA1(YMM_TEMP0, W_I_2) ; - RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,19) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,20) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ - RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,20) ; - FEEDBACK2_to_W_I_2 ; - RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,20) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,21) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,21) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ - RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,21) ; - FEEDBACK3_to_W_I_2 ; - RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,22) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,22) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,22) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ - RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,23) ; - - MOVE_to_REG(YMM_TEMP0, K[24]) ; - RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,23) ; - ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; - RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,23) ; - ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; - MOVE_to_MEM(W_K[24], YMM_TEMP0) ; - - /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ - RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,24) ; - GAMMA0_1(W_I_TEMP, W_I_15) ; - RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,24) ; - GAMMA0_2(W_I_TEMP, W_I_15) ; - RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,24) ; - ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ - RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,25) ; - ADD(W_I, W_I_7, W_I_TEMP); - RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,25) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,25) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,26) ; - ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ - RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,26) ; - FEEDBACK1_to_W_I_2 ; - RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,26) ; - FEEDBACK_to_W_I_7 ; - RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,27) ; - ADD(W_I_TEMP, W_I_7, W_I_TEMP); - RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,27) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,27) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,28) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ - RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,28) ; - FEEDBACK2_to_W_I_2 ; - RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,28) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,29) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,29) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ - RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,29) ; - FEEDBACK3_to_W_I_2 ; - RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,30) ; - GAMMA1(YMM_TEMP0, W_I_2) ; - RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,30) ; - RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,30) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ - RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,31) ; - - MOVE_to_REG(YMM_TEMP0, K[32]) ; - RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,31) ; - ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; - RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,31) ; - ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; - MOVE_to_MEM(W_K[32], YMM_TEMP0) ; - - - /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ - RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,32) ; - GAMMA0_1(W_I_TEMP, W_I_15) ; - RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,32) ; - GAMMA0_2(W_I_TEMP, W_I_15) ; - RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,32) ; - ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ - RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,33) ; - ADD(W_I, W_I_7, W_I_TEMP); - RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,33) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,33) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,34) ; - ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ - RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,34) ; - FEEDBACK1_to_W_I_2 ; - RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,34) ; - FEEDBACK_to_W_I_7 ; - RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,35) ; - ADD(W_I_TEMP, W_I_7, W_I_TEMP); - RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,35) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,35) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,36) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ - RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,36) ; - FEEDBACK2_to_W_I_2 ; - RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,36) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,37) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,37) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ - RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,37) ; - FEEDBACK3_to_W_I_2 ; - RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,38) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,38) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,38) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ - RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,39) ; - - MOVE_to_REG(YMM_TEMP0, K[40]) ; - RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,39) ; - ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; - RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,39) ; - ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; - MOVE_to_MEM(W_K[40], YMM_TEMP0) ; - - /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ - RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,40) ; - GAMMA0_1(W_I_TEMP, W_I_15) ; - RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,40) ; - GAMMA0_2(W_I_TEMP, W_I_15) ; - RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,40) ; - ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ - RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,41) ; - ADD(W_I, W_I_7, W_I_TEMP); - RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,41) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,41) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,42) ; - ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ - RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,42) ; - FEEDBACK1_to_W_I_2 ; - RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,42) ; - FEEDBACK_to_W_I_7 ; - RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,43) ; - ADD(W_I_TEMP, W_I_7, W_I_TEMP); - RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,43) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,43) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,44) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ - RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,44) ; - FEEDBACK2_to_W_I_2 ; - RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,44) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,45) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,45) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ - RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,45) ; - FEEDBACK3_to_W_I_2 ; - RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,46) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,46) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,46) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ - RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,47) ; - - MOVE_to_REG(YMM_TEMP0, K[48]) ; - RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,47) ; - ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; - RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,47) ; - ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; - MOVE_to_MEM(W_K[48], YMM_TEMP0) ; - - /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ - RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,48) ; - GAMMA0_1(W_I_TEMP, W_I_15) ; - RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,48) ; - GAMMA0_2(W_I_TEMP, W_I_15) ; - RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,48) ; - ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ - RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,49) ; - ADD(W_I, W_I_7, W_I_TEMP); - RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,49) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,49) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,50) ; - ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ - RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,50) ; - FEEDBACK1_to_W_I_2 ; - RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,50) ; - FEEDBACK_to_W_I_7 ; - RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,51) ; - ADD(W_I_TEMP, W_I_7, W_I_TEMP); - RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,51) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,51) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,52) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ - RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,52) ; - FEEDBACK2_to_W_I_2 ; - RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,52) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,53) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,53) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ - RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,53) ; - FEEDBACK3_to_W_I_2 ; - RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,54) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,54) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,54) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ - RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,55) ; - - MOVE_to_REG(YMM_TEMP0, K[56]) ; - RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,55) ; - ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; - RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,55) ; - ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; - MOVE_to_MEM(W_K[56], YMM_TEMP0) ; - - RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,56) ; - RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,57) ; - RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,58) ; - RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,59) ; - - RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,60) ; - RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,61) ; - RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,62) ; - RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,63) ; - - RegToDigest(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; - - #ifdef WOLFSSL_SMALL_STACK - XFREE(W, NULL, DYNAMIC_TYPE_TMP_BUFFER); - #endif - - return 0; -} - -#endif /* HAVE_INTEL_AVX2 */ -#endif /* HAVE_FIPS */ - -#endif /* NO_SHA256 */ - +/* sha256.c + * + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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. + * + * wolfSSL 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 + */ + +/* code submitted by raphael.huck@efixo.com */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include + +#if !defined(NO_SHA256) +#ifdef HAVE_FIPS + +int wc_InitSha256(Sha256* sha) +{ + return InitSha256_fips(sha); +} + + +int wc_Sha256Update(Sha256* sha, const byte* data, word32 len) +{ + return Sha256Update_fips(sha, data, len); +} + + +int wc_Sha256Final(Sha256* sha, byte* out) +{ + return Sha256Final_fips(sha, out); +} + + +int wc_Sha256Hash(const byte* data, word32 len, byte* out) +{ + return Sha256Hash(data, len, out); +} + +#else /* else build without fips */ + +#if !defined(NO_SHA256) && !defined(WOLFSSL_TI_HASH) + /* defined in port/ti/ti_sha256.c */ + +#if !defined (ALIGN32) + #if defined (__GNUC__) + #define ALIGN32 __attribute__ ( (aligned (32))) + #elif defined(_MSC_VER) + /* disable align warning, we want alignment ! */ + #pragma warning(disable: 4324) + #define ALIGN32 __declspec (align (32)) + #else + #define ALIGN32 + #endif +#endif + +#ifdef WOLFSSL_PIC32MZ_HASH +#define wc_InitSha256 wc_InitSha256_sw +#define wc_Sha256Update wc_Sha256Update_sw +#define wc_Sha256Final wc_Sha256Final_sw +#endif + +#ifdef HAVE_FIPS + /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ + #define FIPS_NO_WRAPPERS +#endif + +#if defined(USE_INTEL_SPEEDUP) +#define HAVE_INTEL_AVX1 +#define HAVE_INTEL_AVX2 + +#if defined(DEBUG_XMM) +#include "stdio.h" +#endif + +#endif + +#if defined(HAVE_INTEL_AVX2) +#define HAVE_INTEL_RORX +#endif + + +/***** +Intel AVX1/AVX2 Macro Control Structure + +#define HAVE_INTEL_AVX1 +#define HAVE_INTEL_AVX2 + +#define HAVE_INTEL_RORX + + +int InitSha256(Sha256* sha256) { + Save/Recover XMM, YMM + ... +} + +#if defined(HAVE_INTEL_AVX1)|| defined(HAVE_INTEL_AVX2) + Transform() ; Function prototype +#else + Transform() { } + int Sha256Final() { + Save/Recover XMM, YMM + ... + } +#endif + +#if defined(HAVE_INTEL_AVX1)|| defined(HAVE_INTEL_AVX2) + #if defined(HAVE_INTEL_RORX + #define RND with rorx instuction + #else + #define RND + #endif +#endif + +#if defined(HAVE_INTEL_AVX1) + + #define XMM Instructions/inline asm + + int Transform() { + Stitched Message Sched/Round + } + +#elif defined(HAVE_INTEL_AVX2) + + #define YMM Instructions/inline asm + + int Transform() { + More granural Stitched Message Sched/Round + } + +*/ + + +#if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) + +/* Each platform needs to query info type 1 from cpuid to see if aesni is + * supported. Also, let's setup a macro for proper linkage w/o ABI conflicts + */ + +#ifndef _MSC_VER + #define cpuid(reg, leaf, sub)\ + __asm__ __volatile__ ("cpuid":\ + "=a" (reg[0]), "=b" (reg[1]), "=c" (reg[2]), "=d" (reg[3]) :\ + "a" (leaf), "c"(sub)); + + #define XASM_LINK(f) asm(f) +#else + + #include + #define cpuid(a,b) __cpuid((int*)a,b) + + #define XASM_LINK(f) + +#endif /* _MSC_VER */ + +#define EAX 0 +#define EBX 1 +#define ECX 2 +#define EDX 3 + +#define CPUID_AVX1 0x1 +#define CPUID_AVX2 0x2 +#define CPUID_RDRAND 0x4 +#define CPUID_RDSEED 0x8 +#define CPUID_BMI2 0x10 /* MULX, RORX */ + +#define IS_INTEL_AVX1 (cpuid_flags&CPUID_AVX1) +#define IS_INTEL_AVX2 (cpuid_flags&CPUID_AVX2) +#define IS_INTEL_BMI2 (cpuid_flags&CPUID_BMI2) +#define IS_INTEL_RDRAND (cpuid_flags&CPUID_RDRAND) +#define IS_INTEL_RDSEED (cpuid_flags&CPUID_RDSEED) + +static word32 cpuid_check = 0 ; +static word32 cpuid_flags = 0 ; + +static word32 cpuid_flag(word32 leaf, word32 sub, word32 num, word32 bit) { + int got_intel_cpu=0; + unsigned int reg[5]; + + reg[4] = '\0' ; + cpuid(reg, 0, 0); + if(memcmp((char *)&(reg[EBX]), "Genu", 4) == 0 && + memcmp((char *)&(reg[EDX]), "ineI", 4) == 0 && + memcmp((char *)&(reg[ECX]), "ntel", 4) == 0) { + got_intel_cpu = 1; + } + if (got_intel_cpu) { + cpuid(reg, leaf, sub); + return((reg[num]>>bit)&0x1) ; + } + return 0 ; +} + +static int set_cpuid_flags(void) { + if(cpuid_check==0) { + if(cpuid_flag(1, 0, ECX, 28)){ cpuid_flags |= CPUID_AVX1 ;} + if(cpuid_flag(7, 0, EBX, 5)){ cpuid_flags |= CPUID_AVX2 ; } + if(cpuid_flag(7, 0, EBX, 8)) { cpuid_flags |= CPUID_BMI2 ; } + if(cpuid_flag(1, 0, ECX, 30)){ cpuid_flags |= CPUID_RDRAND ; } + if(cpuid_flag(7, 0, EBX, 18)){ cpuid_flags |= CPUID_RDSEED ; } + cpuid_check = 1 ; + return 0 ; + } + return 1 ; +} + + +/* #if defined(HAVE_INTEL_AVX1/2) at the tail of sha512 */ +static int Transform(Sha256* sha256); + +#if defined(HAVE_INTEL_AVX1) +static int Transform_AVX1(Sha256 *sha256) ; +#endif +#if defined(HAVE_INTEL_AVX2) +static int Transform_AVX2(Sha256 *sha256) ; +static int Transform_AVX1_RORX(Sha256 *sha256) ; +#endif + +static int (*Transform_p)(Sha256* sha256) /* = _Transform */; + +#define XTRANSFORM(sha256, B) (*Transform_p)(sha256) + +static void set_Transform(void) { + if(set_cpuid_flags())return ; + +#if defined(HAVE_INTEL_AVX2) + if(IS_INTEL_AVX2 && IS_INTEL_BMI2){ + Transform_p = Transform_AVX1_RORX; return ; + Transform_p = Transform_AVX2 ; + /* for avoiding warning,"not used" */ + } +#endif +#if defined(HAVE_INTEL_AVX1) + Transform_p = ((IS_INTEL_AVX1) ? Transform_AVX1 : Transform) ; return ; +#endif + Transform_p = Transform ; return ; +} + +#else + #if defined(FREESCALE_MMCAU) + #define XTRANSFORM(sha256, B) Transform(sha256, B) + #else + #define XTRANSFORM(sha256, B) Transform(sha256) + #endif +#endif + +/* Dummy for saving MM_REGs on behalf of Transform */ +#if defined(HAVE_INTEL_AVX2)&& !defined(HAVE_INTEL_AVX1) +#define SAVE_XMM_YMM __asm__ volatile("or %%r8d, %%r8d":::\ + "%ymm4","%ymm5","%ymm6","%ymm7","%ymm8","%ymm9","%ymm10","%ymm11","%ymm12","%ymm13","%ymm14","%ymm15") +#elif defined(HAVE_INTEL_AVX1) +#define SAVE_XMM_YMM __asm__ volatile("or %%r8d, %%r8d":::\ + "xmm0","xmm1","xmm2","xmm3","xmm4","xmm5","xmm6","xmm7","xmm8","xmm9","xmm10",\ + "xmm11","xmm12","xmm13","xmm14","xmm15") +#else +#define SAVE_XMM_YMM +#endif + +#ifdef WOLFSSL_PIC32MZ_HASH +#define InitSha256 InitSha256_sw +#define Sha256Update Sha256Update_sw +#define Sha256Final Sha256Final_sw +#endif + +#include +#include + +#ifdef NO_INLINE + #include +#else + #include +#endif + +#ifdef FREESCALE_MMCAU + #include "cau_api.h" +#endif + +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN + + static INLINE word32 min(word32 a, word32 b) + { + return a > b ? b : a; + } + +#endif /* WOLFSSL_HAVE_MIN */ + + +int wc_InitSha256(Sha256* sha256) +{ + #ifdef FREESCALE_MMCAU + cau_sha256_initialize_output(sha256->digest); + #else + sha256->digest[0] = 0x6A09E667L; + sha256->digest[1] = 0xBB67AE85L; + sha256->digest[2] = 0x3C6EF372L; + sha256->digest[3] = 0xA54FF53AL; + sha256->digest[4] = 0x510E527FL; + sha256->digest[5] = 0x9B05688CL; + sha256->digest[6] = 0x1F83D9ABL; + sha256->digest[7] = 0x5BE0CD19L; + #endif + + sha256->buffLen = 0; + sha256->loLen = 0; + sha256->hiLen = 0; + +#if defined(HAVE_INTEL_AVX1)|| defined(HAVE_INTEL_AVX2) + set_Transform() ; /* choose best Transform function under this runtime environment */ +#endif + + return 0; +} + + +#if !defined(FREESCALE_MMCAU) +static const ALIGN32 word32 K[64] = { + 0x428A2F98L, 0x71374491L, 0xB5C0FBCFL, 0xE9B5DBA5L, 0x3956C25BL, + 0x59F111F1L, 0x923F82A4L, 0xAB1C5ED5L, 0xD807AA98L, 0x12835B01L, + 0x243185BEL, 0x550C7DC3L, 0x72BE5D74L, 0x80DEB1FEL, 0x9BDC06A7L, + 0xC19BF174L, 0xE49B69C1L, 0xEFBE4786L, 0x0FC19DC6L, 0x240CA1CCL, + 0x2DE92C6FL, 0x4A7484AAL, 0x5CB0A9DCL, 0x76F988DAL, 0x983E5152L, + 0xA831C66DL, 0xB00327C8L, 0xBF597FC7L, 0xC6E00BF3L, 0xD5A79147L, + 0x06CA6351L, 0x14292967L, 0x27B70A85L, 0x2E1B2138L, 0x4D2C6DFCL, + 0x53380D13L, 0x650A7354L, 0x766A0ABBL, 0x81C2C92EL, 0x92722C85L, + 0xA2BFE8A1L, 0xA81A664BL, 0xC24B8B70L, 0xC76C51A3L, 0xD192E819L, + 0xD6990624L, 0xF40E3585L, 0x106AA070L, 0x19A4C116L, 0x1E376C08L, + 0x2748774CL, 0x34B0BCB5L, 0x391C0CB3L, 0x4ED8AA4AL, 0x5B9CCA4FL, + 0x682E6FF3L, 0x748F82EEL, 0x78A5636FL, 0x84C87814L, 0x8CC70208L, + 0x90BEFFFAL, 0xA4506CEBL, 0xBEF9A3F7L, 0xC67178F2L +}; + +#endif + +#if defined(FREESCALE_MMCAU) + +static int Transform(Sha256* sha256, byte* buf) +{ + cau_sha256_hash_n(buf, 1, sha256->digest); + + return 0; +} + +#endif /* FREESCALE_MMCAU */ + +#define Ch(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) +#define Maj(x,y,z) ((((x) | (y)) & (z)) | ((x) & (y))) +#define R(x, n) (((x)&0xFFFFFFFFU)>>(n)) + +#define S(x, n) rotrFixed(x, n) +#define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22)) +#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25)) +#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3)) +#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10)) + +#define RND(a,b,c,d,e,f,g,h,i) \ + t0 = (h) + Sigma1((e)) + Ch((e), (f), (g)) + K[(i)] + W[(i)]; \ + t1 = Sigma0((a)) + Maj((a), (b), (c)); \ + (d) += t0; \ + (h) = t0 + t1; + +#if !defined(FREESCALE_MMCAU) +static int Transform(Sha256* sha256) +{ + word32 S[8], t0, t1; + int i; + +#ifdef WOLFSSL_SMALL_STACK + word32* W; + + W = (word32*) XMALLOC(sizeof(word32) * 64, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (W == NULL) + return MEMORY_E; +#else + word32 W[64]; +#endif + + /* Copy context->state[] to working vars */ + for (i = 0; i < 8; i++) + S[i] = sha256->digest[i]; + + for (i = 0; i < 16; i++) + W[i] = sha256->buffer[i]; + + for (i = 16; i < 64; i++) + W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15]) + W[i-16]; + + for (i = 0; i < 64; i += 8) { + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],i+0); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],i+1); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],i+2); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],i+3); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],i+4); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],i+5); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],i+6); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],i+7); + } + + /* Add the working vars back into digest state[] */ + for (i = 0; i < 8; i++) { + sha256->digest[i] += S[i]; + } + +#ifdef WOLFSSL_SMALL_STACK + XFREE(W, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return 0; +} + +#endif /* #if !defined(FREESCALE_MMCAU) */ + +static INLINE void AddLength(Sha256* sha256, word32 len) +{ + word32 tmp = sha256->loLen; + if ( (sha256->loLen += len) < tmp) + sha256->hiLen++; /* carry low to high */ +} + +int wc_Sha256Update(Sha256* sha256, const byte* data, word32 len) +{ + + /* do block size increments */ + byte* local = (byte*)sha256->buffer; + + SAVE_XMM_YMM ; /* for Intel AVX */ + + while (len) { + word32 add = min(len, SHA256_BLOCK_SIZE - sha256->buffLen); + XMEMCPY(&local[sha256->buffLen], data, add); + + sha256->buffLen += add; + data += add; + len -= add; + + if (sha256->buffLen == SHA256_BLOCK_SIZE) { + int ret; + + #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) + #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) + if(!IS_INTEL_AVX1 && !IS_INTEL_AVX2) + #endif + ByteReverseWords(sha256->buffer, sha256->buffer, + SHA256_BLOCK_SIZE); + #endif + ret = XTRANSFORM(sha256, local); + if (ret != 0) + return ret; + + AddLength(sha256, SHA256_BLOCK_SIZE); + sha256->buffLen = 0; + } + } + + return 0; +} + +int wc_Sha256Final(Sha256* sha256, byte* hash) +{ + byte* local = (byte*)sha256->buffer; + int ret; + + SAVE_XMM_YMM ; /* for Intel AVX */ + + AddLength(sha256, sha256->buffLen); /* before adding pads */ + + local[sha256->buffLen++] = 0x80; /* add 1 */ + + /* pad with zeros */ + if (sha256->buffLen > SHA256_PAD_SIZE) { + XMEMSET(&local[sha256->buffLen], 0, SHA256_BLOCK_SIZE - sha256->buffLen); + sha256->buffLen += SHA256_BLOCK_SIZE - sha256->buffLen; + + #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) + #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) + if(!IS_INTEL_AVX1 && !IS_INTEL_AVX2) + #endif + ByteReverseWords(sha256->buffer, sha256->buffer, SHA256_BLOCK_SIZE); + #endif + + ret = XTRANSFORM(sha256, local); + if (ret != 0) + return ret; + + sha256->buffLen = 0; + } + XMEMSET(&local[sha256->buffLen], 0, SHA256_PAD_SIZE - sha256->buffLen); + + /* put lengths in bits */ + sha256->hiLen = (sha256->loLen >> (8*sizeof(sha256->loLen) - 3)) + + (sha256->hiLen << 3); + sha256->loLen = sha256->loLen << 3; + + /* store lengths */ + #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) + #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) + if(!IS_INTEL_AVX1 && !IS_INTEL_AVX2) + #endif + ByteReverseWords(sha256->buffer, sha256->buffer, SHA256_BLOCK_SIZE); + #endif + /* ! length ordering dependent on digest endian type ! */ + XMEMCPY(&local[SHA256_PAD_SIZE], &sha256->hiLen, sizeof(word32)); + XMEMCPY(&local[SHA256_PAD_SIZE + sizeof(word32)], &sha256->loLen, + sizeof(word32)); + + #if defined(FREESCALE_MMCAU) || defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) + /* Kinetis requires only these bytes reversed */ + #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) + if(IS_INTEL_AVX1 || IS_INTEL_AVX2) + #endif + ByteReverseWords(&sha256->buffer[SHA256_PAD_SIZE/sizeof(word32)], + &sha256->buffer[SHA256_PAD_SIZE/sizeof(word32)], + 2 * sizeof(word32)); + #endif + + ret = XTRANSFORM(sha256, local); + if (ret != 0) + return ret; + + #if defined(LITTLE_ENDIAN_ORDER) + ByteReverseWords(sha256->digest, sha256->digest, SHA256_DIGEST_SIZE); + #endif + XMEMCPY(hash, sha256->digest, SHA256_DIGEST_SIZE); + + return wc_InitSha256(sha256); /* reset state */ +} + + + +int wc_Sha256Hash(const byte* data, word32 len, byte* hash) +{ + int ret = 0; +#ifdef WOLFSSL_SMALL_STACK + Sha256* sha256; +#else + Sha256 sha256[1]; +#endif + +#ifdef WOLFSSL_SMALL_STACK + sha256 = (Sha256*)XMALLOC(sizeof(Sha256), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (sha256 == NULL) + return MEMORY_E; +#endif + + if ((ret = wc_InitSha256(sha256)) != 0) { + WOLFSSL_MSG("InitSha256 failed"); + } + else if ((ret = wc_Sha256Update(sha256, data, len)) != 0) { + WOLFSSL_MSG("Sha256Update failed"); + } + else if ((ret = wc_Sha256Final(sha256, hash)) != 0) { + WOLFSSL_MSG("Sha256Final failed"); + } + +#ifdef WOLFSSL_SMALL_STACK + XFREE(sha256, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return ret; +} + +#ifdef WOLFSSL_TI_HASH +#include "wolfssl/wolfcrypt/port/ti/ti-hash.h" +#endif +int wc_Sha256GetHash(Sha256* sha256, byte* hash) +{ +#if defined(WOLFSS_TI_HASH) + return wc_Sha256GetHash_TI(sha256, hash) ; +#else + int ret ; + Sha256 save = *sha256 ; + ret = wc_Sha256Final(sha256, hash) ; + *sha256 = save ; + return ret ; +#endif +} + +#if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) + +#define _DigestToReg(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ + { word32 d ;\ + d = sha256->digest[0]; __asm__ volatile("movl %0, %"#S_0::"r"(d):SSE_REGs) ;\ + d = sha256->digest[1]; __asm__ volatile("movl %0, %"#S_1::"r"(d):SSE_REGs) ;\ + d = sha256->digest[2]; __asm__ volatile("movl %0, %"#S_2::"r"(d):SSE_REGs) ;\ + d = sha256->digest[3]; __asm__ volatile("movl %0, %"#S_3::"r"(d):SSE_REGs) ;\ + d = sha256->digest[4]; __asm__ volatile("movl %0, %"#S_4::"r"(d):SSE_REGs) ;\ + d = sha256->digest[5]; __asm__ volatile("movl %0, %"#S_5::"r"(d):SSE_REGs) ;\ + d = sha256->digest[6]; __asm__ volatile("movl %0, %"#S_6::"r"(d):SSE_REGs) ;\ + d = sha256->digest[7]; __asm__ volatile("movl %0, %"#S_7::"r"(d):SSE_REGs) ;\ +} + +#define _RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ + { word32 d ; \ + __asm__ volatile("movl %"#S_0", %0":"=r"(d)::SSE_REGs) ; sha256->digest[0] += d;\ + __asm__ volatile("movl %"#S_1", %0":"=r"(d)::SSE_REGs) ; sha256->digest[1] += d;\ + __asm__ volatile("movl %"#S_2", %0":"=r"(d)::SSE_REGs) ; sha256->digest[2] += d;\ + __asm__ volatile("movl %"#S_3", %0":"=r"(d)::SSE_REGs) ; sha256->digest[3] += d;\ + __asm__ volatile("movl %"#S_4", %0":"=r"(d)::SSE_REGs) ; sha256->digest[4] += d;\ + __asm__ volatile("movl %"#S_5", %0":"=r"(d)::SSE_REGs) ; sha256->digest[5] += d;\ + __asm__ volatile("movl %"#S_6", %0":"=r"(d)::SSE_REGs) ; sha256->digest[6] += d;\ + __asm__ volatile("movl %"#S_7", %0":"=r"(d)::SSE_REGs) ; sha256->digest[7] += d;\ +} + + +#define DigestToReg(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ + _DigestToReg(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 ) + +#define RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ + _RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 ) + + + + +#define S_0 %r15d +#define S_1 %r10d +#define S_2 %r11d +#define S_3 %r12d +#define S_4 %r13d +#define S_5 %r14d +#define S_6 %ebx +#define S_7 %r9d + +#define SSE_REGs "%edi", "%ecx", "%esi", "%edx", "%ebx","%r8","%r9","%r10","%r11","%r12","%r13","%r14","%r15" + +#if defined(HAVE_INTEL_RORX) +#define RND_STEP_RORX_1(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("rorx $6, %"#e", %%edx\n\t":::"%edx",SSE_REGs); /* edx = e>>6 */\ + +#define RND_STEP_RORX_2(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("rorx $11, %"#e",%%edi\n\t":::"%edi",SSE_REGs); /* edi = e>>11 */\ +__asm__ volatile("xorl %%edx, %%edi\n\t":::"%edx","%edi",SSE_REGs); /* edi = (e>>11) ^ (e>>6) */\ +__asm__ volatile("rorx $25, %"#e", %%edx\n\t":::"%edx",SSE_REGs); /* edx = e>>25 */\ + +#define RND_STEP_RORX_3(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("movl %"#f", %%esi\n\t":::"%esi",SSE_REGs); /* esi = f */\ +__asm__ volatile("xorl %"#g", %%esi\n\t":::"%esi",SSE_REGs); /* esi = f ^ g */\ +__asm__ volatile("xorl %%edi, %%edx\n\t":::"%edi","%edx",SSE_REGs); /* edx = Sigma1(e) */\ +__asm__ volatile("andl %"#e", %%esi\n\t":::"%esi",SSE_REGs); /* esi = (f ^ g) & e */\ +__asm__ volatile("xorl %"#g", %%esi\n\t":::"%esi",SSE_REGs); /* esi = Ch(e,f,g) */\ + +#define RND_STEP_RORX_4(a,b,c,d,e,f,g,h,i)\ +/*__asm__ volatile("movl %0, %%edx\n\t"::"m"(w_k):"%edx");*/\ +__asm__ volatile("addl %0, %"#h"\n\t"::"r"(W_K[i]):SSE_REGs); /* h += w_k */\ +__asm__ volatile("addl %%edx, %"#h"\n\t":::"%edx",SSE_REGs); /* h = h + w_k + Sigma1(e) */\ +__asm__ volatile("rorx $2, %"#a", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = a>>2 */\ +__asm__ volatile("rorx $13, %"#a", %%edi\n\t":::"%edi",SSE_REGs);/* edi = a>>13 */\ + +#define RND_STEP_RORX_5(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("rorx $22, %"#a", %%edx\n\t":::"%edx",SSE_REGs); /* edx = a>>22 */\ +__asm__ volatile("xorl %%r8d, %%edi\n\t":::"%edi","%r8",SSE_REGs);/* edi = (a>>2) ^ (a>>13) */\ +__asm__ volatile("xorl %%edi, %%edx\n\t":::"%edi","%edx",SSE_REGs); /* edx = Sigma0(a) */\ + +#define RND_STEP_RORX_6(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("movl %"#b", %%edi\n\t":::"%edi",SSE_REGs); /* edi = b */\ +__asm__ volatile("orl %"#a", %%edi\n\t":::"%edi",SSE_REGs); /* edi = a | b */\ +__asm__ volatile("andl %"#c", %%edi\n\t":::"%edi",SSE_REGs); /* edi = (a | b) & c*/\ +__asm__ volatile("movl %"#b", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = b */\ + +#define RND_STEP_RORX_7(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("addl %%esi, %"#h"\n\t":::"%esi",SSE_REGs); /* h += Ch(e,f,g) */\ +__asm__ volatile("andl %"#a", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = b & a */\ +__asm__ volatile("orl %%edi, %%r8d\n\t":::"%edi","%r8",SSE_REGs); /* r8d = Maj(a,b,c) */\ + +#define RND_STEP_RORX_8(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("addl "#h", "#d"\n\t"); /* d += h + w_k + Sigma1(e) + Ch(e,f,g) */\ +__asm__ volatile("addl %"#h", %%r8d\n\t":::"%r8",SSE_REGs); \ +__asm__ volatile("addl %%edx, %%r8d\n\t":::"%edx","%r8",SSE_REGs); \ +__asm__ volatile("movl %r8d, "#h"\n\t"); + +#endif + +#define RND_STEP_1(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("movl %"#e", %%edx\n\t":::"%edx",SSE_REGs);\ +__asm__ volatile("roll $26, %%edx\n\t":::"%edx",SSE_REGs); /* edx = e>>6 */\ +__asm__ volatile("movl %"#e", %%edi\n\t":::"%edi",SSE_REGs);\ + +#define RND_STEP_2(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("roll $21, %%edi\n\t":::"%edi",SSE_REGs); /* edi = e>>11 */\ +__asm__ volatile("xorl %%edx, %%edi\n\t":::"%edx","%edi",SSE_REGs); /* edi = (e>>11) ^ (e>>6) */\ +__asm__ volatile("movl %"#e", %%edx\n\t":::"%edx",SSE_REGs); /* edx = e */\ +__asm__ volatile("roll $7, %%edx\n\t":::"%edx",SSE_REGs); /* edx = e>>25 */\ + +#define RND_STEP_3(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("movl %"#f", %%esi\n\t":::"%esi",SSE_REGs); /* esi = f */\ +__asm__ volatile("xorl %"#g", %%esi\n\t":::"%esi",SSE_REGs); /* esi = f ^ g */\ +__asm__ volatile("xorl %%edi, %%edx\n\t":::"%edi","%edx",SSE_REGs); /* edx = Sigma1(e) */\ +__asm__ volatile("andl %"#e", %%esi\n\t":::"%esi",SSE_REGs); /* esi = (f ^ g) & e */\ +__asm__ volatile("xorl %"#g", %%esi\n\t":::"%esi",SSE_REGs); /* esi = Ch(e,f,g) */\ + +#define RND_STEP_4(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("addl %0, %"#h"\n\t"::"r"(W_K[i]):SSE_REGs); /* h += w_k */\ +__asm__ volatile("addl %%edx, %"#h"\n\t":::"%edx",SSE_REGs); /* h = h + w_k + Sigma1(e) */\ +__asm__ volatile("movl %"#a", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = a */\ +__asm__ volatile("roll $30, %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = a>>2 */\ +__asm__ volatile("movl %"#a", %%edi\n\t":::"%edi",SSE_REGs); /* edi = a */\ +__asm__ volatile("roll $19, %%edi\n\t":::"%edi",SSE_REGs); /* edi = a>>13 */\ +__asm__ volatile("movl %"#a", %%edx\n\t":::"%edx",SSE_REGs); /* edx = a */\ + +#define RND_STEP_5(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("roll $10, %%edx\n\t":::"%edx",SSE_REGs); /* edx = a>>22 */\ +__asm__ volatile("xorl %%r8d, %%edi\n\t":::"%edi","%r8",SSE_REGs); /* edi = (a>>2) ^ (a>>13) */\ +__asm__ volatile("xorl %%edi, %%edx\n\t":::"%edi","%edx",SSE_REGs);/* edx = Sigma0(a) */\ + +#define RND_STEP_6(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("movl %"#b", %%edi\n\t":::"%edi",SSE_REGs); /* edi = b */\ +__asm__ volatile("orl %"#a", %%edi\n\t":::"%edi",SSE_REGs); /* edi = a | b */\ +__asm__ volatile("andl %"#c", %%edi\n\t":::"%edi",SSE_REGs); /* edi = (a | b) & c */\ +__asm__ volatile("movl %"#b", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = b */\ + +#define RND_STEP_7(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("addl %%esi, %"#h"\n\t":::"%esi",SSE_REGs); /* h += Ch(e,f,g) */\ +__asm__ volatile("andl %"#a", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = b & a */\ +__asm__ volatile("orl %%edi, %%r8d\n\t":::"%edi","%r8",SSE_REGs); /* r8d = Maj(a,b,c) */\ + +#define RND_STEP_8(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("addl "#h", "#d"\n\t"); /* d += h + w_k + Sigma1(e) + Ch(e,f,g) */\ +__asm__ volatile("addl %"#h", %%r8d\n\t":::"%r8",SSE_REGs); \ + /* r8b = h + w_k + Sigma1(e) + Ch(e,f,g) + Maj(a,b,c) */\ +__asm__ volatile("addl %%edx, %%r8d\n\t":::"%edx","%r8",SSE_REGs);\ + /* r8b = h + w_k + Sigma1(e) Sigma0(a) + Ch(e,f,g) + Maj(a,b,c) */\ +__asm__ volatile("movl %%r8d, %"#h"\n\t":::"%r8", SSE_REGs); \ + /* h = h + w_k + Sigma1(e) + Sigma0(a) + Ch(e,f,g) + Maj(a,b,c) */ \ + +#define RND_X(a,b,c,d,e,f,g,h,i) \ + RND_STEP_1(a,b,c,d,e,f,g,h,i); \ + RND_STEP_2(a,b,c,d,e,f,g,h,i); \ + RND_STEP_3(a,b,c,d,e,f,g,h,i); \ + RND_STEP_4(a,b,c,d,e,f,g,h,i); \ + RND_STEP_5(a,b,c,d,e,f,g,h,i); \ + RND_STEP_6(a,b,c,d,e,f,g,h,i); \ + RND_STEP_7(a,b,c,d,e,f,g,h,i); \ + RND_STEP_8(a,b,c,d,e,f,g,h,i); + +#define RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i); +#define RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_7,S_0,S_1,S_2,S_3,S_4,S_5,S_6,_i); +#define RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_6,S_7,S_0,S_1,S_2,S_3,S_4,S_5,_i); +#define RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_5,S_6,S_7,S_0,S_1,S_2,S_3,S_4,_i); +#define RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,_i); +#define RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_3,S_4,S_5,S_6,S_7,S_0,S_1,S_2,_i); +#define RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_2,S_3,S_4,S_5,S_6,S_7,S_0,S_1,_i); +#define RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_0,_i); + + +#define RND_1_3(a,b,c,d,e,f,g,h,i) {\ + RND_STEP_1(a,b,c,d,e,f,g,h,i); \ + RND_STEP_2(a,b,c,d,e,f,g,h,i); \ + RND_STEP_3(a,b,c,d,e,f,g,h,i); \ +} + +#define RND_4_6(a,b,c,d,e,f,g,h,i) {\ + RND_STEP_4(a,b,c,d,e,f,g,h,i); \ + RND_STEP_5(a,b,c,d,e,f,g,h,i); \ + RND_STEP_6(a,b,c,d,e,f,g,h,i); \ +} + +#define RND_7_8(a,b,c,d,e,f,g,h,i) {\ + RND_STEP_7(a,b,c,d,e,f,g,h,i); \ + RND_STEP_8(a,b,c,d,e,f,g,h,i); \ +} + +#define RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i); +#define RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_7,S_0,S_1,S_2,S_3,S_4,S_5,S_6,_i); +#define RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_6,S_7,S_0,S_1,S_2,S_3,S_4,S_5,_i); +#define RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_5,S_6,S_7,S_0,S_1,S_2,S_3,S_4,_i); +#define RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,_i); +#define RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_3,S_4,S_5,S_6,S_7,S_0,S_1,S_2,_i); +#define RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_2,S_3,S_4,S_5,S_6,S_7,S_0,S_1,_i); +#define RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_0,_i); + + +#define RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i); +#define RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_7,S_0,S_1,S_2,S_3,S_4,S_5,S_6,_i); +#define RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_6,S_7,S_0,S_1,S_2,S_3,S_4,S_5,_i); +#define RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_5,S_6,S_7,S_0,S_1,S_2,S_3,S_4,_i); +#define RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,_i); +#define RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_3,S_4,S_5,S_6,S_7,S_0,S_1,S_2,_i); +#define RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_2,S_3,S_4,S_5,S_6,S_7,S_0,S_1,_i); +#define RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_0,_i); + +#define RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i); +#define RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_7,S_0,S_1,S_2,S_3,S_4,S_5,S_6,_i); +#define RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_6,S_7,S_0,S_1,S_2,S_3,S_4,S_5,_i); +#define RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_5,S_6,S_7,S_0,S_1,S_2,S_3,S_4,_i); +#define RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,_i); +#define RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_3,S_4,S_5,S_6,S_7,S_0,S_1,S_2,_i); +#define RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_2,S_3,S_4,S_5,S_6,S_7,S_0,S_1,_i); +#define RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_0,_i); + +#define RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i); +#define RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_7,S_0,S_1,S_2,S_3,S_4,S_5,S_6,_i); +#define RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_6,S_7,S_0,S_1,S_2,S_3,S_4,S_5,_i); +#define RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_5,S_6,S_7,S_0,S_1,S_2,S_3,S_4,_i); +#define RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,_i); +#define RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_3,S_4,S_5,S_6,S_7,S_0,S_1,S_2,_i); +#define RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_2,S_3,S_4,S_5,S_6,S_7,S_0,S_1,_i); +#define RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_0,_i); + +#define FOR(cnt, init, max, inc, loop) \ + __asm__ volatile("movl $"#init", %0\n\t"#loop":"::"m"(cnt):) +#define END(cnt, init, max, inc, loop) \ + __asm__ volatile("addl $"#inc", %0\n\tcmpl $"#max", %0\n\tjle "#loop"\n\t":"=m"(cnt)::) ; + +#endif /* defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) */ + +#if defined(HAVE_INTEL_AVX1) /* inline Assember for Intel AVX1 instructions */ + +#define VPALIGNR(op1,op2,op3,op4) __asm__ volatile("vpalignr $"#op4", %"#op3", %"#op2", %"#op1:::XMM_REGs) +#define VPADDD(op1,op2,op3) __asm__ volatile("vpaddd %"#op3", %"#op2", %"#op1:::XMM_REGs) +#define VPSRLD(op1,op2,op3) __asm__ volatile("vpsrld $"#op3", %"#op2", %"#op1:::XMM_REGs) +#define VPSRLQ(op1,op2,op3) __asm__ volatile("vpsrlq $"#op3", %"#op2", %"#op1:::XMM_REGs) +#define VPSLLD(op1,op2,op3) __asm__ volatile("vpslld $"#op3", %"#op2", %"#op1:::XMM_REGs) +#define VPOR(op1,op2,op3) __asm__ volatile("vpor %"#op3", %"#op2", %"#op1:::XMM_REGs) +#define VPXOR(op1,op2,op3) __asm__ volatile("vpxor %"#op3", %"#op2", %"#op1:::XMM_REGs) +#define VPSHUFD(op1,op2,op3) __asm__ volatile("vpshufd $"#op3", %"#op2", %"#op1:::XMM_REGs) +#define VPSHUFB(op1,op2,op3) __asm__ volatile("vpshufb %"#op3", %"#op2", %"#op1:::XMM_REGs) + +#define MessageSched(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, SHUF_00BA, SHUF_DC00,\ + a,b,c,d,e,f,g,h,_i)\ + RND_STEP_1(a,b,c,d,e,f,g,h,_i);\ + VPALIGNR (XTMP0, X3, X2, 4) ;\ + RND_STEP_2(a,b,c,d,e,f,g,h,_i);\ + VPADDD (XTMP0, XTMP0, X0) ;\ + RND_STEP_3(a,b,c,d,e,f,g,h,_i);\ + VPALIGNR (XTMP1, X1, X0, 4) ; /* XTMP1 = W[-15] */\ + RND_STEP_4(a,b,c,d,e,f,g,h,_i);\ + VPSRLD (XTMP2, XTMP1, 7) ;\ + RND_STEP_5(a,b,c,d,e,f,g,h,_i);\ + VPSLLD (XTMP3, XTMP1, 25) ; /* VPSLLD (XTMP3, XTMP1, (32-7)) */\ + RND_STEP_6(a,b,c,d,e,f,g,h,_i);\ + VPOR (XTMP3, XTMP3, XTMP2) ; /* XTMP1 = W[-15] MY_ROR 7 */\ + RND_STEP_7(a,b,c,d,e,f,g,h,_i);\ + VPSRLD (XTMP2, XTMP1,18) ;\ + RND_STEP_8(a,b,c,d,e,f,g,h,_i);\ +\ + RND_STEP_1(h,a,b,c,d,e,f,g,_i+1);\ + VPSRLD (XTMP4, XTMP1, 3) ; /* XTMP4 = W[-15] >> 3 */\ + RND_STEP_2(h,a,b,c,d,e,f,g,_i+1);\ + VPSLLD (XTMP1, XTMP1, 14) ; /* VPSLLD (XTMP1, XTMP1, (32-18)) */\ + RND_STEP_3(h,a,b,c,d,e,f,g,_i+1);\ + VPXOR (XTMP3, XTMP3, XTMP1) ;\ + RND_STEP_4(h,a,b,c,d,e,f,g,_i+1);\ + VPXOR (XTMP3, XTMP3, XTMP2) ; /* XTMP1 = W[-15] MY_ROR 7 ^ W[-15] MY_ROR 18 */\ + RND_STEP_5(h,a,b,c,d,e,f,g,_i+1);\ + VPXOR (XTMP1, XTMP3, XTMP4) ; /* XTMP1 = s0 */\ + RND_STEP_6(h,a,b,c,d,e,f,g,_i+1);\ + VPSHUFD(XTMP2, X3, 0b11111010) ; /* XTMP2 = W[-2] {BBAA}*/\ + RND_STEP_7(h,a,b,c,d,e,f,g,_i+1);\ + VPADDD (XTMP0, XTMP0, XTMP1) ; /* XTMP0 = W[-16] + W[-7] + s0 */\ + RND_STEP_8(h,a,b,c,d,e,f,g,_i+1);\ +\ + RND_STEP_1(g,h,a,b,c,d,e,f,_i+2);\ + VPSRLD (XTMP4, XTMP2, 10) ; /* XTMP4 = W[-2] >> 10 {BBAA} */\ + RND_STEP_2(g,h,a,b,c,d,e,f,_i+2);\ + VPSRLQ (XTMP3, XTMP2, 19) ; /* XTMP3 = W[-2] MY_ROR 19 {xBxA} */\ + RND_STEP_3(g,h,a,b,c,d,e,f,_i+2);\ + VPSRLQ (XTMP2, XTMP2, 17) ; /* XTMP2 = W[-2] MY_ROR 17 {xBxA} */\ + RND_STEP_4(g,h,a,b,c,d,e,f,_i+2);\ + VPXOR (XTMP2, XTMP2, XTMP3) ;\ + RND_STEP_5(g,h,a,b,c,d,e,f,_i+2);\ + VPXOR (XTMP4, XTMP4, XTMP2) ; /* XTMP4 = s1 {xBxA} */\ + RND_STEP_6(g,h,a,b,c,d,e,f,_i+2);\ + VPSHUFB (XTMP4, XTMP4, SHUF_00BA) ; /* XTMP4 = s1 {00BA} */\ + RND_STEP_7(g,h,a,b,c,d,e,f,_i+2);\ + VPADDD (XTMP0, XTMP0, XTMP4) ; /* XTMP0 = {..., ..., W[1], W[0]} */\ + RND_STEP_8(g,h,a,b,c,d,e,f,_i+2);\ +\ + RND_STEP_1(f,g,h,a,b,c,d,e,_i+3);\ + VPSHUFD (XTMP2, XTMP0, 0b01010000) ; /* XTMP2 = W[-2] {DDCC} */\ + RND_STEP_2(f,g,h,a,b,c,d,e,_i+3);\ + VPSRLD (XTMP5, XTMP2, 10); /* XTMP5 = W[-2] >> 10 {DDCC} */\ + RND_STEP_3(f,g,h,a,b,c,d,e,_i+3);\ + VPSRLQ (XTMP3, XTMP2, 19); /* XTMP3 = W[-2] MY_ROR 19 {xDxC} */\ + RND_STEP_4(f,g,h,a,b,c,d,e,_i+3);\ + VPSRLQ (XTMP2, XTMP2, 17) ; /* XTMP2 = W[-2] MY_ROR 17 {xDxC} */\ + RND_STEP_5(f,g,h,a,b,c,d,e,_i+3);\ + VPXOR (XTMP2, XTMP2, XTMP3) ;\ + RND_STEP_6(f,g,h,a,b,c,d,e,_i+3);\ + VPXOR (XTMP5, XTMP5, XTMP2) ; /* XTMP5 = s1 {xDxC} */\ + RND_STEP_7(f,g,h,a,b,c,d,e,_i+3);\ + VPSHUFB (XTMP5, XTMP5, SHUF_DC00) ; /* XTMP5 = s1 {DC00} */\ + RND_STEP_8(f,g,h,a,b,c,d,e,_i+3);\ + VPADDD (X0, XTMP5, XTMP0) ; /* X0 = {W[3], W[2], W[1], W[0]} */\ + +#if defined(HAVE_INTEL_RORX) + +#define MessageSched_RORX(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, \ + XFER, SHUF_00BA, SHUF_DC00,a,b,c,d,e,f,g,h,_i)\ + RND_STEP_RORX_1(a,b,c,d,e,f,g,h,_i);\ + VPALIGNR (XTMP0, X3, X2, 4) ;\ + RND_STEP_RORX_2(a,b,c,d,e,f,g,h,_i);\ + VPADDD (XTMP0, XTMP0, X0) ;\ + RND_STEP_RORX_3(a,b,c,d,e,f,g,h,_i);\ + VPALIGNR (XTMP1, X1, X0, 4) ; /* XTMP1 = W[-15] */\ + RND_STEP_RORX_4(a,b,c,d,e,f,g,h,_i);\ + VPSRLD (XTMP2, XTMP1, 7) ;\ + RND_STEP_RORX_5(a,b,c,d,e,f,g,h,_i);\ + VPSLLD (XTMP3, XTMP1, 25) ; /* VPSLLD (XTMP3, XTMP1, (32-7)) */\ + RND_STEP_RORX_6(a,b,c,d,e,f,g,h,_i);\ + VPOR (XTMP3, XTMP3, XTMP2) ; /* XTMP1 = W[-15] MY_ROR 7 */\ + RND_STEP_RORX_7(a,b,c,d,e,f,g,h,_i);\ + VPSRLD (XTMP2, XTMP1,18) ;\ + RND_STEP_RORX_8(a,b,c,d,e,f,g,h,_i);\ +\ + RND_STEP_RORX_1(h,a,b,c,d,e,f,g,_i+1);\ + VPSRLD (XTMP4, XTMP1, 3) ; /* XTMP4 = W[-15] >> 3 */\ + RND_STEP_RORX_2(h,a,b,c,d,e,f,g,_i+1);\ + VPSLLD (XTMP1, XTMP1, 14) ; /* VPSLLD (XTMP1, XTMP1, (32-18)) */\ + RND_STEP_RORX_3(h,a,b,c,d,e,f,g,_i+1);\ + VPXOR (XTMP3, XTMP3, XTMP1) ;\ + RND_STEP_RORX_4(h,a,b,c,d,e,f,g,_i+1);\ + VPXOR (XTMP3, XTMP3, XTMP2) ; /* XTMP1 = W[-15] MY_ROR 7 ^ W[-15] MY_ROR 18 */\ + RND_STEP_RORX_5(h,a,b,c,d,e,f,g,_i+1);\ + VPXOR (XTMP1, XTMP3, XTMP4) ; /* XTMP1 = s0 */\ + RND_STEP_RORX_6(h,a,b,c,d,e,f,g,_i+1);\ + VPSHUFD(XTMP2, X3, 0b11111010) ; /* XTMP2 = W[-2] {BBAA}*/\ + RND_STEP_RORX_7(h,a,b,c,d,e,f,g,_i+1);\ + VPADDD (XTMP0, XTMP0, XTMP1) ; /* XTMP0 = W[-16] + W[-7] + s0 */\ + RND_STEP_RORX_8(h,a,b,c,d,e,f,g,_i+1);\ +\ + RND_STEP_RORX_1(g,h,a,b,c,d,e,f,_i+2);\ + VPSRLD (XTMP4, XTMP2, 10) ; /* XTMP4 = W[-2] >> 10 {BBAA} */\ + RND_STEP_RORX_2(g,h,a,b,c,d,e,f,_i+2);\ + VPSRLQ (XTMP3, XTMP2, 19) ; /* XTMP3 = W[-2] MY_ROR 19 {xBxA} */\ + RND_STEP_RORX_3(g,h,a,b,c,d,e,f,_i+2);\ + VPSRLQ (XTMP2, XTMP2, 17) ; /* XTMP2 = W[-2] MY_ROR 17 {xBxA} */\ + RND_STEP_RORX_4(g,h,a,b,c,d,e,f,_i+2);\ + VPXOR (XTMP2, XTMP2, XTMP3) ;\ + RND_STEP_RORX_5(g,h,a,b,c,d,e,f,_i+2);\ + VPXOR (XTMP4, XTMP4, XTMP2) ; /* XTMP4 = s1 {xBxA} */\ + RND_STEP_RORX_6(g,h,a,b,c,d,e,f,_i+2);\ + VPSHUFB (XTMP4, XTMP4, SHUF_00BA) ; /* XTMP4 = s1 {00BA} */\ + RND_STEP_RORX_7(g,h,a,b,c,d,e,f,_i+2);\ + VPADDD (XTMP0, XTMP0, XTMP4) ; /* XTMP0 = {..., ..., W[1], W[0]} */\ + RND_STEP_RORX_8(g,h,a,b,c,d,e,f,_i+2);\ +\ + RND_STEP_RORX_1(f,g,h,a,b,c,d,e,_i+3);\ + VPSHUFD (XTMP2, XTMP0, 0b01010000) ; /* XTMP2 = W[-2] {DDCC} */\ + RND_STEP_RORX_2(f,g,h,a,b,c,d,e,_i+3);\ + VPSRLD (XTMP5, XTMP2, 10); /* XTMP5 = W[-2] >> 10 {DDCC} */\ + RND_STEP_RORX_3(f,g,h,a,b,c,d,e,_i+3);\ + VPSRLQ (XTMP3, XTMP2, 19); /* XTMP3 = W[-2] MY_ROR 19 {xDxC} */\ + RND_STEP_RORX_4(f,g,h,a,b,c,d,e,_i+3);\ + VPSRLQ (XTMP2, XTMP2, 17) ; /* XTMP2 = W[-2] MY_ROR 17 {xDxC} */\ + RND_STEP_RORX_5(f,g,h,a,b,c,d,e,_i+3);\ + VPXOR (XTMP2, XTMP2, XTMP3) ;\ + RND_STEP_RORX_6(f,g,h,a,b,c,d,e,_i+3);\ + VPXOR (XTMP5, XTMP5, XTMP2) ; /* XTMP5 = s1 {xDxC} */\ + RND_STEP_RORX_7(f,g,h,a,b,c,d,e,_i+3);\ + VPSHUFB (XTMP5, XTMP5, SHUF_DC00) ; /* XTMP5 = s1 {DC00} */\ + RND_STEP_RORX_8(f,g,h,a,b,c,d,e,_i+3);\ + VPADDD (X0, XTMP5, XTMP0) ; /* X0 = {W[3], W[2], W[1], W[0]} */\ + +#endif + + +#define W_K_from_buff\ + __asm__ volatile("vmovdqu %0, %%xmm4\n\t"\ + "vpshufb %%xmm13, %%xmm4, %%xmm4\n\t"\ + :: "m"(sha256->buffer[0]):"%xmm4") ;\ + __asm__ volatile("vmovdqu %0, %%xmm5\n\t"\ + "vpshufb %%xmm13, %%xmm5, %%xmm5\n\t"\ + ::"m"(sha256->buffer[4]):"%xmm5") ;\ + __asm__ volatile("vmovdqu %0, %%xmm6\n\t"\ + "vpshufb %%xmm13, %%xmm6, %%xmm6\n\t"\ + ::"m"(sha256->buffer[8]):"%xmm6") ;\ + __asm__ volatile("vmovdqu %0, %%xmm7\n\t"\ + "vpshufb %%xmm13, %%xmm7, %%xmm7\n\t"\ + ::"m"(sha256->buffer[12]):"%xmm7") ;\ + +#define _SET_W_K_XFER(reg, i)\ + __asm__ volatile("vpaddd %0, %"#reg", %%xmm9"::"m"(K[i]):XMM_REGs) ;\ + __asm__ volatile("vmovdqa %%xmm9, %0":"=m"(W_K[i])::XMM_REGs) ; + +#define SET_W_K_XFER(reg, i) _SET_W_K_XFER(reg, i) + +static const ALIGN32 word64 mSHUF_00BA[] = { 0x0b0a090803020100, 0xFFFFFFFFFFFFFFFF } ; /* shuffle xBxA -> 00BA */ +static const ALIGN32 word64 mSHUF_DC00[] = { 0xFFFFFFFFFFFFFFFF, 0x0b0a090803020100 } ; /* shuffle xDxC -> DC00 */ +static const ALIGN32 word64 mBYTE_FLIP_MASK[] = { 0x0405060700010203, 0x0c0d0e0f08090a0b } ; + + +#define _Init_Masks(mask1, mask2, mask3)\ +__asm__ volatile("vmovdqu %0, %"#mask1 ::"m"(mBYTE_FLIP_MASK[0])) ;\ +__asm__ volatile("vmovdqu %0, %"#mask2 ::"m"(mSHUF_00BA[0])) ;\ +__asm__ volatile("vmovdqu %0, %"#mask3 ::"m"(mSHUF_DC00[0])) ; + +#define Init_Masks(BYTE_FLIP_MASK, SHUF_00BA, SHUF_DC00)\ + _Init_Masks(BYTE_FLIP_MASK, SHUF_00BA, SHUF_DC00) + +#define X0 %xmm4 +#define X1 %xmm5 +#define X2 %xmm6 +#define X3 %xmm7 +#define X_ X0 + +#define XTMP0 %xmm0 +#define XTMP1 %xmm1 +#define XTMP2 %xmm2 +#define XTMP3 %xmm3 +#define XTMP4 %xmm8 +#define XTMP5 %xmm9 +#define XFER %xmm10 + +#define SHUF_00BA %xmm11 /* shuffle xBxA -> 00BA */ +#define SHUF_DC00 %xmm12 /* shuffle xDxC -> DC00 */ +#define BYTE_FLIP_MASK %xmm13 + +#define XMM_REGs /* Registers are saved in Sha256Update/Finel */ + /*"xmm4","xmm5","xmm6","xmm7","xmm8","xmm9","xmm10","xmm11","xmm12","xmm13" */ + +static int Transform_AVX1(Sha256* sha256) +{ + + word32 W_K[64] ; /* temp for W+K */ + + #if defined(DEBUG_XMM) + int i, j ; + word32 xmm[29][4*15] ; + #endif + + Init_Masks(BYTE_FLIP_MASK, SHUF_00BA, SHUF_DC00) ; + W_K_from_buff ; /* X0, X1, X2, X3 = W[0..15] ; */ + + DigestToReg(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; + + SET_W_K_XFER(X0, 0) ; + MessageSched(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,0) ; + SET_W_K_XFER(X1, 4) ; + MessageSched(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,4) ; + SET_W_K_XFER(X2, 8) ; + MessageSched(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,8) ; + SET_W_K_XFER(X3, 12) ; + MessageSched(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,12) ; + SET_W_K_XFER(X0, 16) ; + MessageSched(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,16) ; + SET_W_K_XFER(X1, 20) ; + MessageSched(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,20) ; + SET_W_K_XFER(X2, 24) ; + MessageSched(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,24) ; + SET_W_K_XFER(X3, 28) ; + MessageSched(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,28) ; + SET_W_K_XFER(X0, 32) ; + MessageSched(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,32) ; + SET_W_K_XFER(X1, 36) ; + MessageSched(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,36) ; + SET_W_K_XFER(X2, 40) ; + MessageSched(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,40) ; + SET_W_K_XFER(X3, 44) ; + MessageSched(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,44) ; + + SET_W_K_XFER(X0, 48) ; + SET_W_K_XFER(X1, 52) ; + SET_W_K_XFER(X2, 56) ; + SET_W_K_XFER(X3, 60) ; + + RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,48) ; + RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,49) ; + RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,50) ; + RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,51) ; + + RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,52) ; + RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,53) ; + RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,54) ; + RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,55) ; + + RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,56) ; + RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,57) ; + RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,58) ; + RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,59) ; + + RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,60) ; + RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,61) ; + RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,62) ; + RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,63) ; + + RegToDigest(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; + + #if defined(DEBUG_XMM) + for(i=0; i<29; i++) { + for(j=0; j<4*14; j+=4) + printf("xmm%d[%d]=%08x,%08x,%08x,%08x\n", j/4, i, + xmm[i][j],xmm[i][j+1],xmm[i][j+2],xmm[i][j+3]) ; + printf("\n") ; + } + + for(i=0; i<64; i++)printf("W_K[%d]%08x\n", i, W_K[i]) ; + #endif + + return 0; +} + +#if defined(HAVE_INTEL_RORX) +static int Transform_AVX1_RORX(Sha256* sha256) +{ + + word32 W_K[64] ; /* temp for W+K */ + + #if defined(DEBUG_XMM) + int i, j ; + word32 xmm[29][4*15] ; + #endif + + Init_Masks(BYTE_FLIP_MASK, SHUF_00BA, SHUF_DC00) ; + W_K_from_buff ; /* X0, X1, X2, X3 = W[0..15] ; */ + + DigestToReg(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; + SET_W_K_XFER(X0, 0) ; + MessageSched_RORX(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,0) ; + SET_W_K_XFER(X1, 4) ; + MessageSched_RORX(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,4) ; + SET_W_K_XFER(X2, 8) ; + MessageSched_RORX(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,8) ; + SET_W_K_XFER(X3, 12) ; + MessageSched_RORX(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,12) ; + SET_W_K_XFER(X0, 16) ; + MessageSched_RORX(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,16) ; + SET_W_K_XFER(X1, 20) ; + MessageSched_RORX(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,20) ; + SET_W_K_XFER(X2, 24) ; + MessageSched_RORX(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,24) ; + SET_W_K_XFER(X3, 28) ; + MessageSched_RORX(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,28) ; + SET_W_K_XFER(X0, 32) ; + MessageSched_RORX(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,32) ; + SET_W_K_XFER(X1, 36) ; + MessageSched_RORX(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,36) ; + SET_W_K_XFER(X2, 40) ; + MessageSched_RORX(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,40) ; + SET_W_K_XFER(X3, 44) ; + MessageSched_RORX(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,44) ; + + SET_W_K_XFER(X0, 48) ; + SET_W_K_XFER(X1, 52) ; + SET_W_K_XFER(X2, 56) ; + SET_W_K_XFER(X3, 60) ; + + RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,48) ; + RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,49) ; + RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,50) ; + RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,51) ; + + RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,52) ; + RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,53) ; + RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,54) ; + RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,55) ; + + RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,56) ; + RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,57) ; + RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,58) ; + RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,59) ; + + RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,60) ; + RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,61) ; + RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,62) ; + RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,63) ; + + RegToDigest(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; + + #if defined(DEBUG_XMM) + for(i=0; i<29; i++) { + for(j=0; j<4*14; j+=4) + printf("xmm%d[%d]=%08x,%08x,%08x,%08x\n", j/4, i, + xmm[i][j],xmm[i][j+1],xmm[i][j+2],xmm[i][j+3]) ; + printf("\n") ; + } + + for(i=0; i<64; i++)printf("W_K[%d]%08x\n", i, W_K[i]) ; + #endif + + return 0; +} +#endif /* HAVE_INTEL_RORX */ + +#endif /* HAVE_INTEL_AVX1 */ + + +#if defined(HAVE_INTEL_AVX2) + +#define _MOVE_to_REG(ymm, mem) __asm__ volatile("vmovdqu %0, %%"#ymm" ":: "m"(mem):YMM_REGs) ; +#define _MOVE_to_MEM(mem, ymm) __asm__ volatile("vmovdqu %%"#ymm", %0" : "=m"(mem)::YMM_REGs) ; +#define _BYTE_SWAP(ymm, map) __asm__ volatile("vpshufb %0, %%"#ymm", %%"#ymm"\n\t"\ + :: "m"(map):YMM_REGs) ; +#define _MOVE_128(ymm0, ymm1, ymm2, map) __asm__ volatile("vperm2i128 $"#map", %%"\ + #ymm2", %%"#ymm1", %%"#ymm0" ":::YMM_REGs) ; +#define _MOVE_BYTE(ymm0, ymm1, map) __asm__ volatile("vpshufb %0, %%"#ymm1", %%"\ + #ymm0"\n\t":: "m"(map):YMM_REGs) ; +#define _S_TEMP(dest, src, bits, temp) __asm__ volatile("vpsrld $"#bits", %%"\ + #src", %%"#dest"\n\tvpslld $32-"#bits", %%"#src", %%"#temp"\n\tvpor %%"\ + #temp",%%"#dest", %%"#dest" ":::YMM_REGs) ; +#define _AVX2_R(dest, src, bits) __asm__ volatile("vpsrld $"#bits", %%"\ + #src", %%"#dest" ":::YMM_REGs) ; +#define _XOR(dest, src1, src2) __asm__ volatile("vpxor %%"#src1", %%"\ + #src2", %%"#dest" ":::YMM_REGs) ; +#define _OR(dest, src1, src2) __asm__ volatile("vpor %%"#src1", %%"\ + #src2", %%"#dest" ":::YMM_REGs) ; +#define _ADD(dest, src1, src2) __asm__ volatile("vpaddd %%"#src1", %%"\ + #src2", %%"#dest" ":::YMM_REGs) ; +#define _ADD_MEM(dest, src1, mem) __asm__ volatile("vpaddd %0, %%"#src1", %%"\ + #dest" "::"m"(mem):YMM_REGs) ; +#define _BLEND(map, dest, src1, src2) __asm__ volatile("vpblendd $"#map", %%"\ + #src1", %%"#src2", %%"#dest" ":::YMM_REGs) ; + +#define _EXTRACT_XMM_0(xmm, mem) __asm__ volatile("vpextrd $0, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; +#define _EXTRACT_XMM_1(xmm, mem) __asm__ volatile("vpextrd $1, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; +#define _EXTRACT_XMM_2(xmm, mem) __asm__ volatile("vpextrd $2, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; +#define _EXTRACT_XMM_3(xmm, mem) __asm__ volatile("vpextrd $3, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; +#define _EXTRACT_XMM_4(ymm, xmm, mem)\ + __asm__ volatile("vperm2i128 $0x1, %%"#ymm", %%"#ymm", %%"#ymm" ":::YMM_REGs) ;\ + __asm__ volatile("vpextrd $0, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; +#define _EXTRACT_XMM_5(xmm, mem) __asm__ volatile("vpextrd $1, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; +#define _EXTRACT_XMM_6(xmm, mem) __asm__ volatile("vpextrd $2, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; +#define _EXTRACT_XMM_7(xmm, mem) __asm__ volatile("vpextrd $3, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; + +#define _SWAP_YMM_HL(ymm) __asm__ volatile("vperm2i128 $0x1, %%"#ymm", %%"#ymm", %%"#ymm" ":::YMM_REGs) ; +#define SWAP_YMM_HL(ymm) _SWAP_YMM_HL(ymm) + +#define MOVE_to_REG(ymm, mem) _MOVE_to_REG(ymm, mem) +#define MOVE_to_MEM(mem, ymm) _MOVE_to_MEM(mem, ymm) +#define BYTE_SWAP(ymm, map) _BYTE_SWAP(ymm, map) +#define MOVE_128(ymm0, ymm1, ymm2, map) _MOVE_128(ymm0, ymm1, ymm2, map) +#define MOVE_BYTE(ymm0, ymm1, map) _MOVE_BYTE(ymm0, ymm1, map) +#define XOR(dest, src1, src2) _XOR(dest, src1, src2) +#define OR(dest, src1, src2) _OR(dest, src1, src2) +#define ADD(dest, src1, src2) _ADD(dest, src1, src2) +#define ADD_MEM(dest, src1, mem) _ADD_MEM(dest, src1, mem) +#define BLEND(map, dest, src1, src2) _BLEND(map, dest, src1, src2) + +#define S_TMP(dest, src, bits, temp) _S_TEMP(dest, src, bits, temp); +#define AVX2_S(dest, src, bits) S_TMP(dest, src, bits, S_TEMP) +#define AVX2_R(dest, src, bits) _AVX2_R(dest, src, bits) + +#define GAMMA0(dest, src) AVX2_S(dest, src, 7); AVX2_S(G_TEMP, src, 18); \ + XOR(dest, G_TEMP, dest) ; AVX2_R(G_TEMP, src, 3); XOR(dest, G_TEMP, dest) ; +#define GAMMA0_1(dest, src) AVX2_S(dest, src, 7); AVX2_S(G_TEMP, src, 18); +#define GAMMA0_2(dest, src) XOR(dest, G_TEMP, dest) ; AVX2_R(G_TEMP, src, 3); \ + XOR(dest, G_TEMP, dest) ; + +#define GAMMA1(dest, src) AVX2_S(dest, src, 17); AVX2_S(G_TEMP, src, 19); \ + XOR(dest, G_TEMP, dest) ; AVX2_R(G_TEMP, src, 10); XOR(dest, G_TEMP, dest) ; +#define GAMMA1_1(dest, src) AVX2_S(dest, src, 17); AVX2_S(G_TEMP, src, 19); +#define GAMMA1_2(dest, src) XOR(dest, G_TEMP, dest) ; AVX2_R(G_TEMP, src, 10); \ + XOR(dest, G_TEMP, dest) ; + +#define FEEDBACK1_to_W_I_2 MOVE_BYTE(YMM_TEMP0, W_I, mMAP1toW_I_2[0]) ; \ + BLEND(0x0c, W_I_2, YMM_TEMP0, W_I_2) ; +#define FEEDBACK2_to_W_I_2 MOVE_128(YMM_TEMP0, W_I, W_I, 0x08) ; \ + MOVE_BYTE(YMM_TEMP0, YMM_TEMP0, mMAP2toW_I_2[0]) ; BLEND(0x30, W_I_2, YMM_TEMP0, W_I_2) ; +#define FEEDBACK3_to_W_I_2 MOVE_BYTE(YMM_TEMP0, W_I, mMAP3toW_I_2[0]) ; \ + BLEND(0xc0, W_I_2, YMM_TEMP0, W_I_2) ; + +#define FEEDBACK_to_W_I_7 MOVE_128(YMM_TEMP0, W_I, W_I, 0x08) ;\ + MOVE_BYTE(YMM_TEMP0, YMM_TEMP0, mMAPtoW_I_7[0]) ; BLEND(0x80, W_I_7, YMM_TEMP0, W_I_7) ; + +#undef voitle + +#define W_I_16 ymm8 +#define W_I_15 ymm9 +#define W_I_7 ymm10 +#define W_I_2 ymm11 +#define W_I ymm12 +#define G_TEMP ymm13 +#define S_TEMP ymm14 +#define YMM_TEMP0 ymm15 +#define YMM_TEMP0x xmm15 +#define W_I_TEMP ymm7 +#define W_K_TEMP ymm15 +#define W_K_TEMPx xmm15 + +#define YMM_REGs /* Registers are saved in Sha256Update/Finel */ + /* "%ymm7","%ymm8","%ymm9","%ymm10","%ymm11","%ymm12","%ymm13","%ymm14","%ymm15"*/ + + +#define MOVE_15_to_16(w_i_16, w_i_15, w_i_7)\ + __asm__ volatile("vperm2i128 $0x01, %%"#w_i_15", %%"#w_i_15", %%"#w_i_15" ":::YMM_REGs) ;\ + __asm__ volatile("vpblendd $0x08, %%"#w_i_15", %%"#w_i_7", %%"#w_i_16" ":::YMM_REGs) ;\ + __asm__ volatile("vperm2i128 $0x01, %%"#w_i_7", %%"#w_i_7", %%"#w_i_15" ":::YMM_REGs) ;\ + __asm__ volatile("vpblendd $0x80, %%"#w_i_15", %%"#w_i_16", %%"#w_i_16" ":::YMM_REGs) ;\ + __asm__ volatile("vpshufd $0x93, %%"#w_i_16", %%"#w_i_16" ":::YMM_REGs) ;\ + +#define MOVE_7_to_15(w_i_15, w_i_7)\ + __asm__ volatile("vmovdqu %%"#w_i_7", %%"#w_i_15" ":::YMM_REGs) ;\ + +#define MOVE_I_to_7(w_i_7, w_i)\ + __asm__ volatile("vperm2i128 $0x01, %%"#w_i", %%"#w_i", %%"#w_i_7" ":::YMM_REGs) ;\ + __asm__ volatile("vpblendd $0x01, %%"#w_i_7", %%"#w_i", %%"#w_i_7" ":::YMM_REGs) ;\ + __asm__ volatile("vpshufd $0x39, %%"#w_i_7", %%"#w_i_7" ":::YMM_REGs) ;\ + +#define MOVE_I_to_2(w_i_2, w_i)\ + __asm__ volatile("vperm2i128 $0x01, %%"#w_i", %%"#w_i", %%"#w_i_2" ":::YMM_REGs) ;\ + __asm__ volatile("vpshufd $0x0e, %%"#w_i_2", %%"#w_i_2" ":::YMM_REGs) ;\ + +#define ROTATE_W(w_i_16, w_i_15, w_i_7, w_i_2, w_i)\ + MOVE_15_to_16(w_i_16, w_i_15, w_i_7) ; \ + MOVE_7_to_15(w_i_15, w_i_7) ; \ + MOVE_I_to_7(w_i_7, w_i) ; \ + MOVE_I_to_2(w_i_2, w_i) ;\ + +#define _RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ + { word32 d ;\ + __asm__ volatile("movl %"#S_0", %0":"=r"(d)::SSE_REGs) ;\ + sha256->digest[0] += d;\ + __asm__ volatile("movl %"#S_1", %0":"=r"(d)::SSE_REGs) ;\ + sha256->digest[1] += d;\ + __asm__ volatile("movl %"#S_2", %0":"=r"(d)::SSE_REGs) ;\ + sha256->digest[2] += d;\ + __asm__ volatile("movl %"#S_3", %0":"=r"(d)::SSE_REGs) ;\ + sha256->digest[3] += d;\ + __asm__ volatile("movl %"#S_4", %0":"=r"(d)::SSE_REGs) ;\ + sha256->digest[4] += d;\ + __asm__ volatile("movl %"#S_5", %0":"=r"(d)::SSE_REGs) ;\ + sha256->digest[5] += d;\ + __asm__ volatile("movl %"#S_6", %0":"=r"(d)::SSE_REGs) ;\ + sha256->digest[6] += d;\ + __asm__ volatile("movl %"#S_7", %0":"=r"(d)::SSE_REGs) ;\ + sha256->digest[7] += d;\ +} + +#define _DumpS(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ + { word32 d[8] ;\ + __asm__ volatile("movl %"#S_0", %0":"=r"(d[0])::SSE_REGs) ;\ + __asm__ volatile("movl %"#S_1", %0":"=r"(d[1])::SSE_REGs) ;\ + __asm__ volatile("movl %"#S_2", %0":"=r"(d[2])::SSE_REGs) ;\ + __asm__ volatile("movl %"#S_3", %0":"=r"(d[3])::SSE_REGs) ;\ + __asm__ volatile("movl %"#S_4", %0":"=r"(d[4])::SSE_REGs) ;\ + __asm__ volatile("movl %"#S_5", %0":"=r"(d[5])::SSE_REGs) ;\ + __asm__ volatile("movl %"#S_6", %0":"=r"(d[6])::SSE_REGs) ;\ + __asm__ volatile("movl %"#S_7", %0":"=r"(d[7])::SSE_REGs) ;\ + printf("S[0..7]=%08x,%08x,%08x,%08x,%08x,%08x,%08x,%08x\n", d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7]);\ + __asm__ volatile("movl %0, %"#S_0::"r"(d[0]):SSE_REGs) ;\ + __asm__ volatile("movl %0, %"#S_1::"r"(d[1]):SSE_REGs) ;\ + __asm__ volatile("movl %0, %"#S_2::"r"(d[2]):SSE_REGs) ;\ + __asm__ volatile("movl %0, %"#S_3::"r"(d[3]):SSE_REGs) ;\ + __asm__ volatile("movl %0, %"#S_4::"r"(d[4]):SSE_REGs) ;\ + __asm__ volatile("movl %0, %"#S_5::"r"(d[5]):SSE_REGs) ;\ + __asm__ volatile("movl %0, %"#S_6::"r"(d[6]):SSE_REGs) ;\ + __asm__ volatile("movl %0, %"#S_7::"r"(d[7]):SSE_REGs) ;\ +} + + +#define DigestToReg(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ + _DigestToReg(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 ) + +#define RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ + _RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 ) + +#define DumS(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ + _DumpS(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 ) + + + /* Byte swap Masks to ensure that rest of the words are filled with zero's. */ + static const unsigned long mBYTE_FLIP_MASK_16[] = + { 0x0405060700010203, 0x0c0d0e0f08090a0b, 0x0405060700010203, 0x0c0d0e0f08090a0b } ; + static const unsigned long mBYTE_FLIP_MASK_15[] = + { 0x0405060700010203, 0x0c0d0e0f08090a0b, 0x0405060700010203, 0x0c0d0e0f08090a0b } ; + static const unsigned long mBYTE_FLIP_MASK_7 [] = + { 0x0405060700010203, 0x0c0d0e0f08090a0b, 0x0405060700010203, 0x8080808008090a0b } ; + static const unsigned long mBYTE_FLIP_MASK_2 [] = + { 0x0405060700010203, 0x8080808080808080, 0x8080808080808080, 0x8080808080808080 } ; + + static const unsigned long mMAPtoW_I_7[] = + { 0x8080808080808080, 0x8080808080808080, 0x8080808080808080, 0x0302010080808080 } ; + static const unsigned long mMAP1toW_I_2[] = + { 0x8080808080808080, 0x0706050403020100, 0x8080808080808080, 0x8080808080808080 } ; + static const unsigned long mMAP2toW_I_2[] = + { 0x8080808080808080, 0x8080808080808080, 0x0f0e0d0c0b0a0908, 0x8080808080808080 } ; + static const unsigned long mMAP3toW_I_2[] = + { 0x8080808080808080, 0x8080808080808080, 0x8080808080808080, 0x0706050403020100 } ; + +static int Transform_AVX2(Sha256* sha256) +{ + + #ifdef WOLFSSL_SMALL_STACK + word32* W_K; + W_K = (word32*) XMALLOC(sizeof(word32) * 64, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (W_K == NULL) + return MEMORY_E; + #else + word32 W_K[64] ; + #endif + + MOVE_to_REG(W_I_16, sha256->buffer[0]); BYTE_SWAP(W_I_16, mBYTE_FLIP_MASK_16[0]) ; + MOVE_to_REG(W_I_15, sha256->buffer[1]); BYTE_SWAP(W_I_15, mBYTE_FLIP_MASK_15[0]) ; + MOVE_to_REG(W_I, sha256->buffer[8]) ; BYTE_SWAP(W_I, mBYTE_FLIP_MASK_16[0]) ; + MOVE_to_REG(W_I_7, sha256->buffer[16-7]) ; BYTE_SWAP(W_I_7, mBYTE_FLIP_MASK_7[0]) ; + MOVE_to_REG(W_I_2, sha256->buffer[16-2]) ; BYTE_SWAP(W_I_2, mBYTE_FLIP_MASK_2[0]) ; + + DigestToReg(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; + + ADD_MEM(W_K_TEMP, W_I_16, K[0]) ; + MOVE_to_MEM(W_K[0], W_K_TEMP) ; + + RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,0) ; + RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,1) ; + RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,2) ; + RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,3) ; + RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,4) ; + RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,5) ; + RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,6) ; + RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,7) ; + + ADD_MEM(YMM_TEMP0, W_I, K[8]) ; + MOVE_to_MEM(W_K[8], YMM_TEMP0) ; + + /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ + RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,8) ; + GAMMA0_1(W_I_TEMP, W_I_15) ; + RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,8) ; + GAMMA0_2(W_I_TEMP, W_I_15) ; + RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,8) ; + ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ + RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,9) ; + ADD(W_I, W_I_7, W_I_TEMP); + RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,9) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,9) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,10) ; + ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ + RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,10) ; + FEEDBACK1_to_W_I_2 ; + RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,10) ; + FEEDBACK_to_W_I_7 ; + RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,11) ; + ADD(W_I_TEMP, W_I_7, W_I_TEMP); + RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,11) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,11) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,12) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ + RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,12) ; + FEEDBACK2_to_W_I_2 ; + RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,12) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,13) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,13) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ + RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,13) ; + FEEDBACK3_to_W_I_2 ; + RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,14) ; + GAMMA1(YMM_TEMP0, W_I_2) ; + RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,14) ; + RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,14) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ + RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,15) ; + + MOVE_to_REG(YMM_TEMP0, K[16]) ; + RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,15) ; + ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; + RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,15) ; + ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; + MOVE_to_MEM(W_K[16], YMM_TEMP0) ; + + /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ + RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,16) ; + GAMMA0_1(W_I_TEMP, W_I_15) ; + RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,16) ; + GAMMA0_2(W_I_TEMP, W_I_15) ; + RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,16) ; + ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ + RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,17) ; + ADD(W_I, W_I_7, W_I_TEMP); + RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,17) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,17) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,18) ; + ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ + RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,18) ; + FEEDBACK1_to_W_I_2 ; + RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,18) ; + FEEDBACK_to_W_I_7 ; + RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,19) ; + ADD(W_I_TEMP, W_I_7, W_I_TEMP); + RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,19) ; + GAMMA1(YMM_TEMP0, W_I_2) ; + RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,19) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,20) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ + RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,20) ; + FEEDBACK2_to_W_I_2 ; + RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,20) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,21) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,21) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ + RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,21) ; + FEEDBACK3_to_W_I_2 ; + RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,22) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,22) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,22) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ + RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,23) ; + + MOVE_to_REG(YMM_TEMP0, K[24]) ; + RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,23) ; + ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; + RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,23) ; + ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; + MOVE_to_MEM(W_K[24], YMM_TEMP0) ; + + /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ + RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,24) ; + GAMMA0_1(W_I_TEMP, W_I_15) ; + RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,24) ; + GAMMA0_2(W_I_TEMP, W_I_15) ; + RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,24) ; + ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ + RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,25) ; + ADD(W_I, W_I_7, W_I_TEMP); + RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,25) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,25) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,26) ; + ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ + RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,26) ; + FEEDBACK1_to_W_I_2 ; + RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,26) ; + FEEDBACK_to_W_I_7 ; + RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,27) ; + ADD(W_I_TEMP, W_I_7, W_I_TEMP); + RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,27) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,27) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,28) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ + RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,28) ; + FEEDBACK2_to_W_I_2 ; + RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,28) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,29) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,29) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ + RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,29) ; + FEEDBACK3_to_W_I_2 ; + RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,30) ; + GAMMA1(YMM_TEMP0, W_I_2) ; + RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,30) ; + RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,30) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ + RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,31) ; + + MOVE_to_REG(YMM_TEMP0, K[32]) ; + RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,31) ; + ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; + RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,31) ; + ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; + MOVE_to_MEM(W_K[32], YMM_TEMP0) ; + + + /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ + RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,32) ; + GAMMA0_1(W_I_TEMP, W_I_15) ; + RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,32) ; + GAMMA0_2(W_I_TEMP, W_I_15) ; + RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,32) ; + ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ + RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,33) ; + ADD(W_I, W_I_7, W_I_TEMP); + RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,33) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,33) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,34) ; + ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ + RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,34) ; + FEEDBACK1_to_W_I_2 ; + RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,34) ; + FEEDBACK_to_W_I_7 ; + RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,35) ; + ADD(W_I_TEMP, W_I_7, W_I_TEMP); + RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,35) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,35) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,36) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ + RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,36) ; + FEEDBACK2_to_W_I_2 ; + RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,36) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,37) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,37) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ + RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,37) ; + FEEDBACK3_to_W_I_2 ; + RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,38) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,38) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,38) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ + RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,39) ; + + MOVE_to_REG(YMM_TEMP0, K[40]) ; + RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,39) ; + ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; + RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,39) ; + ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; + MOVE_to_MEM(W_K[40], YMM_TEMP0) ; + + /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ + RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,40) ; + GAMMA0_1(W_I_TEMP, W_I_15) ; + RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,40) ; + GAMMA0_2(W_I_TEMP, W_I_15) ; + RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,40) ; + ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ + RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,41) ; + ADD(W_I, W_I_7, W_I_TEMP); + RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,41) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,41) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,42) ; + ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ + RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,42) ; + FEEDBACK1_to_W_I_2 ; + RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,42) ; + FEEDBACK_to_W_I_7 ; + RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,43) ; + ADD(W_I_TEMP, W_I_7, W_I_TEMP); + RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,43) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,43) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,44) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ + RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,44) ; + FEEDBACK2_to_W_I_2 ; + RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,44) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,45) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,45) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ + RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,45) ; + FEEDBACK3_to_W_I_2 ; + RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,46) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,46) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,46) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ + RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,47) ; + + MOVE_to_REG(YMM_TEMP0, K[48]) ; + RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,47) ; + ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; + RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,47) ; + ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; + MOVE_to_MEM(W_K[48], YMM_TEMP0) ; + + /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ + RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,48) ; + GAMMA0_1(W_I_TEMP, W_I_15) ; + RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,48) ; + GAMMA0_2(W_I_TEMP, W_I_15) ; + RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,48) ; + ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ + RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,49) ; + ADD(W_I, W_I_7, W_I_TEMP); + RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,49) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,49) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,50) ; + ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ + RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,50) ; + FEEDBACK1_to_W_I_2 ; + RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,50) ; + FEEDBACK_to_W_I_7 ; + RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,51) ; + ADD(W_I_TEMP, W_I_7, W_I_TEMP); + RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,51) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,51) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,52) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ + RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,52) ; + FEEDBACK2_to_W_I_2 ; + RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,52) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,53) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,53) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ + RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,53) ; + FEEDBACK3_to_W_I_2 ; + RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,54) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,54) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,54) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ + RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,55) ; + + MOVE_to_REG(YMM_TEMP0, K[56]) ; + RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,55) ; + ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; + RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,55) ; + ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; + MOVE_to_MEM(W_K[56], YMM_TEMP0) ; + + RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,56) ; + RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,57) ; + RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,58) ; + RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,59) ; + + RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,60) ; + RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,61) ; + RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,62) ; + RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,63) ; + + RegToDigest(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; + + #ifdef WOLFSSL_SMALL_STACK + XFREE(W, NULL, DYNAMIC_TYPE_TMP_BUFFER); + #endif + + return 0; +} + +#endif /* HAVE_INTEL_AVX2 */ + +#endif /* WOLFSSL_TI_HAHS */ + +#endif /* HAVE_FIPS */ + +#endif /* NO_SHA256 */ + diff --git a/wolfssl/wolfcrypt/md5.h b/wolfssl/wolfcrypt/md5.h index ba8d89400..94e4466f7 100644 --- a/wolfssl/wolfcrypt/md5.h +++ b/wolfssl/wolfcrypt/md5.h @@ -1,81 +1,100 @@ -/* md5.h - * - * Copyright (C) 2006-2015 wolfSSL Inc. - * - * This file is part of wolfSSL. (formerly known as CyaSSL) - * - * wolfSSL 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. - * - * wolfSSL 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 - */ - -#ifndef WOLF_CRYPT_MD5_H -#define WOLF_CRYPT_MD5_H - -#include - -#ifndef NO_MD5 - -#ifdef HAVE_FIPS - #define wc_InitMd5 InitMd5 - #define wc_Md5Update Md5Update - #define wc_Md5Final Md5Final - #define wc_Md5Hash Md5Hash -#endif - -#ifdef __cplusplus - extern "C" { -#endif - - -/* in bytes */ -enum { -#ifdef STM32F2_HASH - MD5_REG_SIZE = 4, /* STM32 register size, bytes */ -#endif - MD5 = 0, /* hash type unique */ - MD5_BLOCK_SIZE = 64, - MD5_DIGEST_SIZE = 16, - MD5_PAD_SIZE = 56 -}; - -#if defined(WOLFSSL_PIC32MZ_HASH) -#include "port/pic32/pic32mz-crypt.h" -#endif - -/* MD5 digest */ -typedef struct Md5 { - word32 buffLen; /* in bytes */ - word32 loLen; /* length in bytes */ - word32 hiLen; /* length in bytes */ - word32 buffer[MD5_BLOCK_SIZE / sizeof(word32)]; - #if !defined(WOLFSSL_PIC32MZ_HASH) - word32 digest[MD5_DIGEST_SIZE / sizeof(word32)]; - #else - word32 digest[PIC32_HASH_SIZE / sizeof(word32)]; - pic32mz_desc desc ; /* Crypt Engine descripter */ - #endif -} Md5; - -WOLFSSL_API void wc_InitMd5(Md5*); -WOLFSSL_API void wc_Md5Update(Md5*, const byte*, word32); -WOLFSSL_API void wc_Md5Final(Md5*, byte*); -WOLFSSL_API int wc_Md5Hash(const byte*, word32, byte*); - - -#ifdef __cplusplus - } /* extern "C" */ -#endif - -#endif /* NO_MD5 */ -#endif /* WOLF_CRYPT_MD5_H */ +/* md5.h + * + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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. + * + * wolfSSL 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 + */ + +#ifndef WOLF_CRYPT_MD5_H +#define WOLF_CRYPT_MD5_H + +#include + +#ifndef NO_MD5 + +#ifdef HAVE_FIPS + #define wc_InitMd5 InitMd5 + #define wc_Md5Update Md5Update + #define wc_Md5Final Md5Final + #define wc_Md5Hash Md5Hash +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +/* in bytes */ +enum { +#ifdef STM32F2_HASH + MD5_REG_SIZE = 4, /* STM32 register size, bytes */ +#endif + MD5 = 0, /* hash type unique */ + MD5_BLOCK_SIZE = 64, + MD5_DIGEST_SIZE = 16, + MD5_PAD_SIZE = 56 +}; + +#if defined(WOLFSSL_PIC32MZ_HASH) +#include "port/pic32/pic32mz-crypt.h" +#endif + +#ifdef TI_HASH_TEST +#include "wolfssl/wolfcrypt/port/ti/ti-hash.h" +#endif + + +#ifndef WOLFSSL_TI_HASH + +/* MD5 digest */ +typedef struct Md5 { + word32 buffLen; /* in bytes */ + word32 loLen; /* length in bytes */ + word32 hiLen; /* length in bytes */ + word32 buffer[MD5_BLOCK_SIZE / sizeof(word32)]; + #if !defined(WOLFSSL_PIC32MZ_HASH) + word32 digest[MD5_DIGEST_SIZE / sizeof(word32)]; + #else + word32 digest[PIC32_HASH_SIZE / sizeof(word32)]; + pic32mz_desc desc ; /* Crypt Engine descripter */ + #endif + +#ifdef TI_HASH_TEST + wolfssl_TI_Hash ti ; +#endif + +} Md5; + +#if defined(TI_HASH_TEST) +void wc_Md5GetHash_ti(Md5* md5, byte* hash) ; +#endif + +#else /* WOLFSSL_TI_HASH */ + #include "wolfssl/wolfcrypt/port/ti/ti-hash.h" +#endif + +WOLFSSL_API void wc_InitMd5(Md5*); +WOLFSSL_API void wc_Md5Update(Md5*, const byte*, word32); +WOLFSSL_API void wc_Md5Final(Md5*, byte*); +WOLFSSL_API int wc_Md5Hash(const byte*, word32, byte*); +WOLFSSL_API void wc_Md5GetHash(Md5*, byte*); + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* NO_MD5 */ +#endif /* WOLF_CRYPT_MD5_H */ diff --git a/wolfssl/wolfcrypt/sha.h b/wolfssl/wolfcrypt/sha.h index 9fdabed39..46dce03d0 100644 --- a/wolfssl/wolfcrypt/sha.h +++ b/wolfssl/wolfcrypt/sha.h @@ -1,80 +1,88 @@ -/* sha.h - * - * Copyright (C) 2006-2015 wolfSSL Inc. - * - * This file is part of wolfSSL. (formerly known as CyaSSL) - * - * wolfSSL 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. - * - * wolfSSL 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 - */ - -#ifndef WOLF_CRYPT_SHA_H -#define WOLF_CRYPT_SHA_H - -#include - -#ifndef NO_SHA - -#ifdef HAVE_FIPS -/* for fips @wc_fips */ -#include -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef HAVE_FIPS /* avoid redefining structs */ -/* in bytes */ -enum { -#ifdef STM32F2_HASH - SHA_REG_SIZE = 4, /* STM32 register size, bytes */ -#endif - SHA = 1, /* hash type unique */ - SHA_BLOCK_SIZE = 64, - SHA_DIGEST_SIZE = 20, - SHA_PAD_SIZE = 56 -}; - -#ifdef WOLFSSL_PIC32MZ_HASH -#include "port/pic32/pic32mz-crypt.h" -#endif - -/* Sha digest */ -typedef struct Sha { - word32 buffLen; /* in bytes */ - word32 loLen; /* length in bytes */ - word32 hiLen; /* length in bytes */ - word32 buffer[SHA_BLOCK_SIZE / sizeof(word32)]; - #ifndef WOLFSSL_PIC32MZ_HASH - word32 digest[SHA_DIGEST_SIZE / sizeof(word32)]; - #else - word32 digest[PIC32_HASH_SIZE / sizeof(word32)]; - pic32mz_desc desc; /* Crypt Engine descripter */ - #endif -} Sha; -#endif /* HAVE_FIPS */ - -WOLFSSL_API int wc_InitSha(Sha*); -WOLFSSL_API int wc_ShaUpdate(Sha*, const byte*, word32); -WOLFSSL_API int wc_ShaFinal(Sha*, byte*); -WOLFSSL_API int wc_ShaHash(const byte*, word32, byte*); - -#ifdef __cplusplus - } /* extern "C" */ -#endif - -#endif /* NO_SHA */ -#endif /* WOLF_CRYPT_SHA_H */ - +/* sha.h + * + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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. + * + * wolfSSL 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 + */ + +#ifndef WOLF_CRYPT_SHA_H +#define WOLF_CRYPT_SHA_H + +#include + +#ifndef NO_SHA + +#ifdef HAVE_FIPS +/* for fips @wc_fips */ +#include +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef HAVE_FIPS /* avoid redefining structs */ +/* in bytes */ +enum { +#ifdef STM32F2_HASH + SHA_REG_SIZE = 4, /* STM32 register size, bytes */ +#endif + SHA = 1, /* hash type unique */ + SHA_BLOCK_SIZE = 64, + SHA_DIGEST_SIZE = 20, + SHA_PAD_SIZE = 56 +}; + +#ifdef WOLFSSL_PIC32MZ_HASH +#include "port/pic32/pic32mz-crypt.h" +#endif + +#ifndef WOLFSSL_TI_HASH + +/* Sha digest */ +typedef struct Sha { + word32 buffLen; /* in bytes */ + word32 loLen; /* length in bytes */ + word32 hiLen; /* length in bytes */ + word32 buffer[SHA_BLOCK_SIZE / sizeof(word32)]; + #ifndef WOLFSSL_PIC32MZ_HASH + word32 digest[SHA_DIGEST_SIZE / sizeof(word32)]; + #else + word32 digest[PIC32_HASH_SIZE / sizeof(word32)]; + pic32mz_desc desc; /* Crypt Engine descripter */ + #endif +} Sha; + +#else /* WOLFSSL_TI_HASH */ + #include "wolfssl/wolfcrypt/port/ti/ti-hash.h" +#endif + +#endif /* HAVE_FIPS */ + +WOLFSSL_API int wc_InitSha(Sha*); +WOLFSSL_API int wc_ShaUpdate(Sha*, const byte*, word32); +WOLFSSL_API int wc_ShaFinal(Sha*, byte*); +WOLFSSL_API int wc_ShaHash(const byte*, word32, byte*); +WOLFSSL_API int wc_ShaGetHash(Sha*, byte*); + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* NO_SHA */ +#endif /* WOLF_CRYPT_SHA_H */ + diff --git a/wolfssl/wolfcrypt/sha256.h b/wolfssl/wolfcrypt/sha256.h index 5dbe2d74b..86616e320 100644 --- a/wolfssl/wolfcrypt/sha256.h +++ b/wolfssl/wolfcrypt/sha256.h @@ -1,80 +1,86 @@ -/* sha256.h - * - * Copyright (C) 2006-2015 wolfSSL Inc. - * - * This file is part of wolfSSL. (formerly known as CyaSSL) - * - * wolfSSL 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. - * - * wolfSSL 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 - */ - -/* code submitted by raphael.huck@efixo.com */ - -#ifndef WOLF_CRYPT_SHA256_H -#define WOLF_CRYPT_SHA256_H - -#include - -#ifndef NO_SHA256 - -#ifdef HAVE_FIPS - /* for fips @wc_fips */ - #include -#endif - - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef HAVE_FIPS /* avoid redefinition of structs */ -#ifdef WOLFSSL_PIC32MZ_HASH - #include "port/pic32/pic32mz-crypt.h" -#endif - -/* in bytes */ -enum { - SHA256 = 2, /* hash type unique */ - SHA256_BLOCK_SIZE = 64, - SHA256_DIGEST_SIZE = 32, - SHA256_PAD_SIZE = 56 -}; - - -/* Sha256 digest */ -typedef struct Sha256 { - word32 buffLen; /* in bytes */ - word32 loLen; /* length in bytes */ - word32 hiLen; /* length in bytes */ - word32 digest[SHA256_DIGEST_SIZE / sizeof(word32)]; - word32 buffer[SHA256_BLOCK_SIZE / sizeof(word32)]; - #ifdef WOLFSSL_PIC32MZ_HASH - pic32mz_desc desc ; /* Crypt Engine descripter */ - #endif -} Sha256; - -#endif /* HAVE_FIPS */ - -WOLFSSL_API int wc_InitSha256(Sha256*); -WOLFSSL_API int wc_Sha256Update(Sha256*, const byte*, word32); -WOLFSSL_API int wc_Sha256Final(Sha256*, byte*); -WOLFSSL_API int wc_Sha256Hash(const byte*, word32, byte*); - -#ifdef __cplusplus - } /* extern "C" */ -#endif - -#endif /* NO_SHA256 */ -#endif /* WOLF_CRYPT_SHA256_H */ - +/* sha256.h + * + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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. + * + * wolfSSL 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 + */ + +/* code submitted by raphael.huck@efixo.com */ + +#ifndef WOLF_CRYPT_SHA256_H +#define WOLF_CRYPT_SHA256_H + +#include + +#ifndef NO_SHA256 + +#ifdef HAVE_FIPS + /* for fips @wc_fips */ + #include +#endif + + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef HAVE_FIPS /* avoid redefinition of structs */ +#ifdef WOLFSSL_PIC32MZ_HASH + #include "port/pic32/pic32mz-crypt.h" +#endif + +/* in bytes */ +enum { + SHA256 = 2, /* hash type unique */ + SHA256_BLOCK_SIZE = 64, + SHA256_DIGEST_SIZE = 32, + SHA256_PAD_SIZE = 56 +}; + +#ifndef WOLFSSL_TI_HASH + +/* Sha256 digest */ +typedef struct Sha256 { + word32 buffLen; /* in bytes */ + word32 loLen; /* length in bytes */ + word32 hiLen; /* length in bytes */ + word32 digest[SHA256_DIGEST_SIZE / sizeof(word32)]; + word32 buffer[SHA256_BLOCK_SIZE / sizeof(word32)]; + #ifdef WOLFSSL_PIC32MZ_HASH + pic32mz_desc desc ; /* Crypt Engine descripter */ + #endif +} Sha256; + +#else /* WOLFSSL_TI_HASH */ + #include "wolfssl/wolfcrypt/port/ti/ti-hash.h" +#endif + +#endif /* HAVE_FIPS */ + +WOLFSSL_API int wc_InitSha256(Sha256*); +WOLFSSL_API int wc_Sha256Update(Sha256*, const byte*, word32); +WOLFSSL_API int wc_Sha256Final(Sha256*, byte*); +WOLFSSL_API int wc_Sha256Hash(const byte*, word32, byte*); +WOLFSSL_API int wc_Sha256GetHash(Sha256*, byte*); + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* NO_SHA256 */ +#endif /* WOLF_CRYPT_SHA256_H */ + From 527013ec1edae29e5cdf1169a9ced00c0e7a6559 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Thu, 21 May 2015 14:16:09 +0900 Subject: [PATCH 091/350] corrected NL code --- wolfcrypt/src/md5.c | 852 ++++---- wolfcrypt/src/port/ti/ti-aes.c | 1096 +++++----- wolfcrypt/src/sha.c | 946 ++++----- wolfcrypt/src/sha256.c | 3562 ++++++++++++++++---------------- wolfssl/wolfcrypt/md5.h | 200 +- wolfssl/wolfcrypt/sha.h | 176 +- wolfssl/wolfcrypt/sha256.h | 172 +- 7 files changed, 3502 insertions(+), 3502 deletions(-) diff --git a/wolfcrypt/src/md5.c b/wolfcrypt/src/md5.c index a3e76eda8..6c2e45d9f 100644 --- a/wolfcrypt/src/md5.c +++ b/wolfcrypt/src/md5.c @@ -1,426 +1,426 @@ -/* md5.c - * - * Copyright (C) 2006-2015 wolfSSL Inc. - * - * This file is part of wolfSSL. (formerly known as CyaSSL) - * - * wolfSSL 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. - * - * wolfSSL 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 - */ - - -#ifdef HAVE_CONFIG_H - #include -#endif - -#include - -#if !defined(NO_MD5) && !defined(WOLFSSL_TI_HASH) - -#ifdef WOLFSSL_PIC32MZ_HASH -#define wc_InitMd5 wc_InitMd5_sw -#define wc_Md5Update wc_Md5Update_sw -#define wc_Md5Final wc_Md5Final_sw -#endif - -#include -#include - -#ifdef NO_INLINE - #include -#else - #include -#endif - -#ifdef FREESCALE_MMCAU - #include "cau_api.h" - #define XTRANSFORM(S,B) cau_md5_hash_n((B), 1, (unsigned char*)(S)->digest) -#else - #define XTRANSFORM(S,B) Transform((S)) -#endif - - -#ifdef STM32F2_HASH - /* - * STM32F2 hardware MD5 support through the STM32F2 standard peripheral - * library. Documentation located in STM32F2xx Standard Peripheral Library - * document (See note in README). - */ - #include "stm32f2xx.h" - - void wc_InitMd5(Md5* md5) - { - /* STM32F2 struct notes: - * md5->buffer = first 4 bytes used to hold partial block if needed - * md5->buffLen = num bytes currently stored in md5->buffer - * md5->loLen = num bytes that have been written to STM32 FIFO - */ - XMEMSET(md5->buffer, 0, MD5_REG_SIZE); - - md5->buffLen = 0; - md5->loLen = 0; - - /* initialize HASH peripheral */ - HASH_DeInit(); - - /* configure algo used, algo mode, datatype */ - HASH->CR &= ~ (HASH_CR_ALGO | HASH_CR_DATATYPE | HASH_CR_MODE); - HASH->CR |= (HASH_AlgoSelection_MD5 | HASH_AlgoMode_HASH - | HASH_DataType_8b); - - /* reset HASH processor */ - HASH->CR |= HASH_CR_INIT; - } - - void wc_Md5Update(Md5* md5, const byte* data, word32 len) - { - word32 i = 0; - word32 fill = 0; - word32 diff = 0; - - /* if saved partial block is available */ - if (md5->buffLen > 0) { - fill = 4 - md5->buffLen; - - /* if enough data to fill, fill and push to FIFO */ - if (fill <= len) { - XMEMCPY((byte*)md5->buffer + md5->buffLen, data, fill); - HASH_DataIn(*(uint32_t*)md5->buffer); - - data += fill; - len -= fill; - md5->loLen += 4; - md5->buffLen = 0; - } else { - /* append partial to existing stored block */ - XMEMCPY((byte*)md5->buffer + md5->buffLen, data, len); - md5->buffLen += len; - return; - } - } - - /* write input block in the IN FIFO */ - for (i = 0; i < len; i += 4) - { - diff = len - i; - if (diff < 4) { - /* store incomplete last block, not yet in FIFO */ - XMEMSET(md5->buffer, 0, MD5_REG_SIZE); - XMEMCPY((byte*)md5->buffer, data, diff); - md5->buffLen = diff; - } else { - HASH_DataIn(*(uint32_t*)data); - data+=4; - } - } - - /* keep track of total data length thus far */ - md5->loLen += (len - md5->buffLen); - } - - void wc_Md5Final(Md5* md5, byte* hash) - { - __IO uint16_t nbvalidbitsdata = 0; - - /* finish reading any trailing bytes into FIFO */ - if (md5->buffLen > 0) { - HASH_DataIn(*(uint32_t*)md5->buffer); - md5->loLen += md5->buffLen; - } - - /* calculate number of valid bits in last word of input data */ - nbvalidbitsdata = 8 * (md5->loLen % MD5_REG_SIZE); - - /* configure number of valid bits in last word of the data */ - HASH_SetLastWordValidBitsNbr(nbvalidbitsdata); - - /* start HASH processor */ - HASH_StartDigest(); - - /* wait until Busy flag == RESET */ - while (HASH_GetFlagStatus(HASH_FLAG_BUSY) != RESET) {} - - /* read message digest */ - md5->digest[0] = HASH->HR[0]; - md5->digest[1] = HASH->HR[1]; - md5->digest[2] = HASH->HR[2]; - md5->digest[3] = HASH->HR[3]; - - ByteReverseWords(md5->digest, md5->digest, MD5_DIGEST_SIZE); - - XMEMCPY(hash, md5->digest, MD5_DIGEST_SIZE); - - wc_InitMd5(md5); /* reset state */ - } - -#elif defined(WOLFSSL_IT_HASH) - - /* defined in port/ti_md5.c */ - -#else /* CTaoCrypt software implementation */ - -#ifndef WOLFSSL_HAVE_MIN -#define WOLFSSL_HAVE_MIN - - static INLINE word32 min(word32 a, word32 b) - { - return a > b ? b : a; - } - -#endif /* WOLFSSL_HAVE_MIN */ - -#ifdef TI_HASH_TEST -void wc_InitMd5_ti(Md5* md5) ; -void wc_Md5Update_ti(Md5* md5, const byte* data, word32 len) ; -void wc_Md5Final_ti(Md5* md5, byte* hash) ; -#endif - -void wc_InitMd5(Md5* md5) -{ - md5->digest[0] = 0x67452301L; - md5->digest[1] = 0xefcdab89L; - md5->digest[2] = 0x98badcfeL; - md5->digest[3] = 0x10325476L; - - md5->buffLen = 0; - md5->loLen = 0; - md5->hiLen = 0; - -#ifdef TI_HASH_TEST - wc_InitMd5_ti(md5) ; -#endif -} - -#ifndef FREESCALE_MMCAU - -static void Transform(Md5* md5) -{ -#define F1(x, y, z) (z ^ (x & (y ^ z))) -#define F2(x, y, z) F1(z, x, y) -#define F3(x, y, z) (x ^ y ^ z) -#define F4(x, y, z) (y ^ (x | ~z)) - -#define MD5STEP(f, w, x, y, z, data, s) \ - w = rotlFixed(w + f(x, y, z) + data, s) + x - - /* Copy context->state[] to working vars */ - word32 a = md5->digest[0]; - word32 b = md5->digest[1]; - word32 c = md5->digest[2]; - word32 d = md5->digest[3]; - - MD5STEP(F1, a, b, c, d, md5->buffer[0] + 0xd76aa478, 7); - MD5STEP(F1, d, a, b, c, md5->buffer[1] + 0xe8c7b756, 12); - MD5STEP(F1, c, d, a, b, md5->buffer[2] + 0x242070db, 17); - MD5STEP(F1, b, c, d, a, md5->buffer[3] + 0xc1bdceee, 22); - MD5STEP(F1, a, b, c, d, md5->buffer[4] + 0xf57c0faf, 7); - MD5STEP(F1, d, a, b, c, md5->buffer[5] + 0x4787c62a, 12); - MD5STEP(F1, c, d, a, b, md5->buffer[6] + 0xa8304613, 17); - MD5STEP(F1, b, c, d, a, md5->buffer[7] + 0xfd469501, 22); - MD5STEP(F1, a, b, c, d, md5->buffer[8] + 0x698098d8, 7); - MD5STEP(F1, d, a, b, c, md5->buffer[9] + 0x8b44f7af, 12); - MD5STEP(F1, c, d, a, b, md5->buffer[10] + 0xffff5bb1, 17); - MD5STEP(F1, b, c, d, a, md5->buffer[11] + 0x895cd7be, 22); - MD5STEP(F1, a, b, c, d, md5->buffer[12] + 0x6b901122, 7); - MD5STEP(F1, d, a, b, c, md5->buffer[13] + 0xfd987193, 12); - MD5STEP(F1, c, d, a, b, md5->buffer[14] + 0xa679438e, 17); - MD5STEP(F1, b, c, d, a, md5->buffer[15] + 0x49b40821, 22); - - MD5STEP(F2, a, b, c, d, md5->buffer[1] + 0xf61e2562, 5); - MD5STEP(F2, d, a, b, c, md5->buffer[6] + 0xc040b340, 9); - MD5STEP(F2, c, d, a, b, md5->buffer[11] + 0x265e5a51, 14); - MD5STEP(F2, b, c, d, a, md5->buffer[0] + 0xe9b6c7aa, 20); - MD5STEP(F2, a, b, c, d, md5->buffer[5] + 0xd62f105d, 5); - MD5STEP(F2, d, a, b, c, md5->buffer[10] + 0x02441453, 9); - MD5STEP(F2, c, d, a, b, md5->buffer[15] + 0xd8a1e681, 14); - MD5STEP(F2, b, c, d, a, md5->buffer[4] + 0xe7d3fbc8, 20); - MD5STEP(F2, a, b, c, d, md5->buffer[9] + 0x21e1cde6, 5); - MD5STEP(F2, d, a, b, c, md5->buffer[14] + 0xc33707d6, 9); - MD5STEP(F2, c, d, a, b, md5->buffer[3] + 0xf4d50d87, 14); - MD5STEP(F2, b, c, d, a, md5->buffer[8] + 0x455a14ed, 20); - MD5STEP(F2, a, b, c, d, md5->buffer[13] + 0xa9e3e905, 5); - MD5STEP(F2, d, a, b, c, md5->buffer[2] + 0xfcefa3f8, 9); - MD5STEP(F2, c, d, a, b, md5->buffer[7] + 0x676f02d9, 14); - MD5STEP(F2, b, c, d, a, md5->buffer[12] + 0x8d2a4c8a, 20); - - MD5STEP(F3, a, b, c, d, md5->buffer[5] + 0xfffa3942, 4); - MD5STEP(F3, d, a, b, c, md5->buffer[8] + 0x8771f681, 11); - MD5STEP(F3, c, d, a, b, md5->buffer[11] + 0x6d9d6122, 16); - MD5STEP(F3, b, c, d, a, md5->buffer[14] + 0xfde5380c, 23); - MD5STEP(F3, a, b, c, d, md5->buffer[1] + 0xa4beea44, 4); - MD5STEP(F3, d, a, b, c, md5->buffer[4] + 0x4bdecfa9, 11); - MD5STEP(F3, c, d, a, b, md5->buffer[7] + 0xf6bb4b60, 16); - MD5STEP(F3, b, c, d, a, md5->buffer[10] + 0xbebfbc70, 23); - MD5STEP(F3, a, b, c, d, md5->buffer[13] + 0x289b7ec6, 4); - MD5STEP(F3, d, a, b, c, md5->buffer[0] + 0xeaa127fa, 11); - MD5STEP(F3, c, d, a, b, md5->buffer[3] + 0xd4ef3085, 16); - MD5STEP(F3, b, c, d, a, md5->buffer[6] + 0x04881d05, 23); - MD5STEP(F3, a, b, c, d, md5->buffer[9] + 0xd9d4d039, 4); - MD5STEP(F3, d, a, b, c, md5->buffer[12] + 0xe6db99e5, 11); - MD5STEP(F3, c, d, a, b, md5->buffer[15] + 0x1fa27cf8, 16); - MD5STEP(F3, b, c, d, a, md5->buffer[2] + 0xc4ac5665, 23); - - MD5STEP(F4, a, b, c, d, md5->buffer[0] + 0xf4292244, 6); - MD5STEP(F4, d, a, b, c, md5->buffer[7] + 0x432aff97, 10); - MD5STEP(F4, c, d, a, b, md5->buffer[14] + 0xab9423a7, 15); - MD5STEP(F4, b, c, d, a, md5->buffer[5] + 0xfc93a039, 21); - MD5STEP(F4, a, b, c, d, md5->buffer[12] + 0x655b59c3, 6); - MD5STEP(F4, d, a, b, c, md5->buffer[3] + 0x8f0ccc92, 10); - MD5STEP(F4, c, d, a, b, md5->buffer[10] + 0xffeff47d, 15); - MD5STEP(F4, b, c, d, a, md5->buffer[1] + 0x85845dd1, 21); - MD5STEP(F4, a, b, c, d, md5->buffer[8] + 0x6fa87e4f, 6); - MD5STEP(F4, d, a, b, c, md5->buffer[15] + 0xfe2ce6e0, 10); - MD5STEP(F4, c, d, a, b, md5->buffer[6] + 0xa3014314, 15); - MD5STEP(F4, b, c, d, a, md5->buffer[13] + 0x4e0811a1, 21); - MD5STEP(F4, a, b, c, d, md5->buffer[4] + 0xf7537e82, 6); - MD5STEP(F4, d, a, b, c, md5->buffer[11] + 0xbd3af235, 10); - MD5STEP(F4, c, d, a, b, md5->buffer[2] + 0x2ad7d2bb, 15); - MD5STEP(F4, b, c, d, a, md5->buffer[9] + 0xeb86d391, 21); - - /* Add the working vars back into digest state[] */ - md5->digest[0] += a; - md5->digest[1] += b; - md5->digest[2] += c; - md5->digest[3] += d; -} - -#endif /* FREESCALE_MMCAU */ - - -static INLINE void AddLength(Md5* md5, word32 len) -{ - word32 tmp = md5->loLen; - if ( (md5->loLen += len) < tmp) - md5->hiLen++; /* carry low to high */ -} - - -void wc_Md5Update(Md5* md5, const byte* data, word32 len) -{ - /* do block size increments */ - byte* local = (byte*)md5->buffer; - - while (len) { - word32 add = min(len, MD5_BLOCK_SIZE - md5->buffLen); - XMEMCPY(&local[md5->buffLen], data, add); - - md5->buffLen += add; - data += add; - len -= add; - - if (md5->buffLen == MD5_BLOCK_SIZE) { - #if defined(BIG_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) - ByteReverseWords(md5->buffer, md5->buffer, MD5_BLOCK_SIZE); - #endif - XTRANSFORM(md5, local); - AddLength(md5, MD5_BLOCK_SIZE); - md5->buffLen = 0; - } - } -#ifdef TI_HASH_TEST - wc_Md5Update_ti(md5, data, len) ; -#endif - -} - - -void wc_Md5Final(Md5* md5, byte* hash) -{ - byte* local = (byte*)md5->buffer; - - AddLength(md5, md5->buffLen); /* before adding pads */ - - local[md5->buffLen++] = 0x80; /* add 1 */ - - /* pad with zeros */ - if (md5->buffLen > MD5_PAD_SIZE) { - XMEMSET(&local[md5->buffLen], 0, MD5_BLOCK_SIZE - md5->buffLen); - md5->buffLen += MD5_BLOCK_SIZE - md5->buffLen; - - #if defined(BIG_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) - ByteReverseWords(md5->buffer, md5->buffer, MD5_BLOCK_SIZE); - #endif - XTRANSFORM(md5, local); - md5->buffLen = 0; - } - XMEMSET(&local[md5->buffLen], 0, MD5_PAD_SIZE - md5->buffLen); - - /* put lengths in bits */ - md5->hiLen = (md5->loLen >> (8*sizeof(md5->loLen) - 3)) + - (md5->hiLen << 3); - md5->loLen = md5->loLen << 3; - - /* store lengths */ - #if defined(BIG_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) - ByteReverseWords(md5->buffer, md5->buffer, MD5_BLOCK_SIZE); - #endif - /* ! length ordering dependent on digest endian type ! */ - XMEMCPY(&local[MD5_PAD_SIZE], &md5->loLen, sizeof(word32)); - XMEMCPY(&local[MD5_PAD_SIZE + sizeof(word32)], &md5->hiLen, sizeof(word32)); - - XTRANSFORM(md5, local); - #ifdef BIG_ENDIAN_ORDER - ByteReverseWords(md5->digest, md5->digest, MD5_DIGEST_SIZE); - #endif - XMEMCPY(hash, md5->digest, MD5_DIGEST_SIZE); - - wc_InitMd5(md5); /* reset state */ - -#ifdef TI_HASH_TEST - wc_Md5Final_ti(md5, hash) ; -#endif -} - -#endif /* STM32F2_HASH */ - - -int wc_Md5Hash(const byte* data, word32 len, byte* hash) -{ -#ifdef WOLFSSL_SMALL_STACK - Md5* md5; -#else - Md5 md5[1]; -#endif - -#ifdef WOLFSSL_SMALL_STACK - md5 = (Md5*)XMALLOC(sizeof(Md5), NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (md5 == NULL) - return MEMORY_E; -#endif - - wc_InitMd5(md5); - wc_Md5Update(md5, data, len); - wc_Md5Final(md5, hash); - -#ifdef WOLFSSL_SMALL_STACK - XFREE(md5, NULL, DYNAMIC_TYPE_TMP_BUFFER); -#endif - - return 0; -} - -#if defined(WOLFSSL_TI_HASH)||defined(TI_HASH_TEST) -#include "wolfssl/wolfcrypt/port/ti/ti-hash.h" -#endif -void wc_Md5GetHash(Md5* md5, byte* hash) -{ -#if defined(WOLFSSL_TI_HASH) || defined(TI_HASH_TEST) - wc_Md5GetHash_ti(md5, hash) ; -#else - Md5 save = *md5 ; - wc_Md5Final(md5, hash) ; - *md5 = save ; -#endif -} -#endif /* NO_MD5 */ +/* md5.c + * + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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. + * + * wolfSSL 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 + */ + + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#if !defined(NO_MD5) && !defined(WOLFSSL_TI_HASH) + +#ifdef WOLFSSL_PIC32MZ_HASH +#define wc_InitMd5 wc_InitMd5_sw +#define wc_Md5Update wc_Md5Update_sw +#define wc_Md5Final wc_Md5Final_sw +#endif + +#include +#include + +#ifdef NO_INLINE + #include +#else + #include +#endif + +#ifdef FREESCALE_MMCAU + #include "cau_api.h" + #define XTRANSFORM(S,B) cau_md5_hash_n((B), 1, (unsigned char*)(S)->digest) +#else + #define XTRANSFORM(S,B) Transform((S)) +#endif + + +#ifdef STM32F2_HASH + /* + * STM32F2 hardware MD5 support through the STM32F2 standard peripheral + * library. Documentation located in STM32F2xx Standard Peripheral Library + * document (See note in README). + */ + #include "stm32f2xx.h" + + void wc_InitMd5(Md5* md5) + { + /* STM32F2 struct notes: + * md5->buffer = first 4 bytes used to hold partial block if needed + * md5->buffLen = num bytes currently stored in md5->buffer + * md5->loLen = num bytes that have been written to STM32 FIFO + */ + XMEMSET(md5->buffer, 0, MD5_REG_SIZE); + + md5->buffLen = 0; + md5->loLen = 0; + + /* initialize HASH peripheral */ + HASH_DeInit(); + + /* configure algo used, algo mode, datatype */ + HASH->CR &= ~ (HASH_CR_ALGO | HASH_CR_DATATYPE | HASH_CR_MODE); + HASH->CR |= (HASH_AlgoSelection_MD5 | HASH_AlgoMode_HASH + | HASH_DataType_8b); + + /* reset HASH processor */ + HASH->CR |= HASH_CR_INIT; + } + + void wc_Md5Update(Md5* md5, const byte* data, word32 len) + { + word32 i = 0; + word32 fill = 0; + word32 diff = 0; + + /* if saved partial block is available */ + if (md5->buffLen > 0) { + fill = 4 - md5->buffLen; + + /* if enough data to fill, fill and push to FIFO */ + if (fill <= len) { + XMEMCPY((byte*)md5->buffer + md5->buffLen, data, fill); + HASH_DataIn(*(uint32_t*)md5->buffer); + + data += fill; + len -= fill; + md5->loLen += 4; + md5->buffLen = 0; + } else { + /* append partial to existing stored block */ + XMEMCPY((byte*)md5->buffer + md5->buffLen, data, len); + md5->buffLen += len; + return; + } + } + + /* write input block in the IN FIFO */ + for (i = 0; i < len; i += 4) + { + diff = len - i; + if (diff < 4) { + /* store incomplete last block, not yet in FIFO */ + XMEMSET(md5->buffer, 0, MD5_REG_SIZE); + XMEMCPY((byte*)md5->buffer, data, diff); + md5->buffLen = diff; + } else { + HASH_DataIn(*(uint32_t*)data); + data+=4; + } + } + + /* keep track of total data length thus far */ + md5->loLen += (len - md5->buffLen); + } + + void wc_Md5Final(Md5* md5, byte* hash) + { + __IO uint16_t nbvalidbitsdata = 0; + + /* finish reading any trailing bytes into FIFO */ + if (md5->buffLen > 0) { + HASH_DataIn(*(uint32_t*)md5->buffer); + md5->loLen += md5->buffLen; + } + + /* calculate number of valid bits in last word of input data */ + nbvalidbitsdata = 8 * (md5->loLen % MD5_REG_SIZE); + + /* configure number of valid bits in last word of the data */ + HASH_SetLastWordValidBitsNbr(nbvalidbitsdata); + + /* start HASH processor */ + HASH_StartDigest(); + + /* wait until Busy flag == RESET */ + while (HASH_GetFlagStatus(HASH_FLAG_BUSY) != RESET) {} + + /* read message digest */ + md5->digest[0] = HASH->HR[0]; + md5->digest[1] = HASH->HR[1]; + md5->digest[2] = HASH->HR[2]; + md5->digest[3] = HASH->HR[3]; + + ByteReverseWords(md5->digest, md5->digest, MD5_DIGEST_SIZE); + + XMEMCPY(hash, md5->digest, MD5_DIGEST_SIZE); + + wc_InitMd5(md5); /* reset state */ + } + +#elif defined(WOLFSSL_IT_HASH) + + /* defined in port/ti_md5.c */ + +#else /* CTaoCrypt software implementation */ + +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN + + static INLINE word32 min(word32 a, word32 b) + { + return a > b ? b : a; + } + +#endif /* WOLFSSL_HAVE_MIN */ + +#ifdef TI_HASH_TEST +void wc_InitMd5_ti(Md5* md5) ; +void wc_Md5Update_ti(Md5* md5, const byte* data, word32 len) ; +void wc_Md5Final_ti(Md5* md5, byte* hash) ; +#endif + +void wc_InitMd5(Md5* md5) +{ + md5->digest[0] = 0x67452301L; + md5->digest[1] = 0xefcdab89L; + md5->digest[2] = 0x98badcfeL; + md5->digest[3] = 0x10325476L; + + md5->buffLen = 0; + md5->loLen = 0; + md5->hiLen = 0; + +#ifdef TI_HASH_TEST + wc_InitMd5_ti(md5) ; +#endif +} + +#ifndef FREESCALE_MMCAU + +static void Transform(Md5* md5) +{ +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define F2(x, y, z) F1(z, x, y) +#define F3(x, y, z) (x ^ y ^ z) +#define F4(x, y, z) (y ^ (x | ~z)) + +#define MD5STEP(f, w, x, y, z, data, s) \ + w = rotlFixed(w + f(x, y, z) + data, s) + x + + /* Copy context->state[] to working vars */ + word32 a = md5->digest[0]; + word32 b = md5->digest[1]; + word32 c = md5->digest[2]; + word32 d = md5->digest[3]; + + MD5STEP(F1, a, b, c, d, md5->buffer[0] + 0xd76aa478, 7); + MD5STEP(F1, d, a, b, c, md5->buffer[1] + 0xe8c7b756, 12); + MD5STEP(F1, c, d, a, b, md5->buffer[2] + 0x242070db, 17); + MD5STEP(F1, b, c, d, a, md5->buffer[3] + 0xc1bdceee, 22); + MD5STEP(F1, a, b, c, d, md5->buffer[4] + 0xf57c0faf, 7); + MD5STEP(F1, d, a, b, c, md5->buffer[5] + 0x4787c62a, 12); + MD5STEP(F1, c, d, a, b, md5->buffer[6] + 0xa8304613, 17); + MD5STEP(F1, b, c, d, a, md5->buffer[7] + 0xfd469501, 22); + MD5STEP(F1, a, b, c, d, md5->buffer[8] + 0x698098d8, 7); + MD5STEP(F1, d, a, b, c, md5->buffer[9] + 0x8b44f7af, 12); + MD5STEP(F1, c, d, a, b, md5->buffer[10] + 0xffff5bb1, 17); + MD5STEP(F1, b, c, d, a, md5->buffer[11] + 0x895cd7be, 22); + MD5STEP(F1, a, b, c, d, md5->buffer[12] + 0x6b901122, 7); + MD5STEP(F1, d, a, b, c, md5->buffer[13] + 0xfd987193, 12); + MD5STEP(F1, c, d, a, b, md5->buffer[14] + 0xa679438e, 17); + MD5STEP(F1, b, c, d, a, md5->buffer[15] + 0x49b40821, 22); + + MD5STEP(F2, a, b, c, d, md5->buffer[1] + 0xf61e2562, 5); + MD5STEP(F2, d, a, b, c, md5->buffer[6] + 0xc040b340, 9); + MD5STEP(F2, c, d, a, b, md5->buffer[11] + 0x265e5a51, 14); + MD5STEP(F2, b, c, d, a, md5->buffer[0] + 0xe9b6c7aa, 20); + MD5STEP(F2, a, b, c, d, md5->buffer[5] + 0xd62f105d, 5); + MD5STEP(F2, d, a, b, c, md5->buffer[10] + 0x02441453, 9); + MD5STEP(F2, c, d, a, b, md5->buffer[15] + 0xd8a1e681, 14); + MD5STEP(F2, b, c, d, a, md5->buffer[4] + 0xe7d3fbc8, 20); + MD5STEP(F2, a, b, c, d, md5->buffer[9] + 0x21e1cde6, 5); + MD5STEP(F2, d, a, b, c, md5->buffer[14] + 0xc33707d6, 9); + MD5STEP(F2, c, d, a, b, md5->buffer[3] + 0xf4d50d87, 14); + MD5STEP(F2, b, c, d, a, md5->buffer[8] + 0x455a14ed, 20); + MD5STEP(F2, a, b, c, d, md5->buffer[13] + 0xa9e3e905, 5); + MD5STEP(F2, d, a, b, c, md5->buffer[2] + 0xfcefa3f8, 9); + MD5STEP(F2, c, d, a, b, md5->buffer[7] + 0x676f02d9, 14); + MD5STEP(F2, b, c, d, a, md5->buffer[12] + 0x8d2a4c8a, 20); + + MD5STEP(F3, a, b, c, d, md5->buffer[5] + 0xfffa3942, 4); + MD5STEP(F3, d, a, b, c, md5->buffer[8] + 0x8771f681, 11); + MD5STEP(F3, c, d, a, b, md5->buffer[11] + 0x6d9d6122, 16); + MD5STEP(F3, b, c, d, a, md5->buffer[14] + 0xfde5380c, 23); + MD5STEP(F3, a, b, c, d, md5->buffer[1] + 0xa4beea44, 4); + MD5STEP(F3, d, a, b, c, md5->buffer[4] + 0x4bdecfa9, 11); + MD5STEP(F3, c, d, a, b, md5->buffer[7] + 0xf6bb4b60, 16); + MD5STEP(F3, b, c, d, a, md5->buffer[10] + 0xbebfbc70, 23); + MD5STEP(F3, a, b, c, d, md5->buffer[13] + 0x289b7ec6, 4); + MD5STEP(F3, d, a, b, c, md5->buffer[0] + 0xeaa127fa, 11); + MD5STEP(F3, c, d, a, b, md5->buffer[3] + 0xd4ef3085, 16); + MD5STEP(F3, b, c, d, a, md5->buffer[6] + 0x04881d05, 23); + MD5STEP(F3, a, b, c, d, md5->buffer[9] + 0xd9d4d039, 4); + MD5STEP(F3, d, a, b, c, md5->buffer[12] + 0xe6db99e5, 11); + MD5STEP(F3, c, d, a, b, md5->buffer[15] + 0x1fa27cf8, 16); + MD5STEP(F3, b, c, d, a, md5->buffer[2] + 0xc4ac5665, 23); + + MD5STEP(F4, a, b, c, d, md5->buffer[0] + 0xf4292244, 6); + MD5STEP(F4, d, a, b, c, md5->buffer[7] + 0x432aff97, 10); + MD5STEP(F4, c, d, a, b, md5->buffer[14] + 0xab9423a7, 15); + MD5STEP(F4, b, c, d, a, md5->buffer[5] + 0xfc93a039, 21); + MD5STEP(F4, a, b, c, d, md5->buffer[12] + 0x655b59c3, 6); + MD5STEP(F4, d, a, b, c, md5->buffer[3] + 0x8f0ccc92, 10); + MD5STEP(F4, c, d, a, b, md5->buffer[10] + 0xffeff47d, 15); + MD5STEP(F4, b, c, d, a, md5->buffer[1] + 0x85845dd1, 21); + MD5STEP(F4, a, b, c, d, md5->buffer[8] + 0x6fa87e4f, 6); + MD5STEP(F4, d, a, b, c, md5->buffer[15] + 0xfe2ce6e0, 10); + MD5STEP(F4, c, d, a, b, md5->buffer[6] + 0xa3014314, 15); + MD5STEP(F4, b, c, d, a, md5->buffer[13] + 0x4e0811a1, 21); + MD5STEP(F4, a, b, c, d, md5->buffer[4] + 0xf7537e82, 6); + MD5STEP(F4, d, a, b, c, md5->buffer[11] + 0xbd3af235, 10); + MD5STEP(F4, c, d, a, b, md5->buffer[2] + 0x2ad7d2bb, 15); + MD5STEP(F4, b, c, d, a, md5->buffer[9] + 0xeb86d391, 21); + + /* Add the working vars back into digest state[] */ + md5->digest[0] += a; + md5->digest[1] += b; + md5->digest[2] += c; + md5->digest[3] += d; +} + +#endif /* FREESCALE_MMCAU */ + + +static INLINE void AddLength(Md5* md5, word32 len) +{ + word32 tmp = md5->loLen; + if ( (md5->loLen += len) < tmp) + md5->hiLen++; /* carry low to high */ +} + + +void wc_Md5Update(Md5* md5, const byte* data, word32 len) +{ + /* do block size increments */ + byte* local = (byte*)md5->buffer; + + while (len) { + word32 add = min(len, MD5_BLOCK_SIZE - md5->buffLen); + XMEMCPY(&local[md5->buffLen], data, add); + + md5->buffLen += add; + data += add; + len -= add; + + if (md5->buffLen == MD5_BLOCK_SIZE) { + #if defined(BIG_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) + ByteReverseWords(md5->buffer, md5->buffer, MD5_BLOCK_SIZE); + #endif + XTRANSFORM(md5, local); + AddLength(md5, MD5_BLOCK_SIZE); + md5->buffLen = 0; + } + } +#ifdef TI_HASH_TEST + wc_Md5Update_ti(md5, data, len) ; +#endif + +} + + +void wc_Md5Final(Md5* md5, byte* hash) +{ + byte* local = (byte*)md5->buffer; + + AddLength(md5, md5->buffLen); /* before adding pads */ + + local[md5->buffLen++] = 0x80; /* add 1 */ + + /* pad with zeros */ + if (md5->buffLen > MD5_PAD_SIZE) { + XMEMSET(&local[md5->buffLen], 0, MD5_BLOCK_SIZE - md5->buffLen); + md5->buffLen += MD5_BLOCK_SIZE - md5->buffLen; + + #if defined(BIG_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) + ByteReverseWords(md5->buffer, md5->buffer, MD5_BLOCK_SIZE); + #endif + XTRANSFORM(md5, local); + md5->buffLen = 0; + } + XMEMSET(&local[md5->buffLen], 0, MD5_PAD_SIZE - md5->buffLen); + + /* put lengths in bits */ + md5->hiLen = (md5->loLen >> (8*sizeof(md5->loLen) - 3)) + + (md5->hiLen << 3); + md5->loLen = md5->loLen << 3; + + /* store lengths */ + #if defined(BIG_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) + ByteReverseWords(md5->buffer, md5->buffer, MD5_BLOCK_SIZE); + #endif + /* ! length ordering dependent on digest endian type ! */ + XMEMCPY(&local[MD5_PAD_SIZE], &md5->loLen, sizeof(word32)); + XMEMCPY(&local[MD5_PAD_SIZE + sizeof(word32)], &md5->hiLen, sizeof(word32)); + + XTRANSFORM(md5, local); + #ifdef BIG_ENDIAN_ORDER + ByteReverseWords(md5->digest, md5->digest, MD5_DIGEST_SIZE); + #endif + XMEMCPY(hash, md5->digest, MD5_DIGEST_SIZE); + + wc_InitMd5(md5); /* reset state */ + +#ifdef TI_HASH_TEST + wc_Md5Final_ti(md5, hash) ; +#endif +} + +#endif /* STM32F2_HASH */ + + +int wc_Md5Hash(const byte* data, word32 len, byte* hash) +{ +#ifdef WOLFSSL_SMALL_STACK + Md5* md5; +#else + Md5 md5[1]; +#endif + +#ifdef WOLFSSL_SMALL_STACK + md5 = (Md5*)XMALLOC(sizeof(Md5), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (md5 == NULL) + return MEMORY_E; +#endif + + wc_InitMd5(md5); + wc_Md5Update(md5, data, len); + wc_Md5Final(md5, hash); + +#ifdef WOLFSSL_SMALL_STACK + XFREE(md5, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return 0; +} + +#if defined(WOLFSSL_TI_HASH)||defined(TI_HASH_TEST) +#include "wolfssl/wolfcrypt/port/ti/ti-hash.h" +#endif +void wc_Md5GetHash(Md5* md5, byte* hash) +{ +#if defined(WOLFSSL_TI_HASH) || defined(TI_HASH_TEST) + wc_Md5GetHash_ti(md5, hash) ; +#else + Md5 save = *md5 ; + wc_Md5Final(md5, hash) ; + *md5 = save ; +#endif +} +#endif /* NO_MD5 */ diff --git a/wolfcrypt/src/port/ti/ti-aes.c b/wolfcrypt/src/port/ti/ti-aes.c index 11a0680b6..8ca83385c 100644 --- a/wolfcrypt/src/port/ti/ti-aes.c +++ b/wolfcrypt/src/port/ti/ti-aes.c @@ -1,548 +1,548 @@ -/* port/ti/ti-aes.c - * - * Copyright (C) 2006-2015 wolfSSL Inc. - * - * This file is part of wolfSSL. (formerly known as CyaSSL) - * - * wolfSSL 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. - * - * wolfSSL 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 - */ - -#ifdef HAVE_CONFIG_H - #include -#endif - -#include - -#ifndef NO_AES - - -#if defined(WOLFSSL_TI_CRYPT) -#include -#include - -#include -#include -#include - -#include "inc/hw_aes.h" -#include "inc/hw_memmap.h" -#include "inc/hw_ints.h" -#include "driverlib/aes.h" -#include "driverlib/sysctl.h" -#include "driverlib/rom_map.h" -#include "driverlib/rom.h" - -static int AesSetIV(Aes* aes, const byte* iv) -{ - if (aes == NULL) - return BAD_FUNC_ARG; - - if (iv) - XMEMCPY(aes->reg, iv, AES_BLOCK_SIZE); - else - XMEMSET(aes->reg, 0, AES_BLOCK_SIZE); - - return 0; -} - -WOLFSSL_API int wc_AesSetKey(Aes* aes, const byte* key, word32 len, const byte* iv, - int dir) -{ - if(!wolfSSL_TI_CCMInit())return 1 ; - if ((aes == NULL) || (key == NULL) || (iv == NULL)) - return BAD_FUNC_ARG; - if(!((dir == AES_ENCRYPTION) || (dir == AES_DECRYPTION))) - return BAD_FUNC_ARG; - - switch(len) { - case 16: aes->keylen = AES_CFG_KEY_SIZE_128BIT ; break ; - case 24: aes->keylen = AES_CFG_KEY_SIZE_192BIT ; break ; - case 32: aes->keylen = AES_CFG_KEY_SIZE_256BIT ; break ; - default: return BAD_FUNC_ARG; - } - - XMEMCPY(aes->key, key, len) ; - #ifdef WOLFSSL_AES_COUNTER - aes->left = 0; - #endif /* WOLFSSL_AES_COUNTER */ - return AesSetIV(aes, iv); -} - -#define AES_CFG_MODE_CTR_NOCTR AES_CFG_MODE_CTR+100 -#define IS_ALIGN16(p) (((unsigned int)(p)&0xf) == 0) - -static int AesAlign16(Aes* aes, byte* out, const byte* in, word32 sz, word32 dir, word32 mode) -{ - wolfSSL_TI_lockCCM() ; - ROM_AESReset(AES_BASE); - ROM_AESConfigSet(AES_BASE, (aes->keylen | dir | - (mode==AES_CFG_MODE_CTR_NOCTR ? AES_CFG_MODE_CTR : mode))); - AESIVSet(AES_BASE, aes->reg); - ROM_AESKey1Set(AES_BASE, aes->key, aes->keylen); - if((dir == AES_CFG_DIR_DECRYPT)&& (mode == AES_CFG_MODE_CBC)) - /* if input and output same will overwrite input iv */ - XMEMCPY(aes->tmp, in + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE); - ROM_AESDataProcess(AES_BASE, (uint32_t *)in, (uint32_t *)out, sz); - wolfSSL_TI_unlockCCM() ; - - /* store iv for next call */ - if(mode == AES_CFG_MODE_CBC){ - if(dir == AES_CFG_DIR_ENCRYPT) - XMEMCPY(aes->reg, out + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE); - else - XMEMCPY(aes->reg, aes->tmp, AES_BLOCK_SIZE); - } - - if(mode == AES_CFG_MODE_CTR) { - do { - int i ; - for (i = AES_BLOCK_SIZE - 1; i >= 0; i--) { - if (++((byte *)aes->reg)[i]) - break ; - } - sz -= AES_BLOCK_SIZE ; - } while((int)sz > 0) ; - } - - return 0 ; -} - -static int AesProcess(Aes* aes, byte* out, const byte* in, word32 sz, word32 dir, word32 mode) -{ - const byte * in_p ; byte * out_p ; - word32 size ; - #define TI_BUFFSIZE 1024 - byte buff[TI_BUFFSIZE] ; - - if ((aes == NULL) || (in == NULL) || (out == NULL)) - return BAD_FUNC_ARG; - if(sz % AES_BLOCK_SIZE) - return BAD_FUNC_ARG; - - while(sz > 0) { - size = sz ; in_p = in ; out_p = out ; - if(!IS_ALIGN16(in)){ - size = sz>TI_BUFFSIZE ? TI_BUFFSIZE : sz ; - XMEMCPY(buff, in, size) ; - in_p = (const byte *)buff ; - } - if(!IS_ALIGN16(out)){ - size = sz>TI_BUFFSIZE ? TI_BUFFSIZE : sz ; - out_p = buff ; - } - - AesAlign16(aes, out_p, in_p, size, dir, mode) ; - - if(!IS_ALIGN16(out)){ - XMEMCPY(out, buff, size) ; - } - sz -= size ; in += size ; out += size ; - } - - return 0 ; -} - -WOLFSSL_API int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) -{ - return AesProcess(aes, out, in, sz, AES_CFG_DIR_ENCRYPT, AES_CFG_MODE_CBC) ; -} - -WOLFSSL_API int wc_AesCbcDecrypt(Aes* aes, byte* out, const byte* in, word32 sz) -{ - return AesProcess(aes, out, in, sz, AES_CFG_DIR_DECRYPT, AES_CFG_MODE_CBC) ; -} - -#ifdef WOLFSSL_AES_COUNTER -WOLFSSL_API void wc_AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) -{ - char out_block[AES_BLOCK_SIZE] ; - int odd ; - int even ; - char *tmp ; /* (char *)aes->tmp, for short */ - - tmp = (char *)aes->tmp ; - if(aes->left) { - if((aes->left + sz) >= AES_BLOCK_SIZE){ - odd = AES_BLOCK_SIZE - aes->left ; - } else { - odd = sz ; - } - XMEMCPY(tmp+aes->left, in, odd) ; - if((odd+aes->left) == AES_BLOCK_SIZE){ - AesProcess(aes, (byte *)out_block, (byte const *)tmp, AES_BLOCK_SIZE, - AES_CFG_DIR_ENCRYPT, AES_CFG_MODE_CTR) ; - XMEMCPY(out, out_block+aes->left, odd) ; - aes->left = 0 ; - XMEMSET(tmp, 0x0, AES_BLOCK_SIZE) ; - } - in += odd ; - out+= odd ; - sz -= odd ; - } - odd = sz % AES_BLOCK_SIZE ; /* if there is tail flagment */ - if(sz / AES_BLOCK_SIZE) { - even = (sz/AES_BLOCK_SIZE)*AES_BLOCK_SIZE ; - AesProcess(aes, out, in, even, AES_CFG_DIR_ENCRYPT, AES_CFG_MODE_CTR); - out += even ; - in += even ; - } - if(odd) { - XMEMSET(tmp+aes->left, 0x0, AES_BLOCK_SIZE - aes->left) ; - XMEMCPY(tmp+aes->left, in, odd) ; - AesProcess(aes, (byte *)out_block, (byte const *)tmp, AES_BLOCK_SIZE, - AES_CFG_DIR_ENCRYPT, - AES_CFG_MODE_CTR_NOCTR /* Counter mode without counting IV */ - ); - XMEMCPY(out, out_block+aes->left,odd) ; - aes->left += odd ; - } -} -#endif - -/* AES-DIRECT */ -#if defined(WOLFSSL_AES_DIRECT) -WOLFSSL_API void wc_AesEncryptDirect(Aes* aes, byte* out, const byte* in) -{ - AesProcess(aes, out, in, AES_BLOCK_SIZE, AES_CFG_DIR_ENCRYPT, AES_CFG_MODE_CBC) ; -} -WOLFSSL_API void wc_AesDecryptDirect(Aes* aes, byte* out, const byte* in) -{ - AesProcess(aes, out, in, AES_BLOCK_SIZE, AES_CFG_DIR_DECRYPT, AES_CFG_MODE_CBC) ; -} -WOLFSSL_API int wc_AesSetKeyDirect(Aes* aes, const byte* key, word32 len, - const byte* iv, int dir) -{ - return(wc_AesSetKey(aes, key, len, iv, dir)) ; -} -#endif - - -#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) - -static int AesAuthSetKey(Aes* aes, const byte* key, word32 keySz) -{ - byte nonce[AES_BLOCK_SIZE]; - - if ((aes == NULL) || (key == NULL)) - return BAD_FUNC_ARG ; - if (!((keySz == 16) || (keySz == 24) || (keySz == 32))) - return BAD_FUNC_ARG ; - - XMEMSET(nonce, 0, sizeof(nonce)); - return wc_AesSetKey(aes, key, keySz, nonce, AES_ENCRYPTION); -} - - -static int AesAuthArgCheck(Aes* aes, byte* out, const byte* in, word32 inSz, - const byte* nonce, word32 nonceSz, - const byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz, word32 *M, word32 *L) -{ - if((aes == NULL)||(nonce == NULL)||(authTag== NULL)||(authIn == NULL)) - return BAD_FUNC_ARG; - if((inSz != 0) && ((out == NULL)||(in == NULL))) - return BAD_FUNC_ARG; - - switch(authTagSz){ - case 4: - *M = AES_CFG_CCM_M_4; break ; - case 6: - *M = AES_CFG_CCM_M_6; break ; - case 8: - *M = AES_CFG_CCM_M_8; break ; - case 10: - *M = AES_CFG_CCM_M_10; break ; - case 12: - *M = AES_CFG_CCM_M_12; break ; - case 14: - *M = AES_CFG_CCM_M_14; break ; - case 16: - *M = AES_CFG_CCM_M_16; break ; - default: - return 1 ; - } - - switch(nonceSz){ - case 7: - *L = AES_CFG_CCM_L_8; break ; - case 8: - *L = AES_CFG_CCM_L_7; break ; - case 9: - *L = AES_CFG_CCM_L_6; break ; - case 10: - *L = AES_CFG_CCM_L_5; break ; - case 11: - *L = AES_CFG_CCM_L_4; break ; - case 12: - *L = AES_CFG_CCM_L_3; break ; - case 13: - *L = AES_CFG_CCM_L_2; break ; - case 14: - *L = AES_CFG_CCM_L_1; break ; - default: - return 1; - } - return 0 ; -} - -static void AesAuthSetIv(Aes *aes, const byte *nonce, word32 len, word32 L, int mode) { - - if(mode == AES_CFG_MODE_CCM){ - XMEMSET(aes->reg, 0, 16) ; - switch(L){ - case AES_CFG_CCM_L_8: - aes->reg[0] = 0x7; break ; - case AES_CFG_CCM_L_7: - aes->reg[0] = 0x6; break ; - case AES_CFG_CCM_L_6: - aes->reg[0] = 0x5; break ; - case AES_CFG_CCM_L_5: - aes->reg[0] = 0x4; break ; - case AES_CFG_CCM_L_4: - aes->reg[0] = 0x3; break ; - case AES_CFG_CCM_L_3: - aes->reg[0] = 0x2; break ; - case AES_CFG_CCM_L_2: - aes->reg[0] = 0x1; break ; - case AES_CFG_CCM_L_1: - aes->reg[0] = 0x0; break ; - } - XMEMCPY(((byte *)aes->reg)+1, nonce, len) ; - } else { - byte *b = (byte *)aes->reg ; - XMEMSET(aes->reg, 0, AES_BLOCK_SIZE); - XMEMCPY(aes->reg, nonce, len); - b[AES_BLOCK_SIZE-4] = 0 ; - b[AES_BLOCK_SIZE-3] = 0 ; - b[AES_BLOCK_SIZE-2] = 0 ; - b[AES_BLOCK_SIZE-1] = 1 ; - } -} - -#define RoundUp16(n) ((n+15)&0xfffffff0) -#define FREE_ALL \ - if(in_save) XFREE(in_save, NULL, DYNAMIC_TYPE_TMP_BUFFER);\ - if(out_save) XFREE(out_save, NULL, DYNAMIC_TYPE_TMP_BUFFER);\ - if(authIn_save)XFREE(authIn_save, NULL, DYNAMIC_TYPE_TMP_BUFFER);\ - if(nonce_save) XFREE(nonce_save, NULL, DYNAMIC_TYPE_TMP_BUFFER); - -static int AesAuthEncrypt(Aes* aes, byte* out, const byte* in, word32 inSz, - const byte* nonce, word32 nonceSz, - byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz, int mode) -{ - word32 M, L ; - byte *in_a, *in_save ; - byte *out_a, *out_save ; - byte *authIn_a, *authIn_save ; - byte *nonce_a, *nonce_save ; - word32 tmpTag[4] ; - int ret ; - - if(AesAuthArgCheck(aes, out, in, inSz, nonce, nonceSz, authTag, authTagSz, authIn, authInSz, &M, &L) - == BAD_FUNC_ARG)return BAD_FUNC_ARG ; - - /* 16 byte padding */ - in_save = NULL ; out_save = NULL ; authIn_save = NULL ; nonce_save = NULL ; - if((inSz%16)==0){ - in_save = NULL ; in_a = (byte *)in ; - out_save = NULL ; out_a = out ; - } else { - if((in_save = XMALLOC(RoundUp16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ - FREE_ALL; return MEMORY_E ; } - in_a = in_save ; XMEMSET(in_a, 0, RoundUp16(inSz)) ; XMEMCPY(in_a, in, inSz) ; - - if((out_save = XMALLOC(RoundUp16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ - FREE_ALL; return MEMORY_E ; } - out_a = out_save ; - } - - if((authInSz%16)==0){ - authIn_save = NULL ; authIn_a = (byte *)authIn ; - } else { - if((authIn_save = XMALLOC(RoundUp16(authInSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ - FREE_ALL; return MEMORY_E ; } - authIn_a = authIn_save ; XMEMSET(authIn_a, 0, RoundUp16(authInSz)) ; XMEMCPY(authIn_a, authIn, authInSz) ; - } - - if((nonceSz%16)==0){ - nonce_save = NULL ; nonce_a = (byte *)nonce ; - } else { - if((nonce_save = XMALLOC(RoundUp16(nonceSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ - FREE_ALL; return MEMORY_E; } - nonce_a = nonce_save ; XMEMSET(nonce_a, 0, RoundUp16(nonceSz)) ; XMEMCPY(nonce_a, nonce, nonceSz) ; - } - - /* do aes-ccm */ - AesAuthSetIv(aes, nonce, nonceSz, L, mode) ; - ROM_AESReset(AES_BASE); - ROM_AESConfigSet(AES_BASE, (aes->keylen | AES_CFG_DIR_ENCRYPT | - AES_CFG_CTR_WIDTH_128 | - mode | ((mode== AES_CFG_MODE_CCM) ? (L | M) : 0 ))) ; - ROM_AESIVSet(AES_BASE, aes->reg); - ROM_AESKey1Set(AES_BASE, aes->key, aes->keylen); - ret = ROM_AESDataProcessAuth(AES_BASE, (unsigned int*)in_a, (unsigned int *)out_a, inSz, - (unsigned int*)authIn_a, authInSz, (unsigned int *)tmpTag); - if(ret == false){ - XMEMSET(out, 0, inSz) ; - XMEMSET(authTag, 0, authTagSz) ; - } else { - XMEMCPY(out, out_a, inSz) ; - XMEMCPY(authTag, tmpTag, authTagSz) ; - } - - FREE_ALL; - return 0 ; -} - -static int AesAuthDecrypt(Aes* aes, byte* out, const byte* in, word32 inSz, - const byte* nonce, word32 nonceSz, - const byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz, int mode) -{ - word32 M, L ; - byte *in_a, *in_save ; - byte *out_a, *out_save ; - byte *authIn_a, *authIn_save ; - byte *nonce_a, *nonce_save ; - word32 tmpTag[4] ; - bool ret ; - - if(AesAuthArgCheck(aes, out, in, inSz, nonce, nonceSz, authTag, authTagSz, authIn, authInSz, &M, &L) - == BAD_FUNC_ARG)return BAD_FUNC_ARG ; - - /* 16 byte padding */ - in_save = NULL ; out_save = NULL ; authIn_save = NULL ; nonce_save = NULL ; - if((inSz%16)==0){ - in_save = NULL ; in_a = (byte *)in ; - out_save = NULL ; out_a = out ; - } else { - if((in_save = XMALLOC(RoundUp16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ - FREE_ALL; return MEMORY_E;} - in_a = in_save ; XMEMSET(in_a, 0, RoundUp16(inSz)) ; XMEMCPY(in_a, in, inSz) ; - - if((out_save = XMALLOC(RoundUp16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ - FREE_ALL; return MEMORY_E;} - out_a = out_save ; - } - - if((authInSz%16)==0){ - authIn_save = NULL ; authIn_a = (byte *)authIn ; - } else { - if((authIn_save = XMALLOC(RoundUp16(authInSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ - FREE_ALL; return MEMORY_E; } - authIn_a = authIn_save ; XMEMSET(authIn_a, 0, RoundUp16(authInSz)) ; XMEMCPY(authIn_a, authIn, authInSz) ; - } - - if((nonceSz%16)==0){ - nonce_save = NULL ; nonce_a = (byte *)nonce ; - } else { - if((nonce_save = XMALLOC(RoundUp16(nonceSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ - FREE_ALL; return MEMORY_E; } - nonce_a = nonce_save ; XMEMSET(nonce_a, 0, RoundUp16(nonceSz)) ; XMEMCPY(nonce_a, nonce, nonceSz) ; - } - - /* do aes-ccm */ - AesAuthSetIv(aes, nonce, nonceSz, L, mode) ; - ROM_AESReset(AES_BASE); - ROM_AESConfigSet(AES_BASE, (aes->keylen | AES_CFG_DIR_DECRYPT | - AES_CFG_CTR_WIDTH_128 | - mode | ((mode== AES_CFG_MODE_CCM) ? (L | M) : 0 ))) ; - ROM_AESIVSet(AES_BASE, aes->reg); - ROM_AESKey1Set(AES_BASE, aes->key, aes->keylen); - ret = ROM_AESDataProcessAuth(AES_BASE, (unsigned int*)in_a, (unsigned int *)out_a, inSz, - (unsigned int*)authIn_a, authInSz, (unsigned int *)tmpTag); - if((ret == false) || (XMEMCMP(authTag, tmpTag, authTagSz) != 0)){ - XMEMSET(out, 0, inSz) ; - ret = false ; - } else { - XMEMCPY(out, out_a, inSz) ; - } - - FREE_ALL ; - return ret==true ? 0 : 1 ; -} -#endif - - -#ifdef HAVE_AESGCM -WOLFSSL_API int wc_AesGcmSetKey(Aes* aes, const byte* key, word32 len) -{ - return AesAuthSetKey(aes, key, len) ; -} - -WOLFSSL_API int wc_AesGcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, - const byte* iv, word32 ivSz, - byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz) -{ - return AesAuthEncrypt(aes, out, in, sz, iv, ivSz, authTag, authTagSz, - authIn, authInSz, AES_CFG_MODE_GCM_HY0CALC) ; -} -WOLFSSL_API int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, - const byte* iv, word32 ivSz, - const byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz) -{ - return AesAuthDecrypt(aes, out, in, sz, iv, ivSz, authTag, authTagSz, - authIn, authInSz, AES_CFG_MODE_GCM_HY0CALC) ; -} - -WOLFSSL_API int wc_GmacSetKey(Gmac* gmac, const byte* key, word32 len) -{ - return AesAuthSetKey(&gmac->aes, key, len) ; -} - -WOLFSSL_API int wc_GmacUpdate(Gmac* gmac, const byte* iv, word32 ivSz, - const byte* authIn, word32 authInSz, - byte* authTag, word32 authTagSz) -{ - return AesAuthEncrypt(&gmac->aes, NULL, NULL, 0, iv, ivSz, authTag, authTagSz, - authIn, authInSz, AES_CFG_MODE_GCM_HY0CALC) ; -} - -#endif /* HAVE_AESGCM */ - -#ifdef HAVE_AESCCM -WOLFSSL_API void wc_AesCcmSetKey(Aes* aes, const byte* key, word32 keySz) -{ - AesAuthSetKey(aes, key, keySz) ; -} - -WOLFSSL_API void wc_AesCcmEncrypt(Aes* aes, byte* out, const byte* in, word32 inSz, - const byte* nonce, word32 nonceSz, - byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz) -{ - AesAuthEncrypt(aes, out, in, inSz, nonce, nonceSz, authTag, authTagSz, - authIn, authInSz, AES_CFG_MODE_CCM) ; -} - -WOLFSSL_API int wc_AesCcmDecrypt(Aes* aes, byte* out, const byte* in, word32 inSz, - const byte* nonce, word32 nonceSz, - const byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz) -{ - return AesAuthDecrypt(aes, out, in, inSz, nonce, nonceSz, authTag, authTagSz, - authIn, authInSz, AES_CFG_MODE_CCM) ; -} -#endif /* HAVE_AESCCM */ - -#endif /* WOLFSSL_TI_CRYPT */ - -#endif /* NO_AES */ - - - +/* port/ti/ti-aes.c + * + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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. + * + * wolfSSL 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 + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#ifndef NO_AES + + +#if defined(WOLFSSL_TI_CRYPT) +#include +#include + +#include +#include +#include + +#include "inc/hw_aes.h" +#include "inc/hw_memmap.h" +#include "inc/hw_ints.h" +#include "driverlib/aes.h" +#include "driverlib/sysctl.h" +#include "driverlib/rom_map.h" +#include "driverlib/rom.h" + +static int AesSetIV(Aes* aes, const byte* iv) +{ + if (aes == NULL) + return BAD_FUNC_ARG; + + if (iv) + XMEMCPY(aes->reg, iv, AES_BLOCK_SIZE); + else + XMEMSET(aes->reg, 0, AES_BLOCK_SIZE); + + return 0; +} + +WOLFSSL_API int wc_AesSetKey(Aes* aes, const byte* key, word32 len, const byte* iv, + int dir) +{ + if(!wolfSSL_TI_CCMInit())return 1 ; + if ((aes == NULL) || (key == NULL) || (iv == NULL)) + return BAD_FUNC_ARG; + if(!((dir == AES_ENCRYPTION) || (dir == AES_DECRYPTION))) + return BAD_FUNC_ARG; + + switch(len) { + case 16: aes->keylen = AES_CFG_KEY_SIZE_128BIT ; break ; + case 24: aes->keylen = AES_CFG_KEY_SIZE_192BIT ; break ; + case 32: aes->keylen = AES_CFG_KEY_SIZE_256BIT ; break ; + default: return BAD_FUNC_ARG; + } + + XMEMCPY(aes->key, key, len) ; + #ifdef WOLFSSL_AES_COUNTER + aes->left = 0; + #endif /* WOLFSSL_AES_COUNTER */ + return AesSetIV(aes, iv); +} + +#define AES_CFG_MODE_CTR_NOCTR AES_CFG_MODE_CTR+100 +#define IS_ALIGN16(p) (((unsigned int)(p)&0xf) == 0) + +static int AesAlign16(Aes* aes, byte* out, const byte* in, word32 sz, word32 dir, word32 mode) +{ + wolfSSL_TI_lockCCM() ; + ROM_AESReset(AES_BASE); + ROM_AESConfigSet(AES_BASE, (aes->keylen | dir | + (mode==AES_CFG_MODE_CTR_NOCTR ? AES_CFG_MODE_CTR : mode))); + AESIVSet(AES_BASE, aes->reg); + ROM_AESKey1Set(AES_BASE, aes->key, aes->keylen); + if((dir == AES_CFG_DIR_DECRYPT)&& (mode == AES_CFG_MODE_CBC)) + /* if input and output same will overwrite input iv */ + XMEMCPY(aes->tmp, in + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE); + ROM_AESDataProcess(AES_BASE, (uint32_t *)in, (uint32_t *)out, sz); + wolfSSL_TI_unlockCCM() ; + + /* store iv for next call */ + if(mode == AES_CFG_MODE_CBC){ + if(dir == AES_CFG_DIR_ENCRYPT) + XMEMCPY(aes->reg, out + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE); + else + XMEMCPY(aes->reg, aes->tmp, AES_BLOCK_SIZE); + } + + if(mode == AES_CFG_MODE_CTR) { + do { + int i ; + for (i = AES_BLOCK_SIZE - 1; i >= 0; i--) { + if (++((byte *)aes->reg)[i]) + break ; + } + sz -= AES_BLOCK_SIZE ; + } while((int)sz > 0) ; + } + + return 0 ; +} + +static int AesProcess(Aes* aes, byte* out, const byte* in, word32 sz, word32 dir, word32 mode) +{ + const byte * in_p ; byte * out_p ; + word32 size ; + #define TI_BUFFSIZE 1024 + byte buff[TI_BUFFSIZE] ; + + if ((aes == NULL) || (in == NULL) || (out == NULL)) + return BAD_FUNC_ARG; + if(sz % AES_BLOCK_SIZE) + return BAD_FUNC_ARG; + + while(sz > 0) { + size = sz ; in_p = in ; out_p = out ; + if(!IS_ALIGN16(in)){ + size = sz>TI_BUFFSIZE ? TI_BUFFSIZE : sz ; + XMEMCPY(buff, in, size) ; + in_p = (const byte *)buff ; + } + if(!IS_ALIGN16(out)){ + size = sz>TI_BUFFSIZE ? TI_BUFFSIZE : sz ; + out_p = buff ; + } + + AesAlign16(aes, out_p, in_p, size, dir, mode) ; + + if(!IS_ALIGN16(out)){ + XMEMCPY(out, buff, size) ; + } + sz -= size ; in += size ; out += size ; + } + + return 0 ; +} + +WOLFSSL_API int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) +{ + return AesProcess(aes, out, in, sz, AES_CFG_DIR_ENCRYPT, AES_CFG_MODE_CBC) ; +} + +WOLFSSL_API int wc_AesCbcDecrypt(Aes* aes, byte* out, const byte* in, word32 sz) +{ + return AesProcess(aes, out, in, sz, AES_CFG_DIR_DECRYPT, AES_CFG_MODE_CBC) ; +} + +#ifdef WOLFSSL_AES_COUNTER +WOLFSSL_API void wc_AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) +{ + char out_block[AES_BLOCK_SIZE] ; + int odd ; + int even ; + char *tmp ; /* (char *)aes->tmp, for short */ + + tmp = (char *)aes->tmp ; + if(aes->left) { + if((aes->left + sz) >= AES_BLOCK_SIZE){ + odd = AES_BLOCK_SIZE - aes->left ; + } else { + odd = sz ; + } + XMEMCPY(tmp+aes->left, in, odd) ; + if((odd+aes->left) == AES_BLOCK_SIZE){ + AesProcess(aes, (byte *)out_block, (byte const *)tmp, AES_BLOCK_SIZE, + AES_CFG_DIR_ENCRYPT, AES_CFG_MODE_CTR) ; + XMEMCPY(out, out_block+aes->left, odd) ; + aes->left = 0 ; + XMEMSET(tmp, 0x0, AES_BLOCK_SIZE) ; + } + in += odd ; + out+= odd ; + sz -= odd ; + } + odd = sz % AES_BLOCK_SIZE ; /* if there is tail flagment */ + if(sz / AES_BLOCK_SIZE) { + even = (sz/AES_BLOCK_SIZE)*AES_BLOCK_SIZE ; + AesProcess(aes, out, in, even, AES_CFG_DIR_ENCRYPT, AES_CFG_MODE_CTR); + out += even ; + in += even ; + } + if(odd) { + XMEMSET(tmp+aes->left, 0x0, AES_BLOCK_SIZE - aes->left) ; + XMEMCPY(tmp+aes->left, in, odd) ; + AesProcess(aes, (byte *)out_block, (byte const *)tmp, AES_BLOCK_SIZE, + AES_CFG_DIR_ENCRYPT, + AES_CFG_MODE_CTR_NOCTR /* Counter mode without counting IV */ + ); + XMEMCPY(out, out_block+aes->left,odd) ; + aes->left += odd ; + } +} +#endif + +/* AES-DIRECT */ +#if defined(WOLFSSL_AES_DIRECT) +WOLFSSL_API void wc_AesEncryptDirect(Aes* aes, byte* out, const byte* in) +{ + AesProcess(aes, out, in, AES_BLOCK_SIZE, AES_CFG_DIR_ENCRYPT, AES_CFG_MODE_CBC) ; +} +WOLFSSL_API void wc_AesDecryptDirect(Aes* aes, byte* out, const byte* in) +{ + AesProcess(aes, out, in, AES_BLOCK_SIZE, AES_CFG_DIR_DECRYPT, AES_CFG_MODE_CBC) ; +} +WOLFSSL_API int wc_AesSetKeyDirect(Aes* aes, const byte* key, word32 len, + const byte* iv, int dir) +{ + return(wc_AesSetKey(aes, key, len, iv, dir)) ; +} +#endif + + +#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) + +static int AesAuthSetKey(Aes* aes, const byte* key, word32 keySz) +{ + byte nonce[AES_BLOCK_SIZE]; + + if ((aes == NULL) || (key == NULL)) + return BAD_FUNC_ARG ; + if (!((keySz == 16) || (keySz == 24) || (keySz == 32))) + return BAD_FUNC_ARG ; + + XMEMSET(nonce, 0, sizeof(nonce)); + return wc_AesSetKey(aes, key, keySz, nonce, AES_ENCRYPTION); +} + + +static int AesAuthArgCheck(Aes* aes, byte* out, const byte* in, word32 inSz, + const byte* nonce, word32 nonceSz, + const byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz, word32 *M, word32 *L) +{ + if((aes == NULL)||(nonce == NULL)||(authTag== NULL)||(authIn == NULL)) + return BAD_FUNC_ARG; + if((inSz != 0) && ((out == NULL)||(in == NULL))) + return BAD_FUNC_ARG; + + switch(authTagSz){ + case 4: + *M = AES_CFG_CCM_M_4; break ; + case 6: + *M = AES_CFG_CCM_M_6; break ; + case 8: + *M = AES_CFG_CCM_M_8; break ; + case 10: + *M = AES_CFG_CCM_M_10; break ; + case 12: + *M = AES_CFG_CCM_M_12; break ; + case 14: + *M = AES_CFG_CCM_M_14; break ; + case 16: + *M = AES_CFG_CCM_M_16; break ; + default: + return 1 ; + } + + switch(nonceSz){ + case 7: + *L = AES_CFG_CCM_L_8; break ; + case 8: + *L = AES_CFG_CCM_L_7; break ; + case 9: + *L = AES_CFG_CCM_L_6; break ; + case 10: + *L = AES_CFG_CCM_L_5; break ; + case 11: + *L = AES_CFG_CCM_L_4; break ; + case 12: + *L = AES_CFG_CCM_L_3; break ; + case 13: + *L = AES_CFG_CCM_L_2; break ; + case 14: + *L = AES_CFG_CCM_L_1; break ; + default: + return 1; + } + return 0 ; +} + +static void AesAuthSetIv(Aes *aes, const byte *nonce, word32 len, word32 L, int mode) { + + if(mode == AES_CFG_MODE_CCM){ + XMEMSET(aes->reg, 0, 16) ; + switch(L){ + case AES_CFG_CCM_L_8: + aes->reg[0] = 0x7; break ; + case AES_CFG_CCM_L_7: + aes->reg[0] = 0x6; break ; + case AES_CFG_CCM_L_6: + aes->reg[0] = 0x5; break ; + case AES_CFG_CCM_L_5: + aes->reg[0] = 0x4; break ; + case AES_CFG_CCM_L_4: + aes->reg[0] = 0x3; break ; + case AES_CFG_CCM_L_3: + aes->reg[0] = 0x2; break ; + case AES_CFG_CCM_L_2: + aes->reg[0] = 0x1; break ; + case AES_CFG_CCM_L_1: + aes->reg[0] = 0x0; break ; + } + XMEMCPY(((byte *)aes->reg)+1, nonce, len) ; + } else { + byte *b = (byte *)aes->reg ; + XMEMSET(aes->reg, 0, AES_BLOCK_SIZE); + XMEMCPY(aes->reg, nonce, len); + b[AES_BLOCK_SIZE-4] = 0 ; + b[AES_BLOCK_SIZE-3] = 0 ; + b[AES_BLOCK_SIZE-2] = 0 ; + b[AES_BLOCK_SIZE-1] = 1 ; + } +} + +#define RoundUp16(n) ((n+15)&0xfffffff0) +#define FREE_ALL \ + if(in_save) XFREE(in_save, NULL, DYNAMIC_TYPE_TMP_BUFFER);\ + if(out_save) XFREE(out_save, NULL, DYNAMIC_TYPE_TMP_BUFFER);\ + if(authIn_save)XFREE(authIn_save, NULL, DYNAMIC_TYPE_TMP_BUFFER);\ + if(nonce_save) XFREE(nonce_save, NULL, DYNAMIC_TYPE_TMP_BUFFER); + +static int AesAuthEncrypt(Aes* aes, byte* out, const byte* in, word32 inSz, + const byte* nonce, word32 nonceSz, + byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz, int mode) +{ + word32 M, L ; + byte *in_a, *in_save ; + byte *out_a, *out_save ; + byte *authIn_a, *authIn_save ; + byte *nonce_a, *nonce_save ; + word32 tmpTag[4] ; + int ret ; + + if(AesAuthArgCheck(aes, out, in, inSz, nonce, nonceSz, authTag, authTagSz, authIn, authInSz, &M, &L) + == BAD_FUNC_ARG)return BAD_FUNC_ARG ; + + /* 16 byte padding */ + in_save = NULL ; out_save = NULL ; authIn_save = NULL ; nonce_save = NULL ; + if((inSz%16)==0){ + in_save = NULL ; in_a = (byte *)in ; + out_save = NULL ; out_a = out ; + } else { + if((in_save = XMALLOC(RoundUp16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ + FREE_ALL; return MEMORY_E ; } + in_a = in_save ; XMEMSET(in_a, 0, RoundUp16(inSz)) ; XMEMCPY(in_a, in, inSz) ; + + if((out_save = XMALLOC(RoundUp16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ + FREE_ALL; return MEMORY_E ; } + out_a = out_save ; + } + + if((authInSz%16)==0){ + authIn_save = NULL ; authIn_a = (byte *)authIn ; + } else { + if((authIn_save = XMALLOC(RoundUp16(authInSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ + FREE_ALL; return MEMORY_E ; } + authIn_a = authIn_save ; XMEMSET(authIn_a, 0, RoundUp16(authInSz)) ; XMEMCPY(authIn_a, authIn, authInSz) ; + } + + if((nonceSz%16)==0){ + nonce_save = NULL ; nonce_a = (byte *)nonce ; + } else { + if((nonce_save = XMALLOC(RoundUp16(nonceSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ + FREE_ALL; return MEMORY_E; } + nonce_a = nonce_save ; XMEMSET(nonce_a, 0, RoundUp16(nonceSz)) ; XMEMCPY(nonce_a, nonce, nonceSz) ; + } + + /* do aes-ccm */ + AesAuthSetIv(aes, nonce, nonceSz, L, mode) ; + ROM_AESReset(AES_BASE); + ROM_AESConfigSet(AES_BASE, (aes->keylen | AES_CFG_DIR_ENCRYPT | + AES_CFG_CTR_WIDTH_128 | + mode | ((mode== AES_CFG_MODE_CCM) ? (L | M) : 0 ))) ; + ROM_AESIVSet(AES_BASE, aes->reg); + ROM_AESKey1Set(AES_BASE, aes->key, aes->keylen); + ret = ROM_AESDataProcessAuth(AES_BASE, (unsigned int*)in_a, (unsigned int *)out_a, inSz, + (unsigned int*)authIn_a, authInSz, (unsigned int *)tmpTag); + if(ret == false){ + XMEMSET(out, 0, inSz) ; + XMEMSET(authTag, 0, authTagSz) ; + } else { + XMEMCPY(out, out_a, inSz) ; + XMEMCPY(authTag, tmpTag, authTagSz) ; + } + + FREE_ALL; + return 0 ; +} + +static int AesAuthDecrypt(Aes* aes, byte* out, const byte* in, word32 inSz, + const byte* nonce, word32 nonceSz, + const byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz, int mode) +{ + word32 M, L ; + byte *in_a, *in_save ; + byte *out_a, *out_save ; + byte *authIn_a, *authIn_save ; + byte *nonce_a, *nonce_save ; + word32 tmpTag[4] ; + bool ret ; + + if(AesAuthArgCheck(aes, out, in, inSz, nonce, nonceSz, authTag, authTagSz, authIn, authInSz, &M, &L) + == BAD_FUNC_ARG)return BAD_FUNC_ARG ; + + /* 16 byte padding */ + in_save = NULL ; out_save = NULL ; authIn_save = NULL ; nonce_save = NULL ; + if((inSz%16)==0){ + in_save = NULL ; in_a = (byte *)in ; + out_save = NULL ; out_a = out ; + } else { + if((in_save = XMALLOC(RoundUp16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ + FREE_ALL; return MEMORY_E;} + in_a = in_save ; XMEMSET(in_a, 0, RoundUp16(inSz)) ; XMEMCPY(in_a, in, inSz) ; + + if((out_save = XMALLOC(RoundUp16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ + FREE_ALL; return MEMORY_E;} + out_a = out_save ; + } + + if((authInSz%16)==0){ + authIn_save = NULL ; authIn_a = (byte *)authIn ; + } else { + if((authIn_save = XMALLOC(RoundUp16(authInSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ + FREE_ALL; return MEMORY_E; } + authIn_a = authIn_save ; XMEMSET(authIn_a, 0, RoundUp16(authInSz)) ; XMEMCPY(authIn_a, authIn, authInSz) ; + } + + if((nonceSz%16)==0){ + nonce_save = NULL ; nonce_a = (byte *)nonce ; + } else { + if((nonce_save = XMALLOC(RoundUp16(nonceSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ + FREE_ALL; return MEMORY_E; } + nonce_a = nonce_save ; XMEMSET(nonce_a, 0, RoundUp16(nonceSz)) ; XMEMCPY(nonce_a, nonce, nonceSz) ; + } + + /* do aes-ccm */ + AesAuthSetIv(aes, nonce, nonceSz, L, mode) ; + ROM_AESReset(AES_BASE); + ROM_AESConfigSet(AES_BASE, (aes->keylen | AES_CFG_DIR_DECRYPT | + AES_CFG_CTR_WIDTH_128 | + mode | ((mode== AES_CFG_MODE_CCM) ? (L | M) : 0 ))) ; + ROM_AESIVSet(AES_BASE, aes->reg); + ROM_AESKey1Set(AES_BASE, aes->key, aes->keylen); + ret = ROM_AESDataProcessAuth(AES_BASE, (unsigned int*)in_a, (unsigned int *)out_a, inSz, + (unsigned int*)authIn_a, authInSz, (unsigned int *)tmpTag); + if((ret == false) || (XMEMCMP(authTag, tmpTag, authTagSz) != 0)){ + XMEMSET(out, 0, inSz) ; + ret = false ; + } else { + XMEMCPY(out, out_a, inSz) ; + } + + FREE_ALL ; + return ret==true ? 0 : 1 ; +} +#endif + + +#ifdef HAVE_AESGCM +WOLFSSL_API int wc_AesGcmSetKey(Aes* aes, const byte* key, word32 len) +{ + return AesAuthSetKey(aes, key, len) ; +} + +WOLFSSL_API int wc_AesGcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, + const byte* iv, word32 ivSz, + byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz) +{ + return AesAuthEncrypt(aes, out, in, sz, iv, ivSz, authTag, authTagSz, + authIn, authInSz, AES_CFG_MODE_GCM_HY0CALC) ; +} +WOLFSSL_API int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, + const byte* iv, word32 ivSz, + const byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz) +{ + return AesAuthDecrypt(aes, out, in, sz, iv, ivSz, authTag, authTagSz, + authIn, authInSz, AES_CFG_MODE_GCM_HY0CALC) ; +} + +WOLFSSL_API int wc_GmacSetKey(Gmac* gmac, const byte* key, word32 len) +{ + return AesAuthSetKey(&gmac->aes, key, len) ; +} + +WOLFSSL_API int wc_GmacUpdate(Gmac* gmac, const byte* iv, word32 ivSz, + const byte* authIn, word32 authInSz, + byte* authTag, word32 authTagSz) +{ + return AesAuthEncrypt(&gmac->aes, NULL, NULL, 0, iv, ivSz, authTag, authTagSz, + authIn, authInSz, AES_CFG_MODE_GCM_HY0CALC) ; +} + +#endif /* HAVE_AESGCM */ + +#ifdef HAVE_AESCCM +WOLFSSL_API void wc_AesCcmSetKey(Aes* aes, const byte* key, word32 keySz) +{ + AesAuthSetKey(aes, key, keySz) ; +} + +WOLFSSL_API void wc_AesCcmEncrypt(Aes* aes, byte* out, const byte* in, word32 inSz, + const byte* nonce, word32 nonceSz, + byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz) +{ + AesAuthEncrypt(aes, out, in, inSz, nonce, nonceSz, authTag, authTagSz, + authIn, authInSz, AES_CFG_MODE_CCM) ; +} + +WOLFSSL_API int wc_AesCcmDecrypt(Aes* aes, byte* out, const byte* in, word32 inSz, + const byte* nonce, word32 nonceSz, + const byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz) +{ + return AesAuthDecrypt(aes, out, in, inSz, nonce, nonceSz, authTag, authTagSz, + authIn, authInSz, AES_CFG_MODE_CCM) ; +} +#endif /* HAVE_AESCCM */ + +#endif /* WOLFSSL_TI_CRYPT */ + +#endif /* NO_AES */ + + + diff --git a/wolfcrypt/src/sha.c b/wolfcrypt/src/sha.c index 2a91116a2..be2106cbd 100644 --- a/wolfcrypt/src/sha.c +++ b/wolfcrypt/src/sha.c @@ -1,473 +1,473 @@ -/* sha.c - * - * Copyright (C) 2006-2015 wolfSSL Inc. - * - * This file is part of wolfSSL. (formerly known as CyaSSL) - * - * wolfSSL 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. - * - * wolfSSL 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 - */ - - -#ifdef HAVE_CONFIG_H - #include -#endif - -#include - -#if !defined(NO_SHA) && !defined(WOLFSSL_TI_HASH) - -#include -#include -#include - -#ifdef NO_INLINE - #include -#else - #include -#endif - -/* fips wrapper calls, user can call direct */ -#ifdef HAVE_FIPS - int wc_InitSha(Sha* sha) - { - return InitSha_fips(sha); - } - - - int wc_ShaUpdate(Sha* sha, const byte* data, word32 len) - { - return ShaUpdate_fips(sha, data, len); - } - - - int wc_ShaFinal(Sha* sha, byte* out) - { - return ShaFinal_fips(sha,out); - } - - int wc_ShaHash(const byte* data, word32 sz, byte* out) - { - return ShaHash(data, sz, out); - } - -#else /* else build without fips */ - -#ifdef WOLFSSL_PIC32MZ_HASH -#define wc_InitSha wc_InitSha_sw -#define wc_ShaUpdate wc_ShaUpdate_sw -#define wc_ShaFinal wc_ShaFinal_sw -#endif - - -#ifdef FREESCALE_MMCAU - #include "cau_api.h" - #define XTRANSFORM(S,B) cau_sha1_hash_n((B), 1, ((S))->digest) -#else - #define XTRANSFORM(S,B) Transform((S)) -#endif - -#ifdef STM32F2_HASH -/* - * STM32F2 hardware SHA1 support through the STM32F2 standard peripheral - * library. Documentation located in STM32F2xx Standard Peripheral Library - * document (See note in README). - */ -#include "stm32f2xx.h" -#include "stm32f2xx_hash.h" - -int wc_InitSha(Sha* sha) -{ - /* STM32F2 struct notes: - * sha->buffer = first 4 bytes used to hold partial block if needed - * sha->buffLen = num bytes currently stored in sha->buffer - * sha->loLen = num bytes that have been written to STM32 FIFO - */ - XMEMSET(sha->buffer, 0, SHA_REG_SIZE); - sha->buffLen = 0; - sha->loLen = 0; - - /* initialize HASH peripheral */ - HASH_DeInit(); - - /* configure algo used, algo mode, datatype */ - HASH->CR &= ~ (HASH_CR_ALGO | HASH_CR_DATATYPE | HASH_CR_MODE); - HASH->CR |= (HASH_AlgoSelection_SHA1 | HASH_AlgoMode_HASH - | HASH_DataType_8b); - - /* reset HASH processor */ - HASH->CR |= HASH_CR_INIT; - - return 0; -} - -int wc_ShaUpdate(Sha* sha, const byte* data, word32 len) -{ - word32 i = 0; - word32 fill = 0; - word32 diff = 0; - - /* if saved partial block is available */ - if (sha->buffLen) { - fill = 4 - sha->buffLen; - - /* if enough data to fill, fill and push to FIFO */ - if (fill <= len) { - XMEMCPY((byte*)sha->buffer + sha->buffLen, data, fill); - HASH_DataIn(*(uint32_t*)sha->buffer); - - data += fill; - len -= fill; - sha->loLen += 4; - sha->buffLen = 0; - } else { - /* append partial to existing stored block */ - XMEMCPY((byte*)sha->buffer + sha->buffLen, data, len); - sha->buffLen += len; - return; - } - } - - /* write input block in the IN FIFO */ - for(i = 0; i < len; i += 4) - { - diff = len - i; - if ( diff < 4) { - /* store incomplete last block, not yet in FIFO */ - XMEMSET(sha->buffer, 0, SHA_REG_SIZE); - XMEMCPY((byte*)sha->buffer, data, diff); - sha->buffLen = diff; - } else { - HASH_DataIn(*(uint32_t*)data); - data+=4; - } - } - - /* keep track of total data length thus far */ - sha->loLen += (len - sha->buffLen); - - return 0; -} - -int wc_ShaFinal(Sha* sha, byte* hash) -{ - __IO uint16_t nbvalidbitsdata = 0; - - /* finish reading any trailing bytes into FIFO */ - if (sha->buffLen) { - HASH_DataIn(*(uint32_t*)sha->buffer); - sha->loLen += sha->buffLen; - } - - /* calculate number of valid bits in last word of input data */ - nbvalidbitsdata = 8 * (sha->loLen % SHA_REG_SIZE); - - /* configure number of valid bits in last word of the data */ - HASH_SetLastWordValidBitsNbr(nbvalidbitsdata); - - /* start HASH processor */ - HASH_StartDigest(); - - /* wait until Busy flag == RESET */ - while (HASH_GetFlagStatus(HASH_FLAG_BUSY) != RESET) {} - - /* read message digest */ - sha->digest[0] = HASH->HR[0]; - sha->digest[1] = HASH->HR[1]; - sha->digest[2] = HASH->HR[2]; - sha->digest[3] = HASH->HR[3]; - sha->digest[4] = HASH->HR[4]; - - ByteReverseWords(sha->digest, sha->digest, SHA_DIGEST_SIZE); - - XMEMCPY(hash, sha->digest, SHA_DIGEST_SIZE); - - return wc_InitSha(sha); /* reset state */ -} - -#elif defined(WOLFSSL_TI_HASH) - - /* defined in port/ti/ti_sha.c */ - -#else /* wc_ software implementation */ - -#ifndef WOLFSSL_HAVE_MIN -#define WOLFSSL_HAVE_MIN - - static INLINE word32 min(word32 a, word32 b) - { - return a > b ? b : a; - } - -#endif /* WOLFSSL_HAVE_MIN */ - - -int wc_InitSha(Sha* sha) -{ -#ifdef FREESCALE_MMCAU - cau_sha1_initialize_output(sha->digest); -#else - sha->digest[0] = 0x67452301L; - sha->digest[1] = 0xEFCDAB89L; - sha->digest[2] = 0x98BADCFEL; - sha->digest[3] = 0x10325476L; - sha->digest[4] = 0xC3D2E1F0L; -#endif - - sha->buffLen = 0; - sha->loLen = 0; - sha->hiLen = 0; - - return 0; -} - -#ifndef FREESCALE_MMCAU - -#define blk0(i) (W[i] = sha->buffer[i]) -#define blk1(i) (W[(i)&15] = \ -rotlFixed(W[((i)+13)&15]^W[((i)+8)&15]^W[((i)+2)&15]^W[(i)&15],1)) - -#define f1(x,y,z) ((z)^((x) &((y)^(z)))) -#define f2(x,y,z) ((x)^(y)^(z)) -#define f3(x,y,z) (((x)&(y))|((z)&((x)|(y)))) -#define f4(x,y,z) ((x)^(y)^(z)) - -/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ -#define R0(v,w,x,y,z,i) (z)+= f1((w),(x),(y)) + blk0((i)) + 0x5A827999+ \ -rotlFixed((v),5); (w) = rotlFixed((w),30); -#define R1(v,w,x,y,z,i) (z)+= f1((w),(x),(y)) + blk1((i)) + 0x5A827999+ \ -rotlFixed((v),5); (w) = rotlFixed((w),30); -#define R2(v,w,x,y,z,i) (z)+= f2((w),(x),(y)) + blk1((i)) + 0x6ED9EBA1+ \ -rotlFixed((v),5); (w) = rotlFixed((w),30); -#define R3(v,w,x,y,z,i) (z)+= f3((w),(x),(y)) + blk1((i)) + 0x8F1BBCDC+ \ -rotlFixed((v),5); (w) = rotlFixed((w),30); -#define R4(v,w,x,y,z,i) (z)+= f4((w),(x),(y)) + blk1((i)) + 0xCA62C1D6+ \ -rotlFixed((v),5); (w) = rotlFixed((w),30); - -static void Transform(Sha* sha) -{ - word32 W[SHA_BLOCK_SIZE / sizeof(word32)]; - - /* Copy context->state[] to working vars */ - word32 a = sha->digest[0]; - word32 b = sha->digest[1]; - word32 c = sha->digest[2]; - word32 d = sha->digest[3]; - word32 e = sha->digest[4]; - -#ifdef USE_SLOW_SHA - word32 t, i; - - for (i = 0; i < 16; i++) { - R0(a, b, c, d, e, i); - t = e; e = d; d = c; c = b; b = a; a = t; - } - - for (; i < 20; i++) { - R1(a, b, c, d, e, i); - t = e; e = d; d = c; c = b; b = a; a = t; - } - - for (; i < 40; i++) { - R2(a, b, c, d, e, i); - t = e; e = d; d = c; c = b; b = a; a = t; - } - - for (; i < 60; i++) { - R3(a, b, c, d, e, i); - t = e; e = d; d = c; c = b; b = a; a = t; - } - - for (; i < 80; i++) { - R4(a, b, c, d, e, i); - t = e; e = d; d = c; c = b; b = a; a = t; - } -#else - /* nearly 1 K bigger in code size but 25% faster */ - /* 4 rounds of 20 operations each. Loop unrolled. */ - R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); - R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); - R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); - R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); - - R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); - - R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); - R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); - R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); - R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); - R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); - - R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); - R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); - R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); - R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); - R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); - - R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); - R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); - R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); - R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); - R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); -#endif - - /* Add the working vars back into digest state[] */ - sha->digest[0] += a; - sha->digest[1] += b; - sha->digest[2] += c; - sha->digest[3] += d; - sha->digest[4] += e; -} - -#endif /* FREESCALE_MMCAU */ - - -static INLINE void AddLength(Sha* sha, word32 len) -{ - word32 tmp = sha->loLen; - if ( (sha->loLen += len) < tmp) - sha->hiLen++; /* carry low to high */ -} - - -int wc_ShaUpdate(Sha* sha, const byte* data, word32 len) -{ - /* do block size increments */ - byte* local = (byte*)sha->buffer; - - while (len) { - word32 add = min(len, SHA_BLOCK_SIZE - sha->buffLen); - XMEMCPY(&local[sha->buffLen], data, add); - - sha->buffLen += add; - data += add; - len -= add; - - if (sha->buffLen == SHA_BLOCK_SIZE) { -#if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) - ByteReverseWords(sha->buffer, sha->buffer, SHA_BLOCK_SIZE); -#endif - XTRANSFORM(sha, local); - AddLength(sha, SHA_BLOCK_SIZE); - sha->buffLen = 0; - } - } - - return 0; -} - - -int wc_ShaFinal(Sha* sha, byte* hash) -{ - byte* local = (byte*)sha->buffer; - - AddLength(sha, sha->buffLen); /* before adding pads */ - - local[sha->buffLen++] = 0x80; /* add 1 */ - - /* pad with zeros */ - if (sha->buffLen > SHA_PAD_SIZE) { - XMEMSET(&local[sha->buffLen], 0, SHA_BLOCK_SIZE - sha->buffLen); - sha->buffLen += SHA_BLOCK_SIZE - sha->buffLen; - -#if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) - ByteReverseWords(sha->buffer, sha->buffer, SHA_BLOCK_SIZE); -#endif - XTRANSFORM(sha, local); - sha->buffLen = 0; - } - XMEMSET(&local[sha->buffLen], 0, SHA_PAD_SIZE - sha->buffLen); - - /* put lengths in bits */ - sha->hiLen = (sha->loLen >> (8*sizeof(sha->loLen) - 3)) + - (sha->hiLen << 3); - sha->loLen = sha->loLen << 3; - - /* store lengths */ -#if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) - ByteReverseWords(sha->buffer, sha->buffer, SHA_BLOCK_SIZE); -#endif - /* ! length ordering dependent on digest endian type ! */ - XMEMCPY(&local[SHA_PAD_SIZE], &sha->hiLen, sizeof(word32)); - XMEMCPY(&local[SHA_PAD_SIZE + sizeof(word32)], &sha->loLen, sizeof(word32)); - -#ifdef FREESCALE_MMCAU - /* Kinetis requires only these bytes reversed */ - ByteReverseWords(&sha->buffer[SHA_PAD_SIZE/sizeof(word32)], - &sha->buffer[SHA_PAD_SIZE/sizeof(word32)], - 2 * sizeof(word32)); -#endif - - XTRANSFORM(sha, local); -#ifdef LITTLE_ENDIAN_ORDER - ByteReverseWords(sha->digest, sha->digest, SHA_DIGEST_SIZE); -#endif - XMEMCPY(hash, sha->digest, SHA_DIGEST_SIZE); - - return wc_InitSha(sha); /* reset state */ -} - -#endif /* STM32F2_HASH */ - - -int wc_ShaHash(const byte* data, word32 len, byte* hash) -{ - int ret = 0; -#ifdef WOLFSSL_SMALL_STACK - Sha* sha; -#else - Sha sha[1]; -#endif - -#ifdef WOLFSSL_SMALL_STACK - sha = (Sha*)XMALLOC(sizeof(Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (sha == NULL) - return MEMORY_E; -#endif - - if ((ret = wc_InitSha(sha)) != 0) { - WOLFSSL_MSG("wc_InitSha failed"); - } - else { - wc_ShaUpdate(sha, data, len); - wc_ShaFinal(sha, hash); - } - -#ifdef WOLFSSL_SMALL_STACK - XFREE(sha, NULL, DYNAMIC_TYPE_TMP_BUFFER); -#endif - - return ret; - -} - -#ifdef WOLFSSL_TI_HASH -#include "wolfssl/wolfcrypt/port/ti/ti-hash.h" -#endif -int wc_ShaGetHash(Sha* sha, byte* hash) -{ -#if defined(WOLFSS_TI_HASH) - wc_ShaGetHash_TI(sha, hash) ; -#else - int ret ; - Sha save = *sha ; - ret = wc_ShaFinal(sha, hash) ; - *sha = save ; - return ret ; -#endif -} - -#endif /* HAVE_FIPS */ -#endif /* NO_SHA */ - +/* sha.c + * + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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. + * + * wolfSSL 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 + */ + + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#if !defined(NO_SHA) && !defined(WOLFSSL_TI_HASH) + +#include +#include +#include + +#ifdef NO_INLINE + #include +#else + #include +#endif + +/* fips wrapper calls, user can call direct */ +#ifdef HAVE_FIPS + int wc_InitSha(Sha* sha) + { + return InitSha_fips(sha); + } + + + int wc_ShaUpdate(Sha* sha, const byte* data, word32 len) + { + return ShaUpdate_fips(sha, data, len); + } + + + int wc_ShaFinal(Sha* sha, byte* out) + { + return ShaFinal_fips(sha,out); + } + + int wc_ShaHash(const byte* data, word32 sz, byte* out) + { + return ShaHash(data, sz, out); + } + +#else /* else build without fips */ + +#ifdef WOLFSSL_PIC32MZ_HASH +#define wc_InitSha wc_InitSha_sw +#define wc_ShaUpdate wc_ShaUpdate_sw +#define wc_ShaFinal wc_ShaFinal_sw +#endif + + +#ifdef FREESCALE_MMCAU + #include "cau_api.h" + #define XTRANSFORM(S,B) cau_sha1_hash_n((B), 1, ((S))->digest) +#else + #define XTRANSFORM(S,B) Transform((S)) +#endif + +#ifdef STM32F2_HASH +/* + * STM32F2 hardware SHA1 support through the STM32F2 standard peripheral + * library. Documentation located in STM32F2xx Standard Peripheral Library + * document (See note in README). + */ +#include "stm32f2xx.h" +#include "stm32f2xx_hash.h" + +int wc_InitSha(Sha* sha) +{ + /* STM32F2 struct notes: + * sha->buffer = first 4 bytes used to hold partial block if needed + * sha->buffLen = num bytes currently stored in sha->buffer + * sha->loLen = num bytes that have been written to STM32 FIFO + */ + XMEMSET(sha->buffer, 0, SHA_REG_SIZE); + sha->buffLen = 0; + sha->loLen = 0; + + /* initialize HASH peripheral */ + HASH_DeInit(); + + /* configure algo used, algo mode, datatype */ + HASH->CR &= ~ (HASH_CR_ALGO | HASH_CR_DATATYPE | HASH_CR_MODE); + HASH->CR |= (HASH_AlgoSelection_SHA1 | HASH_AlgoMode_HASH + | HASH_DataType_8b); + + /* reset HASH processor */ + HASH->CR |= HASH_CR_INIT; + + return 0; +} + +int wc_ShaUpdate(Sha* sha, const byte* data, word32 len) +{ + word32 i = 0; + word32 fill = 0; + word32 diff = 0; + + /* if saved partial block is available */ + if (sha->buffLen) { + fill = 4 - sha->buffLen; + + /* if enough data to fill, fill and push to FIFO */ + if (fill <= len) { + XMEMCPY((byte*)sha->buffer + sha->buffLen, data, fill); + HASH_DataIn(*(uint32_t*)sha->buffer); + + data += fill; + len -= fill; + sha->loLen += 4; + sha->buffLen = 0; + } else { + /* append partial to existing stored block */ + XMEMCPY((byte*)sha->buffer + sha->buffLen, data, len); + sha->buffLen += len; + return; + } + } + + /* write input block in the IN FIFO */ + for(i = 0; i < len; i += 4) + { + diff = len - i; + if ( diff < 4) { + /* store incomplete last block, not yet in FIFO */ + XMEMSET(sha->buffer, 0, SHA_REG_SIZE); + XMEMCPY((byte*)sha->buffer, data, diff); + sha->buffLen = diff; + } else { + HASH_DataIn(*(uint32_t*)data); + data+=4; + } + } + + /* keep track of total data length thus far */ + sha->loLen += (len - sha->buffLen); + + return 0; +} + +int wc_ShaFinal(Sha* sha, byte* hash) +{ + __IO uint16_t nbvalidbitsdata = 0; + + /* finish reading any trailing bytes into FIFO */ + if (sha->buffLen) { + HASH_DataIn(*(uint32_t*)sha->buffer); + sha->loLen += sha->buffLen; + } + + /* calculate number of valid bits in last word of input data */ + nbvalidbitsdata = 8 * (sha->loLen % SHA_REG_SIZE); + + /* configure number of valid bits in last word of the data */ + HASH_SetLastWordValidBitsNbr(nbvalidbitsdata); + + /* start HASH processor */ + HASH_StartDigest(); + + /* wait until Busy flag == RESET */ + while (HASH_GetFlagStatus(HASH_FLAG_BUSY) != RESET) {} + + /* read message digest */ + sha->digest[0] = HASH->HR[0]; + sha->digest[1] = HASH->HR[1]; + sha->digest[2] = HASH->HR[2]; + sha->digest[3] = HASH->HR[3]; + sha->digest[4] = HASH->HR[4]; + + ByteReverseWords(sha->digest, sha->digest, SHA_DIGEST_SIZE); + + XMEMCPY(hash, sha->digest, SHA_DIGEST_SIZE); + + return wc_InitSha(sha); /* reset state */ +} + +#elif defined(WOLFSSL_TI_HASH) + + /* defined in port/ti/ti_sha.c */ + +#else /* wc_ software implementation */ + +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN + + static INLINE word32 min(word32 a, word32 b) + { + return a > b ? b : a; + } + +#endif /* WOLFSSL_HAVE_MIN */ + + +int wc_InitSha(Sha* sha) +{ +#ifdef FREESCALE_MMCAU + cau_sha1_initialize_output(sha->digest); +#else + sha->digest[0] = 0x67452301L; + sha->digest[1] = 0xEFCDAB89L; + sha->digest[2] = 0x98BADCFEL; + sha->digest[3] = 0x10325476L; + sha->digest[4] = 0xC3D2E1F0L; +#endif + + sha->buffLen = 0; + sha->loLen = 0; + sha->hiLen = 0; + + return 0; +} + +#ifndef FREESCALE_MMCAU + +#define blk0(i) (W[i] = sha->buffer[i]) +#define blk1(i) (W[(i)&15] = \ +rotlFixed(W[((i)+13)&15]^W[((i)+8)&15]^W[((i)+2)&15]^W[(i)&15],1)) + +#define f1(x,y,z) ((z)^((x) &((y)^(z)))) +#define f2(x,y,z) ((x)^(y)^(z)) +#define f3(x,y,z) (((x)&(y))|((z)&((x)|(y)))) +#define f4(x,y,z) ((x)^(y)^(z)) + +/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ +#define R0(v,w,x,y,z,i) (z)+= f1((w),(x),(y)) + blk0((i)) + 0x5A827999+ \ +rotlFixed((v),5); (w) = rotlFixed((w),30); +#define R1(v,w,x,y,z,i) (z)+= f1((w),(x),(y)) + blk1((i)) + 0x5A827999+ \ +rotlFixed((v),5); (w) = rotlFixed((w),30); +#define R2(v,w,x,y,z,i) (z)+= f2((w),(x),(y)) + blk1((i)) + 0x6ED9EBA1+ \ +rotlFixed((v),5); (w) = rotlFixed((w),30); +#define R3(v,w,x,y,z,i) (z)+= f3((w),(x),(y)) + blk1((i)) + 0x8F1BBCDC+ \ +rotlFixed((v),5); (w) = rotlFixed((w),30); +#define R4(v,w,x,y,z,i) (z)+= f4((w),(x),(y)) + blk1((i)) + 0xCA62C1D6+ \ +rotlFixed((v),5); (w) = rotlFixed((w),30); + +static void Transform(Sha* sha) +{ + word32 W[SHA_BLOCK_SIZE / sizeof(word32)]; + + /* Copy context->state[] to working vars */ + word32 a = sha->digest[0]; + word32 b = sha->digest[1]; + word32 c = sha->digest[2]; + word32 d = sha->digest[3]; + word32 e = sha->digest[4]; + +#ifdef USE_SLOW_SHA + word32 t, i; + + for (i = 0; i < 16; i++) { + R0(a, b, c, d, e, i); + t = e; e = d; d = c; c = b; b = a; a = t; + } + + for (; i < 20; i++) { + R1(a, b, c, d, e, i); + t = e; e = d; d = c; c = b; b = a; a = t; + } + + for (; i < 40; i++) { + R2(a, b, c, d, e, i); + t = e; e = d; d = c; c = b; b = a; a = t; + } + + for (; i < 60; i++) { + R3(a, b, c, d, e, i); + t = e; e = d; d = c; c = b; b = a; a = t; + } + + for (; i < 80; i++) { + R4(a, b, c, d, e, i); + t = e; e = d; d = c; c = b; b = a; a = t; + } +#else + /* nearly 1 K bigger in code size but 25% faster */ + /* 4 rounds of 20 operations each. Loop unrolled. */ + R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); + R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); + R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); + R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); + + R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); + + R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); + R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); + R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); + R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); + R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); + + R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); + R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); + R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); + R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); + R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); + + R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); + R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); + R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); + R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); + R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); +#endif + + /* Add the working vars back into digest state[] */ + sha->digest[0] += a; + sha->digest[1] += b; + sha->digest[2] += c; + sha->digest[3] += d; + sha->digest[4] += e; +} + +#endif /* FREESCALE_MMCAU */ + + +static INLINE void AddLength(Sha* sha, word32 len) +{ + word32 tmp = sha->loLen; + if ( (sha->loLen += len) < tmp) + sha->hiLen++; /* carry low to high */ +} + + +int wc_ShaUpdate(Sha* sha, const byte* data, word32 len) +{ + /* do block size increments */ + byte* local = (byte*)sha->buffer; + + while (len) { + word32 add = min(len, SHA_BLOCK_SIZE - sha->buffLen); + XMEMCPY(&local[sha->buffLen], data, add); + + sha->buffLen += add; + data += add; + len -= add; + + if (sha->buffLen == SHA_BLOCK_SIZE) { +#if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) + ByteReverseWords(sha->buffer, sha->buffer, SHA_BLOCK_SIZE); +#endif + XTRANSFORM(sha, local); + AddLength(sha, SHA_BLOCK_SIZE); + sha->buffLen = 0; + } + } + + return 0; +} + + +int wc_ShaFinal(Sha* sha, byte* hash) +{ + byte* local = (byte*)sha->buffer; + + AddLength(sha, sha->buffLen); /* before adding pads */ + + local[sha->buffLen++] = 0x80; /* add 1 */ + + /* pad with zeros */ + if (sha->buffLen > SHA_PAD_SIZE) { + XMEMSET(&local[sha->buffLen], 0, SHA_BLOCK_SIZE - sha->buffLen); + sha->buffLen += SHA_BLOCK_SIZE - sha->buffLen; + +#if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) + ByteReverseWords(sha->buffer, sha->buffer, SHA_BLOCK_SIZE); +#endif + XTRANSFORM(sha, local); + sha->buffLen = 0; + } + XMEMSET(&local[sha->buffLen], 0, SHA_PAD_SIZE - sha->buffLen); + + /* put lengths in bits */ + sha->hiLen = (sha->loLen >> (8*sizeof(sha->loLen) - 3)) + + (sha->hiLen << 3); + sha->loLen = sha->loLen << 3; + + /* store lengths */ +#if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) + ByteReverseWords(sha->buffer, sha->buffer, SHA_BLOCK_SIZE); +#endif + /* ! length ordering dependent on digest endian type ! */ + XMEMCPY(&local[SHA_PAD_SIZE], &sha->hiLen, sizeof(word32)); + XMEMCPY(&local[SHA_PAD_SIZE + sizeof(word32)], &sha->loLen, sizeof(word32)); + +#ifdef FREESCALE_MMCAU + /* Kinetis requires only these bytes reversed */ + ByteReverseWords(&sha->buffer[SHA_PAD_SIZE/sizeof(word32)], + &sha->buffer[SHA_PAD_SIZE/sizeof(word32)], + 2 * sizeof(word32)); +#endif + + XTRANSFORM(sha, local); +#ifdef LITTLE_ENDIAN_ORDER + ByteReverseWords(sha->digest, sha->digest, SHA_DIGEST_SIZE); +#endif + XMEMCPY(hash, sha->digest, SHA_DIGEST_SIZE); + + return wc_InitSha(sha); /* reset state */ +} + +#endif /* STM32F2_HASH */ + + +int wc_ShaHash(const byte* data, word32 len, byte* hash) +{ + int ret = 0; +#ifdef WOLFSSL_SMALL_STACK + Sha* sha; +#else + Sha sha[1]; +#endif + +#ifdef WOLFSSL_SMALL_STACK + sha = (Sha*)XMALLOC(sizeof(Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (sha == NULL) + return MEMORY_E; +#endif + + if ((ret = wc_InitSha(sha)) != 0) { + WOLFSSL_MSG("wc_InitSha failed"); + } + else { + wc_ShaUpdate(sha, data, len); + wc_ShaFinal(sha, hash); + } + +#ifdef WOLFSSL_SMALL_STACK + XFREE(sha, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return ret; + +} + +#ifdef WOLFSSL_TI_HASH +#include "wolfssl/wolfcrypt/port/ti/ti-hash.h" +#endif +int wc_ShaGetHash(Sha* sha, byte* hash) +{ +#if defined(WOLFSS_TI_HASH) + wc_ShaGetHash_TI(sha, hash) ; +#else + int ret ; + Sha save = *sha ; + ret = wc_ShaFinal(sha, hash) ; + *sha = save ; + return ret ; +#endif +} + +#endif /* HAVE_FIPS */ +#endif /* NO_SHA */ + diff --git a/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c index ec4eb918b..90f99a35b 100644 --- a/wolfcrypt/src/sha256.c +++ b/wolfcrypt/src/sha256.c @@ -1,1781 +1,1781 @@ -/* sha256.c - * - * Copyright (C) 2006-2015 wolfSSL Inc. - * - * This file is part of wolfSSL. (formerly known as CyaSSL) - * - * wolfSSL 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. - * - * wolfSSL 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 - */ - -/* code submitted by raphael.huck@efixo.com */ - -#ifdef HAVE_CONFIG_H - #include -#endif - -#include -#include - -#if !defined(NO_SHA256) -#ifdef HAVE_FIPS - -int wc_InitSha256(Sha256* sha) -{ - return InitSha256_fips(sha); -} - - -int wc_Sha256Update(Sha256* sha, const byte* data, word32 len) -{ - return Sha256Update_fips(sha, data, len); -} - - -int wc_Sha256Final(Sha256* sha, byte* out) -{ - return Sha256Final_fips(sha, out); -} - - -int wc_Sha256Hash(const byte* data, word32 len, byte* out) -{ - return Sha256Hash(data, len, out); -} - -#else /* else build without fips */ - -#if !defined(NO_SHA256) && !defined(WOLFSSL_TI_HASH) - /* defined in port/ti/ti_sha256.c */ - -#if !defined (ALIGN32) - #if defined (__GNUC__) - #define ALIGN32 __attribute__ ( (aligned (32))) - #elif defined(_MSC_VER) - /* disable align warning, we want alignment ! */ - #pragma warning(disable: 4324) - #define ALIGN32 __declspec (align (32)) - #else - #define ALIGN32 - #endif -#endif - -#ifdef WOLFSSL_PIC32MZ_HASH -#define wc_InitSha256 wc_InitSha256_sw -#define wc_Sha256Update wc_Sha256Update_sw -#define wc_Sha256Final wc_Sha256Final_sw -#endif - -#ifdef HAVE_FIPS - /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ - #define FIPS_NO_WRAPPERS -#endif - -#if defined(USE_INTEL_SPEEDUP) -#define HAVE_INTEL_AVX1 -#define HAVE_INTEL_AVX2 - -#if defined(DEBUG_XMM) -#include "stdio.h" -#endif - -#endif - -#if defined(HAVE_INTEL_AVX2) -#define HAVE_INTEL_RORX -#endif - - -/***** -Intel AVX1/AVX2 Macro Control Structure - -#define HAVE_INTEL_AVX1 -#define HAVE_INTEL_AVX2 - -#define HAVE_INTEL_RORX - - -int InitSha256(Sha256* sha256) { - Save/Recover XMM, YMM - ... -} - -#if defined(HAVE_INTEL_AVX1)|| defined(HAVE_INTEL_AVX2) - Transform() ; Function prototype -#else - Transform() { } - int Sha256Final() { - Save/Recover XMM, YMM - ... - } -#endif - -#if defined(HAVE_INTEL_AVX1)|| defined(HAVE_INTEL_AVX2) - #if defined(HAVE_INTEL_RORX - #define RND with rorx instuction - #else - #define RND - #endif -#endif - -#if defined(HAVE_INTEL_AVX1) - - #define XMM Instructions/inline asm - - int Transform() { - Stitched Message Sched/Round - } - -#elif defined(HAVE_INTEL_AVX2) - - #define YMM Instructions/inline asm - - int Transform() { - More granural Stitched Message Sched/Round - } - -*/ - - -#if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) - -/* Each platform needs to query info type 1 from cpuid to see if aesni is - * supported. Also, let's setup a macro for proper linkage w/o ABI conflicts - */ - -#ifndef _MSC_VER - #define cpuid(reg, leaf, sub)\ - __asm__ __volatile__ ("cpuid":\ - "=a" (reg[0]), "=b" (reg[1]), "=c" (reg[2]), "=d" (reg[3]) :\ - "a" (leaf), "c"(sub)); - - #define XASM_LINK(f) asm(f) -#else - - #include - #define cpuid(a,b) __cpuid((int*)a,b) - - #define XASM_LINK(f) - -#endif /* _MSC_VER */ - -#define EAX 0 -#define EBX 1 -#define ECX 2 -#define EDX 3 - -#define CPUID_AVX1 0x1 -#define CPUID_AVX2 0x2 -#define CPUID_RDRAND 0x4 -#define CPUID_RDSEED 0x8 -#define CPUID_BMI2 0x10 /* MULX, RORX */ - -#define IS_INTEL_AVX1 (cpuid_flags&CPUID_AVX1) -#define IS_INTEL_AVX2 (cpuid_flags&CPUID_AVX2) -#define IS_INTEL_BMI2 (cpuid_flags&CPUID_BMI2) -#define IS_INTEL_RDRAND (cpuid_flags&CPUID_RDRAND) -#define IS_INTEL_RDSEED (cpuid_flags&CPUID_RDSEED) - -static word32 cpuid_check = 0 ; -static word32 cpuid_flags = 0 ; - -static word32 cpuid_flag(word32 leaf, word32 sub, word32 num, word32 bit) { - int got_intel_cpu=0; - unsigned int reg[5]; - - reg[4] = '\0' ; - cpuid(reg, 0, 0); - if(memcmp((char *)&(reg[EBX]), "Genu", 4) == 0 && - memcmp((char *)&(reg[EDX]), "ineI", 4) == 0 && - memcmp((char *)&(reg[ECX]), "ntel", 4) == 0) { - got_intel_cpu = 1; - } - if (got_intel_cpu) { - cpuid(reg, leaf, sub); - return((reg[num]>>bit)&0x1) ; - } - return 0 ; -} - -static int set_cpuid_flags(void) { - if(cpuid_check==0) { - if(cpuid_flag(1, 0, ECX, 28)){ cpuid_flags |= CPUID_AVX1 ;} - if(cpuid_flag(7, 0, EBX, 5)){ cpuid_flags |= CPUID_AVX2 ; } - if(cpuid_flag(7, 0, EBX, 8)) { cpuid_flags |= CPUID_BMI2 ; } - if(cpuid_flag(1, 0, ECX, 30)){ cpuid_flags |= CPUID_RDRAND ; } - if(cpuid_flag(7, 0, EBX, 18)){ cpuid_flags |= CPUID_RDSEED ; } - cpuid_check = 1 ; - return 0 ; - } - return 1 ; -} - - -/* #if defined(HAVE_INTEL_AVX1/2) at the tail of sha512 */ -static int Transform(Sha256* sha256); - -#if defined(HAVE_INTEL_AVX1) -static int Transform_AVX1(Sha256 *sha256) ; -#endif -#if defined(HAVE_INTEL_AVX2) -static int Transform_AVX2(Sha256 *sha256) ; -static int Transform_AVX1_RORX(Sha256 *sha256) ; -#endif - -static int (*Transform_p)(Sha256* sha256) /* = _Transform */; - -#define XTRANSFORM(sha256, B) (*Transform_p)(sha256) - -static void set_Transform(void) { - if(set_cpuid_flags())return ; - -#if defined(HAVE_INTEL_AVX2) - if(IS_INTEL_AVX2 && IS_INTEL_BMI2){ - Transform_p = Transform_AVX1_RORX; return ; - Transform_p = Transform_AVX2 ; - /* for avoiding warning,"not used" */ - } -#endif -#if defined(HAVE_INTEL_AVX1) - Transform_p = ((IS_INTEL_AVX1) ? Transform_AVX1 : Transform) ; return ; -#endif - Transform_p = Transform ; return ; -} - -#else - #if defined(FREESCALE_MMCAU) - #define XTRANSFORM(sha256, B) Transform(sha256, B) - #else - #define XTRANSFORM(sha256, B) Transform(sha256) - #endif -#endif - -/* Dummy for saving MM_REGs on behalf of Transform */ -#if defined(HAVE_INTEL_AVX2)&& !defined(HAVE_INTEL_AVX1) -#define SAVE_XMM_YMM __asm__ volatile("or %%r8d, %%r8d":::\ - "%ymm4","%ymm5","%ymm6","%ymm7","%ymm8","%ymm9","%ymm10","%ymm11","%ymm12","%ymm13","%ymm14","%ymm15") -#elif defined(HAVE_INTEL_AVX1) -#define SAVE_XMM_YMM __asm__ volatile("or %%r8d, %%r8d":::\ - "xmm0","xmm1","xmm2","xmm3","xmm4","xmm5","xmm6","xmm7","xmm8","xmm9","xmm10",\ - "xmm11","xmm12","xmm13","xmm14","xmm15") -#else -#define SAVE_XMM_YMM -#endif - -#ifdef WOLFSSL_PIC32MZ_HASH -#define InitSha256 InitSha256_sw -#define Sha256Update Sha256Update_sw -#define Sha256Final Sha256Final_sw -#endif - -#include -#include - -#ifdef NO_INLINE - #include -#else - #include -#endif - -#ifdef FREESCALE_MMCAU - #include "cau_api.h" -#endif - -#ifndef WOLFSSL_HAVE_MIN -#define WOLFSSL_HAVE_MIN - - static INLINE word32 min(word32 a, word32 b) - { - return a > b ? b : a; - } - -#endif /* WOLFSSL_HAVE_MIN */ - - -int wc_InitSha256(Sha256* sha256) -{ - #ifdef FREESCALE_MMCAU - cau_sha256_initialize_output(sha256->digest); - #else - sha256->digest[0] = 0x6A09E667L; - sha256->digest[1] = 0xBB67AE85L; - sha256->digest[2] = 0x3C6EF372L; - sha256->digest[3] = 0xA54FF53AL; - sha256->digest[4] = 0x510E527FL; - sha256->digest[5] = 0x9B05688CL; - sha256->digest[6] = 0x1F83D9ABL; - sha256->digest[7] = 0x5BE0CD19L; - #endif - - sha256->buffLen = 0; - sha256->loLen = 0; - sha256->hiLen = 0; - -#if defined(HAVE_INTEL_AVX1)|| defined(HAVE_INTEL_AVX2) - set_Transform() ; /* choose best Transform function under this runtime environment */ -#endif - - return 0; -} - - -#if !defined(FREESCALE_MMCAU) -static const ALIGN32 word32 K[64] = { - 0x428A2F98L, 0x71374491L, 0xB5C0FBCFL, 0xE9B5DBA5L, 0x3956C25BL, - 0x59F111F1L, 0x923F82A4L, 0xAB1C5ED5L, 0xD807AA98L, 0x12835B01L, - 0x243185BEL, 0x550C7DC3L, 0x72BE5D74L, 0x80DEB1FEL, 0x9BDC06A7L, - 0xC19BF174L, 0xE49B69C1L, 0xEFBE4786L, 0x0FC19DC6L, 0x240CA1CCL, - 0x2DE92C6FL, 0x4A7484AAL, 0x5CB0A9DCL, 0x76F988DAL, 0x983E5152L, - 0xA831C66DL, 0xB00327C8L, 0xBF597FC7L, 0xC6E00BF3L, 0xD5A79147L, - 0x06CA6351L, 0x14292967L, 0x27B70A85L, 0x2E1B2138L, 0x4D2C6DFCL, - 0x53380D13L, 0x650A7354L, 0x766A0ABBL, 0x81C2C92EL, 0x92722C85L, - 0xA2BFE8A1L, 0xA81A664BL, 0xC24B8B70L, 0xC76C51A3L, 0xD192E819L, - 0xD6990624L, 0xF40E3585L, 0x106AA070L, 0x19A4C116L, 0x1E376C08L, - 0x2748774CL, 0x34B0BCB5L, 0x391C0CB3L, 0x4ED8AA4AL, 0x5B9CCA4FL, - 0x682E6FF3L, 0x748F82EEL, 0x78A5636FL, 0x84C87814L, 0x8CC70208L, - 0x90BEFFFAL, 0xA4506CEBL, 0xBEF9A3F7L, 0xC67178F2L -}; - -#endif - -#if defined(FREESCALE_MMCAU) - -static int Transform(Sha256* sha256, byte* buf) -{ - cau_sha256_hash_n(buf, 1, sha256->digest); - - return 0; -} - -#endif /* FREESCALE_MMCAU */ - -#define Ch(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) -#define Maj(x,y,z) ((((x) | (y)) & (z)) | ((x) & (y))) -#define R(x, n) (((x)&0xFFFFFFFFU)>>(n)) - -#define S(x, n) rotrFixed(x, n) -#define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22)) -#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25)) -#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3)) -#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10)) - -#define RND(a,b,c,d,e,f,g,h,i) \ - t0 = (h) + Sigma1((e)) + Ch((e), (f), (g)) + K[(i)] + W[(i)]; \ - t1 = Sigma0((a)) + Maj((a), (b), (c)); \ - (d) += t0; \ - (h) = t0 + t1; - -#if !defined(FREESCALE_MMCAU) -static int Transform(Sha256* sha256) -{ - word32 S[8], t0, t1; - int i; - -#ifdef WOLFSSL_SMALL_STACK - word32* W; - - W = (word32*) XMALLOC(sizeof(word32) * 64, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (W == NULL) - return MEMORY_E; -#else - word32 W[64]; -#endif - - /* Copy context->state[] to working vars */ - for (i = 0; i < 8; i++) - S[i] = sha256->digest[i]; - - for (i = 0; i < 16; i++) - W[i] = sha256->buffer[i]; - - for (i = 16; i < 64; i++) - W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15]) + W[i-16]; - - for (i = 0; i < 64; i += 8) { - RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],i+0); - RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],i+1); - RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],i+2); - RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],i+3); - RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],i+4); - RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],i+5); - RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],i+6); - RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],i+7); - } - - /* Add the working vars back into digest state[] */ - for (i = 0; i < 8; i++) { - sha256->digest[i] += S[i]; - } - -#ifdef WOLFSSL_SMALL_STACK - XFREE(W, NULL, DYNAMIC_TYPE_TMP_BUFFER); -#endif - - return 0; -} - -#endif /* #if !defined(FREESCALE_MMCAU) */ - -static INLINE void AddLength(Sha256* sha256, word32 len) -{ - word32 tmp = sha256->loLen; - if ( (sha256->loLen += len) < tmp) - sha256->hiLen++; /* carry low to high */ -} - -int wc_Sha256Update(Sha256* sha256, const byte* data, word32 len) -{ - - /* do block size increments */ - byte* local = (byte*)sha256->buffer; - - SAVE_XMM_YMM ; /* for Intel AVX */ - - while (len) { - word32 add = min(len, SHA256_BLOCK_SIZE - sha256->buffLen); - XMEMCPY(&local[sha256->buffLen], data, add); - - sha256->buffLen += add; - data += add; - len -= add; - - if (sha256->buffLen == SHA256_BLOCK_SIZE) { - int ret; - - #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) - #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) - if(!IS_INTEL_AVX1 && !IS_INTEL_AVX2) - #endif - ByteReverseWords(sha256->buffer, sha256->buffer, - SHA256_BLOCK_SIZE); - #endif - ret = XTRANSFORM(sha256, local); - if (ret != 0) - return ret; - - AddLength(sha256, SHA256_BLOCK_SIZE); - sha256->buffLen = 0; - } - } - - return 0; -} - -int wc_Sha256Final(Sha256* sha256, byte* hash) -{ - byte* local = (byte*)sha256->buffer; - int ret; - - SAVE_XMM_YMM ; /* for Intel AVX */ - - AddLength(sha256, sha256->buffLen); /* before adding pads */ - - local[sha256->buffLen++] = 0x80; /* add 1 */ - - /* pad with zeros */ - if (sha256->buffLen > SHA256_PAD_SIZE) { - XMEMSET(&local[sha256->buffLen], 0, SHA256_BLOCK_SIZE - sha256->buffLen); - sha256->buffLen += SHA256_BLOCK_SIZE - sha256->buffLen; - - #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) - #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) - if(!IS_INTEL_AVX1 && !IS_INTEL_AVX2) - #endif - ByteReverseWords(sha256->buffer, sha256->buffer, SHA256_BLOCK_SIZE); - #endif - - ret = XTRANSFORM(sha256, local); - if (ret != 0) - return ret; - - sha256->buffLen = 0; - } - XMEMSET(&local[sha256->buffLen], 0, SHA256_PAD_SIZE - sha256->buffLen); - - /* put lengths in bits */ - sha256->hiLen = (sha256->loLen >> (8*sizeof(sha256->loLen) - 3)) + - (sha256->hiLen << 3); - sha256->loLen = sha256->loLen << 3; - - /* store lengths */ - #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) - #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) - if(!IS_INTEL_AVX1 && !IS_INTEL_AVX2) - #endif - ByteReverseWords(sha256->buffer, sha256->buffer, SHA256_BLOCK_SIZE); - #endif - /* ! length ordering dependent on digest endian type ! */ - XMEMCPY(&local[SHA256_PAD_SIZE], &sha256->hiLen, sizeof(word32)); - XMEMCPY(&local[SHA256_PAD_SIZE + sizeof(word32)], &sha256->loLen, - sizeof(word32)); - - #if defined(FREESCALE_MMCAU) || defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) - /* Kinetis requires only these bytes reversed */ - #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) - if(IS_INTEL_AVX1 || IS_INTEL_AVX2) - #endif - ByteReverseWords(&sha256->buffer[SHA256_PAD_SIZE/sizeof(word32)], - &sha256->buffer[SHA256_PAD_SIZE/sizeof(word32)], - 2 * sizeof(word32)); - #endif - - ret = XTRANSFORM(sha256, local); - if (ret != 0) - return ret; - - #if defined(LITTLE_ENDIAN_ORDER) - ByteReverseWords(sha256->digest, sha256->digest, SHA256_DIGEST_SIZE); - #endif - XMEMCPY(hash, sha256->digest, SHA256_DIGEST_SIZE); - - return wc_InitSha256(sha256); /* reset state */ -} - - - -int wc_Sha256Hash(const byte* data, word32 len, byte* hash) -{ - int ret = 0; -#ifdef WOLFSSL_SMALL_STACK - Sha256* sha256; -#else - Sha256 sha256[1]; -#endif - -#ifdef WOLFSSL_SMALL_STACK - sha256 = (Sha256*)XMALLOC(sizeof(Sha256), NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (sha256 == NULL) - return MEMORY_E; -#endif - - if ((ret = wc_InitSha256(sha256)) != 0) { - WOLFSSL_MSG("InitSha256 failed"); - } - else if ((ret = wc_Sha256Update(sha256, data, len)) != 0) { - WOLFSSL_MSG("Sha256Update failed"); - } - else if ((ret = wc_Sha256Final(sha256, hash)) != 0) { - WOLFSSL_MSG("Sha256Final failed"); - } - -#ifdef WOLFSSL_SMALL_STACK - XFREE(sha256, NULL, DYNAMIC_TYPE_TMP_BUFFER); -#endif - - return ret; -} - -#ifdef WOLFSSL_TI_HASH -#include "wolfssl/wolfcrypt/port/ti/ti-hash.h" -#endif -int wc_Sha256GetHash(Sha256* sha256, byte* hash) -{ -#if defined(WOLFSS_TI_HASH) - return wc_Sha256GetHash_TI(sha256, hash) ; -#else - int ret ; - Sha256 save = *sha256 ; - ret = wc_Sha256Final(sha256, hash) ; - *sha256 = save ; - return ret ; -#endif -} - -#if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) - -#define _DigestToReg(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ - { word32 d ;\ - d = sha256->digest[0]; __asm__ volatile("movl %0, %"#S_0::"r"(d):SSE_REGs) ;\ - d = sha256->digest[1]; __asm__ volatile("movl %0, %"#S_1::"r"(d):SSE_REGs) ;\ - d = sha256->digest[2]; __asm__ volatile("movl %0, %"#S_2::"r"(d):SSE_REGs) ;\ - d = sha256->digest[3]; __asm__ volatile("movl %0, %"#S_3::"r"(d):SSE_REGs) ;\ - d = sha256->digest[4]; __asm__ volatile("movl %0, %"#S_4::"r"(d):SSE_REGs) ;\ - d = sha256->digest[5]; __asm__ volatile("movl %0, %"#S_5::"r"(d):SSE_REGs) ;\ - d = sha256->digest[6]; __asm__ volatile("movl %0, %"#S_6::"r"(d):SSE_REGs) ;\ - d = sha256->digest[7]; __asm__ volatile("movl %0, %"#S_7::"r"(d):SSE_REGs) ;\ -} - -#define _RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ - { word32 d ; \ - __asm__ volatile("movl %"#S_0", %0":"=r"(d)::SSE_REGs) ; sha256->digest[0] += d;\ - __asm__ volatile("movl %"#S_1", %0":"=r"(d)::SSE_REGs) ; sha256->digest[1] += d;\ - __asm__ volatile("movl %"#S_2", %0":"=r"(d)::SSE_REGs) ; sha256->digest[2] += d;\ - __asm__ volatile("movl %"#S_3", %0":"=r"(d)::SSE_REGs) ; sha256->digest[3] += d;\ - __asm__ volatile("movl %"#S_4", %0":"=r"(d)::SSE_REGs) ; sha256->digest[4] += d;\ - __asm__ volatile("movl %"#S_5", %0":"=r"(d)::SSE_REGs) ; sha256->digest[5] += d;\ - __asm__ volatile("movl %"#S_6", %0":"=r"(d)::SSE_REGs) ; sha256->digest[6] += d;\ - __asm__ volatile("movl %"#S_7", %0":"=r"(d)::SSE_REGs) ; sha256->digest[7] += d;\ -} - - -#define DigestToReg(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ - _DigestToReg(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 ) - -#define RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ - _RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 ) - - - - -#define S_0 %r15d -#define S_1 %r10d -#define S_2 %r11d -#define S_3 %r12d -#define S_4 %r13d -#define S_5 %r14d -#define S_6 %ebx -#define S_7 %r9d - -#define SSE_REGs "%edi", "%ecx", "%esi", "%edx", "%ebx","%r8","%r9","%r10","%r11","%r12","%r13","%r14","%r15" - -#if defined(HAVE_INTEL_RORX) -#define RND_STEP_RORX_1(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("rorx $6, %"#e", %%edx\n\t":::"%edx",SSE_REGs); /* edx = e>>6 */\ - -#define RND_STEP_RORX_2(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("rorx $11, %"#e",%%edi\n\t":::"%edi",SSE_REGs); /* edi = e>>11 */\ -__asm__ volatile("xorl %%edx, %%edi\n\t":::"%edx","%edi",SSE_REGs); /* edi = (e>>11) ^ (e>>6) */\ -__asm__ volatile("rorx $25, %"#e", %%edx\n\t":::"%edx",SSE_REGs); /* edx = e>>25 */\ - -#define RND_STEP_RORX_3(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("movl %"#f", %%esi\n\t":::"%esi",SSE_REGs); /* esi = f */\ -__asm__ volatile("xorl %"#g", %%esi\n\t":::"%esi",SSE_REGs); /* esi = f ^ g */\ -__asm__ volatile("xorl %%edi, %%edx\n\t":::"%edi","%edx",SSE_REGs); /* edx = Sigma1(e) */\ -__asm__ volatile("andl %"#e", %%esi\n\t":::"%esi",SSE_REGs); /* esi = (f ^ g) & e */\ -__asm__ volatile("xorl %"#g", %%esi\n\t":::"%esi",SSE_REGs); /* esi = Ch(e,f,g) */\ - -#define RND_STEP_RORX_4(a,b,c,d,e,f,g,h,i)\ -/*__asm__ volatile("movl %0, %%edx\n\t"::"m"(w_k):"%edx");*/\ -__asm__ volatile("addl %0, %"#h"\n\t"::"r"(W_K[i]):SSE_REGs); /* h += w_k */\ -__asm__ volatile("addl %%edx, %"#h"\n\t":::"%edx",SSE_REGs); /* h = h + w_k + Sigma1(e) */\ -__asm__ volatile("rorx $2, %"#a", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = a>>2 */\ -__asm__ volatile("rorx $13, %"#a", %%edi\n\t":::"%edi",SSE_REGs);/* edi = a>>13 */\ - -#define RND_STEP_RORX_5(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("rorx $22, %"#a", %%edx\n\t":::"%edx",SSE_REGs); /* edx = a>>22 */\ -__asm__ volatile("xorl %%r8d, %%edi\n\t":::"%edi","%r8",SSE_REGs);/* edi = (a>>2) ^ (a>>13) */\ -__asm__ volatile("xorl %%edi, %%edx\n\t":::"%edi","%edx",SSE_REGs); /* edx = Sigma0(a) */\ - -#define RND_STEP_RORX_6(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("movl %"#b", %%edi\n\t":::"%edi",SSE_REGs); /* edi = b */\ -__asm__ volatile("orl %"#a", %%edi\n\t":::"%edi",SSE_REGs); /* edi = a | b */\ -__asm__ volatile("andl %"#c", %%edi\n\t":::"%edi",SSE_REGs); /* edi = (a | b) & c*/\ -__asm__ volatile("movl %"#b", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = b */\ - -#define RND_STEP_RORX_7(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("addl %%esi, %"#h"\n\t":::"%esi",SSE_REGs); /* h += Ch(e,f,g) */\ -__asm__ volatile("andl %"#a", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = b & a */\ -__asm__ volatile("orl %%edi, %%r8d\n\t":::"%edi","%r8",SSE_REGs); /* r8d = Maj(a,b,c) */\ - -#define RND_STEP_RORX_8(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("addl "#h", "#d"\n\t"); /* d += h + w_k + Sigma1(e) + Ch(e,f,g) */\ -__asm__ volatile("addl %"#h", %%r8d\n\t":::"%r8",SSE_REGs); \ -__asm__ volatile("addl %%edx, %%r8d\n\t":::"%edx","%r8",SSE_REGs); \ -__asm__ volatile("movl %r8d, "#h"\n\t"); - -#endif - -#define RND_STEP_1(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("movl %"#e", %%edx\n\t":::"%edx",SSE_REGs);\ -__asm__ volatile("roll $26, %%edx\n\t":::"%edx",SSE_REGs); /* edx = e>>6 */\ -__asm__ volatile("movl %"#e", %%edi\n\t":::"%edi",SSE_REGs);\ - -#define RND_STEP_2(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("roll $21, %%edi\n\t":::"%edi",SSE_REGs); /* edi = e>>11 */\ -__asm__ volatile("xorl %%edx, %%edi\n\t":::"%edx","%edi",SSE_REGs); /* edi = (e>>11) ^ (e>>6) */\ -__asm__ volatile("movl %"#e", %%edx\n\t":::"%edx",SSE_REGs); /* edx = e */\ -__asm__ volatile("roll $7, %%edx\n\t":::"%edx",SSE_REGs); /* edx = e>>25 */\ - -#define RND_STEP_3(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("movl %"#f", %%esi\n\t":::"%esi",SSE_REGs); /* esi = f */\ -__asm__ volatile("xorl %"#g", %%esi\n\t":::"%esi",SSE_REGs); /* esi = f ^ g */\ -__asm__ volatile("xorl %%edi, %%edx\n\t":::"%edi","%edx",SSE_REGs); /* edx = Sigma1(e) */\ -__asm__ volatile("andl %"#e", %%esi\n\t":::"%esi",SSE_REGs); /* esi = (f ^ g) & e */\ -__asm__ volatile("xorl %"#g", %%esi\n\t":::"%esi",SSE_REGs); /* esi = Ch(e,f,g) */\ - -#define RND_STEP_4(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("addl %0, %"#h"\n\t"::"r"(W_K[i]):SSE_REGs); /* h += w_k */\ -__asm__ volatile("addl %%edx, %"#h"\n\t":::"%edx",SSE_REGs); /* h = h + w_k + Sigma1(e) */\ -__asm__ volatile("movl %"#a", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = a */\ -__asm__ volatile("roll $30, %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = a>>2 */\ -__asm__ volatile("movl %"#a", %%edi\n\t":::"%edi",SSE_REGs); /* edi = a */\ -__asm__ volatile("roll $19, %%edi\n\t":::"%edi",SSE_REGs); /* edi = a>>13 */\ -__asm__ volatile("movl %"#a", %%edx\n\t":::"%edx",SSE_REGs); /* edx = a */\ - -#define RND_STEP_5(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("roll $10, %%edx\n\t":::"%edx",SSE_REGs); /* edx = a>>22 */\ -__asm__ volatile("xorl %%r8d, %%edi\n\t":::"%edi","%r8",SSE_REGs); /* edi = (a>>2) ^ (a>>13) */\ -__asm__ volatile("xorl %%edi, %%edx\n\t":::"%edi","%edx",SSE_REGs);/* edx = Sigma0(a) */\ - -#define RND_STEP_6(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("movl %"#b", %%edi\n\t":::"%edi",SSE_REGs); /* edi = b */\ -__asm__ volatile("orl %"#a", %%edi\n\t":::"%edi",SSE_REGs); /* edi = a | b */\ -__asm__ volatile("andl %"#c", %%edi\n\t":::"%edi",SSE_REGs); /* edi = (a | b) & c */\ -__asm__ volatile("movl %"#b", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = b */\ - -#define RND_STEP_7(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("addl %%esi, %"#h"\n\t":::"%esi",SSE_REGs); /* h += Ch(e,f,g) */\ -__asm__ volatile("andl %"#a", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = b & a */\ -__asm__ volatile("orl %%edi, %%r8d\n\t":::"%edi","%r8",SSE_REGs); /* r8d = Maj(a,b,c) */\ - -#define RND_STEP_8(a,b,c,d,e,f,g,h,i)\ -__asm__ volatile("addl "#h", "#d"\n\t"); /* d += h + w_k + Sigma1(e) + Ch(e,f,g) */\ -__asm__ volatile("addl %"#h", %%r8d\n\t":::"%r8",SSE_REGs); \ - /* r8b = h + w_k + Sigma1(e) + Ch(e,f,g) + Maj(a,b,c) */\ -__asm__ volatile("addl %%edx, %%r8d\n\t":::"%edx","%r8",SSE_REGs);\ - /* r8b = h + w_k + Sigma1(e) Sigma0(a) + Ch(e,f,g) + Maj(a,b,c) */\ -__asm__ volatile("movl %%r8d, %"#h"\n\t":::"%r8", SSE_REGs); \ - /* h = h + w_k + Sigma1(e) + Sigma0(a) + Ch(e,f,g) + Maj(a,b,c) */ \ - -#define RND_X(a,b,c,d,e,f,g,h,i) \ - RND_STEP_1(a,b,c,d,e,f,g,h,i); \ - RND_STEP_2(a,b,c,d,e,f,g,h,i); \ - RND_STEP_3(a,b,c,d,e,f,g,h,i); \ - RND_STEP_4(a,b,c,d,e,f,g,h,i); \ - RND_STEP_5(a,b,c,d,e,f,g,h,i); \ - RND_STEP_6(a,b,c,d,e,f,g,h,i); \ - RND_STEP_7(a,b,c,d,e,f,g,h,i); \ - RND_STEP_8(a,b,c,d,e,f,g,h,i); - -#define RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i); -#define RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_7,S_0,S_1,S_2,S_3,S_4,S_5,S_6,_i); -#define RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_6,S_7,S_0,S_1,S_2,S_3,S_4,S_5,_i); -#define RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_5,S_6,S_7,S_0,S_1,S_2,S_3,S_4,_i); -#define RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,_i); -#define RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_3,S_4,S_5,S_6,S_7,S_0,S_1,S_2,_i); -#define RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_2,S_3,S_4,S_5,S_6,S_7,S_0,S_1,_i); -#define RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_0,_i); - - -#define RND_1_3(a,b,c,d,e,f,g,h,i) {\ - RND_STEP_1(a,b,c,d,e,f,g,h,i); \ - RND_STEP_2(a,b,c,d,e,f,g,h,i); \ - RND_STEP_3(a,b,c,d,e,f,g,h,i); \ -} - -#define RND_4_6(a,b,c,d,e,f,g,h,i) {\ - RND_STEP_4(a,b,c,d,e,f,g,h,i); \ - RND_STEP_5(a,b,c,d,e,f,g,h,i); \ - RND_STEP_6(a,b,c,d,e,f,g,h,i); \ -} - -#define RND_7_8(a,b,c,d,e,f,g,h,i) {\ - RND_STEP_7(a,b,c,d,e,f,g,h,i); \ - RND_STEP_8(a,b,c,d,e,f,g,h,i); \ -} - -#define RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i); -#define RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_7,S_0,S_1,S_2,S_3,S_4,S_5,S_6,_i); -#define RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_6,S_7,S_0,S_1,S_2,S_3,S_4,S_5,_i); -#define RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_5,S_6,S_7,S_0,S_1,S_2,S_3,S_4,_i); -#define RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,_i); -#define RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_3,S_4,S_5,S_6,S_7,S_0,S_1,S_2,_i); -#define RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_2,S_3,S_4,S_5,S_6,S_7,S_0,S_1,_i); -#define RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_0,_i); - - -#define RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i); -#define RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_7,S_0,S_1,S_2,S_3,S_4,S_5,S_6,_i); -#define RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_6,S_7,S_0,S_1,S_2,S_3,S_4,S_5,_i); -#define RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_5,S_6,S_7,S_0,S_1,S_2,S_3,S_4,_i); -#define RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,_i); -#define RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_3,S_4,S_5,S_6,S_7,S_0,S_1,S_2,_i); -#define RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_2,S_3,S_4,S_5,S_6,S_7,S_0,S_1,_i); -#define RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_0,_i); - -#define RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i); -#define RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_7,S_0,S_1,S_2,S_3,S_4,S_5,S_6,_i); -#define RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_6,S_7,S_0,S_1,S_2,S_3,S_4,S_5,_i); -#define RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_5,S_6,S_7,S_0,S_1,S_2,S_3,S_4,_i); -#define RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,_i); -#define RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_3,S_4,S_5,S_6,S_7,S_0,S_1,S_2,_i); -#define RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_2,S_3,S_4,S_5,S_6,S_7,S_0,S_1,_i); -#define RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_0,_i); - -#define RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i); -#define RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_7,S_0,S_1,S_2,S_3,S_4,S_5,S_6,_i); -#define RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_6,S_7,S_0,S_1,S_2,S_3,S_4,S_5,_i); -#define RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_5,S_6,S_7,S_0,S_1,S_2,S_3,S_4,_i); -#define RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,_i); -#define RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_3,S_4,S_5,S_6,S_7,S_0,S_1,S_2,_i); -#define RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_2,S_3,S_4,S_5,S_6,S_7,S_0,S_1,_i); -#define RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_0,_i); - -#define FOR(cnt, init, max, inc, loop) \ - __asm__ volatile("movl $"#init", %0\n\t"#loop":"::"m"(cnt):) -#define END(cnt, init, max, inc, loop) \ - __asm__ volatile("addl $"#inc", %0\n\tcmpl $"#max", %0\n\tjle "#loop"\n\t":"=m"(cnt)::) ; - -#endif /* defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) */ - -#if defined(HAVE_INTEL_AVX1) /* inline Assember for Intel AVX1 instructions */ - -#define VPALIGNR(op1,op2,op3,op4) __asm__ volatile("vpalignr $"#op4", %"#op3", %"#op2", %"#op1:::XMM_REGs) -#define VPADDD(op1,op2,op3) __asm__ volatile("vpaddd %"#op3", %"#op2", %"#op1:::XMM_REGs) -#define VPSRLD(op1,op2,op3) __asm__ volatile("vpsrld $"#op3", %"#op2", %"#op1:::XMM_REGs) -#define VPSRLQ(op1,op2,op3) __asm__ volatile("vpsrlq $"#op3", %"#op2", %"#op1:::XMM_REGs) -#define VPSLLD(op1,op2,op3) __asm__ volatile("vpslld $"#op3", %"#op2", %"#op1:::XMM_REGs) -#define VPOR(op1,op2,op3) __asm__ volatile("vpor %"#op3", %"#op2", %"#op1:::XMM_REGs) -#define VPXOR(op1,op2,op3) __asm__ volatile("vpxor %"#op3", %"#op2", %"#op1:::XMM_REGs) -#define VPSHUFD(op1,op2,op3) __asm__ volatile("vpshufd $"#op3", %"#op2", %"#op1:::XMM_REGs) -#define VPSHUFB(op1,op2,op3) __asm__ volatile("vpshufb %"#op3", %"#op2", %"#op1:::XMM_REGs) - -#define MessageSched(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, SHUF_00BA, SHUF_DC00,\ - a,b,c,d,e,f,g,h,_i)\ - RND_STEP_1(a,b,c,d,e,f,g,h,_i);\ - VPALIGNR (XTMP0, X3, X2, 4) ;\ - RND_STEP_2(a,b,c,d,e,f,g,h,_i);\ - VPADDD (XTMP0, XTMP0, X0) ;\ - RND_STEP_3(a,b,c,d,e,f,g,h,_i);\ - VPALIGNR (XTMP1, X1, X0, 4) ; /* XTMP1 = W[-15] */\ - RND_STEP_4(a,b,c,d,e,f,g,h,_i);\ - VPSRLD (XTMP2, XTMP1, 7) ;\ - RND_STEP_5(a,b,c,d,e,f,g,h,_i);\ - VPSLLD (XTMP3, XTMP1, 25) ; /* VPSLLD (XTMP3, XTMP1, (32-7)) */\ - RND_STEP_6(a,b,c,d,e,f,g,h,_i);\ - VPOR (XTMP3, XTMP3, XTMP2) ; /* XTMP1 = W[-15] MY_ROR 7 */\ - RND_STEP_7(a,b,c,d,e,f,g,h,_i);\ - VPSRLD (XTMP2, XTMP1,18) ;\ - RND_STEP_8(a,b,c,d,e,f,g,h,_i);\ -\ - RND_STEP_1(h,a,b,c,d,e,f,g,_i+1);\ - VPSRLD (XTMP4, XTMP1, 3) ; /* XTMP4 = W[-15] >> 3 */\ - RND_STEP_2(h,a,b,c,d,e,f,g,_i+1);\ - VPSLLD (XTMP1, XTMP1, 14) ; /* VPSLLD (XTMP1, XTMP1, (32-18)) */\ - RND_STEP_3(h,a,b,c,d,e,f,g,_i+1);\ - VPXOR (XTMP3, XTMP3, XTMP1) ;\ - RND_STEP_4(h,a,b,c,d,e,f,g,_i+1);\ - VPXOR (XTMP3, XTMP3, XTMP2) ; /* XTMP1 = W[-15] MY_ROR 7 ^ W[-15] MY_ROR 18 */\ - RND_STEP_5(h,a,b,c,d,e,f,g,_i+1);\ - VPXOR (XTMP1, XTMP3, XTMP4) ; /* XTMP1 = s0 */\ - RND_STEP_6(h,a,b,c,d,e,f,g,_i+1);\ - VPSHUFD(XTMP2, X3, 0b11111010) ; /* XTMP2 = W[-2] {BBAA}*/\ - RND_STEP_7(h,a,b,c,d,e,f,g,_i+1);\ - VPADDD (XTMP0, XTMP0, XTMP1) ; /* XTMP0 = W[-16] + W[-7] + s0 */\ - RND_STEP_8(h,a,b,c,d,e,f,g,_i+1);\ -\ - RND_STEP_1(g,h,a,b,c,d,e,f,_i+2);\ - VPSRLD (XTMP4, XTMP2, 10) ; /* XTMP4 = W[-2] >> 10 {BBAA} */\ - RND_STEP_2(g,h,a,b,c,d,e,f,_i+2);\ - VPSRLQ (XTMP3, XTMP2, 19) ; /* XTMP3 = W[-2] MY_ROR 19 {xBxA} */\ - RND_STEP_3(g,h,a,b,c,d,e,f,_i+2);\ - VPSRLQ (XTMP2, XTMP2, 17) ; /* XTMP2 = W[-2] MY_ROR 17 {xBxA} */\ - RND_STEP_4(g,h,a,b,c,d,e,f,_i+2);\ - VPXOR (XTMP2, XTMP2, XTMP3) ;\ - RND_STEP_5(g,h,a,b,c,d,e,f,_i+2);\ - VPXOR (XTMP4, XTMP4, XTMP2) ; /* XTMP4 = s1 {xBxA} */\ - RND_STEP_6(g,h,a,b,c,d,e,f,_i+2);\ - VPSHUFB (XTMP4, XTMP4, SHUF_00BA) ; /* XTMP4 = s1 {00BA} */\ - RND_STEP_7(g,h,a,b,c,d,e,f,_i+2);\ - VPADDD (XTMP0, XTMP0, XTMP4) ; /* XTMP0 = {..., ..., W[1], W[0]} */\ - RND_STEP_8(g,h,a,b,c,d,e,f,_i+2);\ -\ - RND_STEP_1(f,g,h,a,b,c,d,e,_i+3);\ - VPSHUFD (XTMP2, XTMP0, 0b01010000) ; /* XTMP2 = W[-2] {DDCC} */\ - RND_STEP_2(f,g,h,a,b,c,d,e,_i+3);\ - VPSRLD (XTMP5, XTMP2, 10); /* XTMP5 = W[-2] >> 10 {DDCC} */\ - RND_STEP_3(f,g,h,a,b,c,d,e,_i+3);\ - VPSRLQ (XTMP3, XTMP2, 19); /* XTMP3 = W[-2] MY_ROR 19 {xDxC} */\ - RND_STEP_4(f,g,h,a,b,c,d,e,_i+3);\ - VPSRLQ (XTMP2, XTMP2, 17) ; /* XTMP2 = W[-2] MY_ROR 17 {xDxC} */\ - RND_STEP_5(f,g,h,a,b,c,d,e,_i+3);\ - VPXOR (XTMP2, XTMP2, XTMP3) ;\ - RND_STEP_6(f,g,h,a,b,c,d,e,_i+3);\ - VPXOR (XTMP5, XTMP5, XTMP2) ; /* XTMP5 = s1 {xDxC} */\ - RND_STEP_7(f,g,h,a,b,c,d,e,_i+3);\ - VPSHUFB (XTMP5, XTMP5, SHUF_DC00) ; /* XTMP5 = s1 {DC00} */\ - RND_STEP_8(f,g,h,a,b,c,d,e,_i+3);\ - VPADDD (X0, XTMP5, XTMP0) ; /* X0 = {W[3], W[2], W[1], W[0]} */\ - -#if defined(HAVE_INTEL_RORX) - -#define MessageSched_RORX(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, \ - XFER, SHUF_00BA, SHUF_DC00,a,b,c,d,e,f,g,h,_i)\ - RND_STEP_RORX_1(a,b,c,d,e,f,g,h,_i);\ - VPALIGNR (XTMP0, X3, X2, 4) ;\ - RND_STEP_RORX_2(a,b,c,d,e,f,g,h,_i);\ - VPADDD (XTMP0, XTMP0, X0) ;\ - RND_STEP_RORX_3(a,b,c,d,e,f,g,h,_i);\ - VPALIGNR (XTMP1, X1, X0, 4) ; /* XTMP1 = W[-15] */\ - RND_STEP_RORX_4(a,b,c,d,e,f,g,h,_i);\ - VPSRLD (XTMP2, XTMP1, 7) ;\ - RND_STEP_RORX_5(a,b,c,d,e,f,g,h,_i);\ - VPSLLD (XTMP3, XTMP1, 25) ; /* VPSLLD (XTMP3, XTMP1, (32-7)) */\ - RND_STEP_RORX_6(a,b,c,d,e,f,g,h,_i);\ - VPOR (XTMP3, XTMP3, XTMP2) ; /* XTMP1 = W[-15] MY_ROR 7 */\ - RND_STEP_RORX_7(a,b,c,d,e,f,g,h,_i);\ - VPSRLD (XTMP2, XTMP1,18) ;\ - RND_STEP_RORX_8(a,b,c,d,e,f,g,h,_i);\ -\ - RND_STEP_RORX_1(h,a,b,c,d,e,f,g,_i+1);\ - VPSRLD (XTMP4, XTMP1, 3) ; /* XTMP4 = W[-15] >> 3 */\ - RND_STEP_RORX_2(h,a,b,c,d,e,f,g,_i+1);\ - VPSLLD (XTMP1, XTMP1, 14) ; /* VPSLLD (XTMP1, XTMP1, (32-18)) */\ - RND_STEP_RORX_3(h,a,b,c,d,e,f,g,_i+1);\ - VPXOR (XTMP3, XTMP3, XTMP1) ;\ - RND_STEP_RORX_4(h,a,b,c,d,e,f,g,_i+1);\ - VPXOR (XTMP3, XTMP3, XTMP2) ; /* XTMP1 = W[-15] MY_ROR 7 ^ W[-15] MY_ROR 18 */\ - RND_STEP_RORX_5(h,a,b,c,d,e,f,g,_i+1);\ - VPXOR (XTMP1, XTMP3, XTMP4) ; /* XTMP1 = s0 */\ - RND_STEP_RORX_6(h,a,b,c,d,e,f,g,_i+1);\ - VPSHUFD(XTMP2, X3, 0b11111010) ; /* XTMP2 = W[-2] {BBAA}*/\ - RND_STEP_RORX_7(h,a,b,c,d,e,f,g,_i+1);\ - VPADDD (XTMP0, XTMP0, XTMP1) ; /* XTMP0 = W[-16] + W[-7] + s0 */\ - RND_STEP_RORX_8(h,a,b,c,d,e,f,g,_i+1);\ -\ - RND_STEP_RORX_1(g,h,a,b,c,d,e,f,_i+2);\ - VPSRLD (XTMP4, XTMP2, 10) ; /* XTMP4 = W[-2] >> 10 {BBAA} */\ - RND_STEP_RORX_2(g,h,a,b,c,d,e,f,_i+2);\ - VPSRLQ (XTMP3, XTMP2, 19) ; /* XTMP3 = W[-2] MY_ROR 19 {xBxA} */\ - RND_STEP_RORX_3(g,h,a,b,c,d,e,f,_i+2);\ - VPSRLQ (XTMP2, XTMP2, 17) ; /* XTMP2 = W[-2] MY_ROR 17 {xBxA} */\ - RND_STEP_RORX_4(g,h,a,b,c,d,e,f,_i+2);\ - VPXOR (XTMP2, XTMP2, XTMP3) ;\ - RND_STEP_RORX_5(g,h,a,b,c,d,e,f,_i+2);\ - VPXOR (XTMP4, XTMP4, XTMP2) ; /* XTMP4 = s1 {xBxA} */\ - RND_STEP_RORX_6(g,h,a,b,c,d,e,f,_i+2);\ - VPSHUFB (XTMP4, XTMP4, SHUF_00BA) ; /* XTMP4 = s1 {00BA} */\ - RND_STEP_RORX_7(g,h,a,b,c,d,e,f,_i+2);\ - VPADDD (XTMP0, XTMP0, XTMP4) ; /* XTMP0 = {..., ..., W[1], W[0]} */\ - RND_STEP_RORX_8(g,h,a,b,c,d,e,f,_i+2);\ -\ - RND_STEP_RORX_1(f,g,h,a,b,c,d,e,_i+3);\ - VPSHUFD (XTMP2, XTMP0, 0b01010000) ; /* XTMP2 = W[-2] {DDCC} */\ - RND_STEP_RORX_2(f,g,h,a,b,c,d,e,_i+3);\ - VPSRLD (XTMP5, XTMP2, 10); /* XTMP5 = W[-2] >> 10 {DDCC} */\ - RND_STEP_RORX_3(f,g,h,a,b,c,d,e,_i+3);\ - VPSRLQ (XTMP3, XTMP2, 19); /* XTMP3 = W[-2] MY_ROR 19 {xDxC} */\ - RND_STEP_RORX_4(f,g,h,a,b,c,d,e,_i+3);\ - VPSRLQ (XTMP2, XTMP2, 17) ; /* XTMP2 = W[-2] MY_ROR 17 {xDxC} */\ - RND_STEP_RORX_5(f,g,h,a,b,c,d,e,_i+3);\ - VPXOR (XTMP2, XTMP2, XTMP3) ;\ - RND_STEP_RORX_6(f,g,h,a,b,c,d,e,_i+3);\ - VPXOR (XTMP5, XTMP5, XTMP2) ; /* XTMP5 = s1 {xDxC} */\ - RND_STEP_RORX_7(f,g,h,a,b,c,d,e,_i+3);\ - VPSHUFB (XTMP5, XTMP5, SHUF_DC00) ; /* XTMP5 = s1 {DC00} */\ - RND_STEP_RORX_8(f,g,h,a,b,c,d,e,_i+3);\ - VPADDD (X0, XTMP5, XTMP0) ; /* X0 = {W[3], W[2], W[1], W[0]} */\ - -#endif - - -#define W_K_from_buff\ - __asm__ volatile("vmovdqu %0, %%xmm4\n\t"\ - "vpshufb %%xmm13, %%xmm4, %%xmm4\n\t"\ - :: "m"(sha256->buffer[0]):"%xmm4") ;\ - __asm__ volatile("vmovdqu %0, %%xmm5\n\t"\ - "vpshufb %%xmm13, %%xmm5, %%xmm5\n\t"\ - ::"m"(sha256->buffer[4]):"%xmm5") ;\ - __asm__ volatile("vmovdqu %0, %%xmm6\n\t"\ - "vpshufb %%xmm13, %%xmm6, %%xmm6\n\t"\ - ::"m"(sha256->buffer[8]):"%xmm6") ;\ - __asm__ volatile("vmovdqu %0, %%xmm7\n\t"\ - "vpshufb %%xmm13, %%xmm7, %%xmm7\n\t"\ - ::"m"(sha256->buffer[12]):"%xmm7") ;\ - -#define _SET_W_K_XFER(reg, i)\ - __asm__ volatile("vpaddd %0, %"#reg", %%xmm9"::"m"(K[i]):XMM_REGs) ;\ - __asm__ volatile("vmovdqa %%xmm9, %0":"=m"(W_K[i])::XMM_REGs) ; - -#define SET_W_K_XFER(reg, i) _SET_W_K_XFER(reg, i) - -static const ALIGN32 word64 mSHUF_00BA[] = { 0x0b0a090803020100, 0xFFFFFFFFFFFFFFFF } ; /* shuffle xBxA -> 00BA */ -static const ALIGN32 word64 mSHUF_DC00[] = { 0xFFFFFFFFFFFFFFFF, 0x0b0a090803020100 } ; /* shuffle xDxC -> DC00 */ -static const ALIGN32 word64 mBYTE_FLIP_MASK[] = { 0x0405060700010203, 0x0c0d0e0f08090a0b } ; - - -#define _Init_Masks(mask1, mask2, mask3)\ -__asm__ volatile("vmovdqu %0, %"#mask1 ::"m"(mBYTE_FLIP_MASK[0])) ;\ -__asm__ volatile("vmovdqu %0, %"#mask2 ::"m"(mSHUF_00BA[0])) ;\ -__asm__ volatile("vmovdqu %0, %"#mask3 ::"m"(mSHUF_DC00[0])) ; - -#define Init_Masks(BYTE_FLIP_MASK, SHUF_00BA, SHUF_DC00)\ - _Init_Masks(BYTE_FLIP_MASK, SHUF_00BA, SHUF_DC00) - -#define X0 %xmm4 -#define X1 %xmm5 -#define X2 %xmm6 -#define X3 %xmm7 -#define X_ X0 - -#define XTMP0 %xmm0 -#define XTMP1 %xmm1 -#define XTMP2 %xmm2 -#define XTMP3 %xmm3 -#define XTMP4 %xmm8 -#define XTMP5 %xmm9 -#define XFER %xmm10 - -#define SHUF_00BA %xmm11 /* shuffle xBxA -> 00BA */ -#define SHUF_DC00 %xmm12 /* shuffle xDxC -> DC00 */ -#define BYTE_FLIP_MASK %xmm13 - -#define XMM_REGs /* Registers are saved in Sha256Update/Finel */ - /*"xmm4","xmm5","xmm6","xmm7","xmm8","xmm9","xmm10","xmm11","xmm12","xmm13" */ - -static int Transform_AVX1(Sha256* sha256) -{ - - word32 W_K[64] ; /* temp for W+K */ - - #if defined(DEBUG_XMM) - int i, j ; - word32 xmm[29][4*15] ; - #endif - - Init_Masks(BYTE_FLIP_MASK, SHUF_00BA, SHUF_DC00) ; - W_K_from_buff ; /* X0, X1, X2, X3 = W[0..15] ; */ - - DigestToReg(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; - - SET_W_K_XFER(X0, 0) ; - MessageSched(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,0) ; - SET_W_K_XFER(X1, 4) ; - MessageSched(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,4) ; - SET_W_K_XFER(X2, 8) ; - MessageSched(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,8) ; - SET_W_K_XFER(X3, 12) ; - MessageSched(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,12) ; - SET_W_K_XFER(X0, 16) ; - MessageSched(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,16) ; - SET_W_K_XFER(X1, 20) ; - MessageSched(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,20) ; - SET_W_K_XFER(X2, 24) ; - MessageSched(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,24) ; - SET_W_K_XFER(X3, 28) ; - MessageSched(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,28) ; - SET_W_K_XFER(X0, 32) ; - MessageSched(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,32) ; - SET_W_K_XFER(X1, 36) ; - MessageSched(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,36) ; - SET_W_K_XFER(X2, 40) ; - MessageSched(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,40) ; - SET_W_K_XFER(X3, 44) ; - MessageSched(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, - SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,44) ; - - SET_W_K_XFER(X0, 48) ; - SET_W_K_XFER(X1, 52) ; - SET_W_K_XFER(X2, 56) ; - SET_W_K_XFER(X3, 60) ; - - RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,48) ; - RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,49) ; - RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,50) ; - RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,51) ; - - RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,52) ; - RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,53) ; - RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,54) ; - RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,55) ; - - RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,56) ; - RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,57) ; - RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,58) ; - RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,59) ; - - RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,60) ; - RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,61) ; - RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,62) ; - RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,63) ; - - RegToDigest(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; - - #if defined(DEBUG_XMM) - for(i=0; i<29; i++) { - for(j=0; j<4*14; j+=4) - printf("xmm%d[%d]=%08x,%08x,%08x,%08x\n", j/4, i, - xmm[i][j],xmm[i][j+1],xmm[i][j+2],xmm[i][j+3]) ; - printf("\n") ; - } - - for(i=0; i<64; i++)printf("W_K[%d]%08x\n", i, W_K[i]) ; - #endif - - return 0; -} - -#if defined(HAVE_INTEL_RORX) -static int Transform_AVX1_RORX(Sha256* sha256) -{ - - word32 W_K[64] ; /* temp for W+K */ - - #if defined(DEBUG_XMM) - int i, j ; - word32 xmm[29][4*15] ; - #endif - - Init_Masks(BYTE_FLIP_MASK, SHUF_00BA, SHUF_DC00) ; - W_K_from_buff ; /* X0, X1, X2, X3 = W[0..15] ; */ - - DigestToReg(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; - SET_W_K_XFER(X0, 0) ; - MessageSched_RORX(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,0) ; - SET_W_K_XFER(X1, 4) ; - MessageSched_RORX(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,4) ; - SET_W_K_XFER(X2, 8) ; - MessageSched_RORX(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,8) ; - SET_W_K_XFER(X3, 12) ; - MessageSched_RORX(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,12) ; - SET_W_K_XFER(X0, 16) ; - MessageSched_RORX(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,16) ; - SET_W_K_XFER(X1, 20) ; - MessageSched_RORX(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,20) ; - SET_W_K_XFER(X2, 24) ; - MessageSched_RORX(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,24) ; - SET_W_K_XFER(X3, 28) ; - MessageSched_RORX(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,28) ; - SET_W_K_XFER(X0, 32) ; - MessageSched_RORX(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,32) ; - SET_W_K_XFER(X1, 36) ; - MessageSched_RORX(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,36) ; - SET_W_K_XFER(X2, 40) ; - MessageSched_RORX(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,40) ; - SET_W_K_XFER(X3, 44) ; - MessageSched_RORX(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, - XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,44) ; - - SET_W_K_XFER(X0, 48) ; - SET_W_K_XFER(X1, 52) ; - SET_W_K_XFER(X2, 56) ; - SET_W_K_XFER(X3, 60) ; - - RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,48) ; - RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,49) ; - RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,50) ; - RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,51) ; - - RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,52) ; - RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,53) ; - RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,54) ; - RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,55) ; - - RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,56) ; - RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,57) ; - RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,58) ; - RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,59) ; - - RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,60) ; - RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,61) ; - RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,62) ; - RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,63) ; - - RegToDigest(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; - - #if defined(DEBUG_XMM) - for(i=0; i<29; i++) { - for(j=0; j<4*14; j+=4) - printf("xmm%d[%d]=%08x,%08x,%08x,%08x\n", j/4, i, - xmm[i][j],xmm[i][j+1],xmm[i][j+2],xmm[i][j+3]) ; - printf("\n") ; - } - - for(i=0; i<64; i++)printf("W_K[%d]%08x\n", i, W_K[i]) ; - #endif - - return 0; -} -#endif /* HAVE_INTEL_RORX */ - -#endif /* HAVE_INTEL_AVX1 */ - - -#if defined(HAVE_INTEL_AVX2) - -#define _MOVE_to_REG(ymm, mem) __asm__ volatile("vmovdqu %0, %%"#ymm" ":: "m"(mem):YMM_REGs) ; -#define _MOVE_to_MEM(mem, ymm) __asm__ volatile("vmovdqu %%"#ymm", %0" : "=m"(mem)::YMM_REGs) ; -#define _BYTE_SWAP(ymm, map) __asm__ volatile("vpshufb %0, %%"#ymm", %%"#ymm"\n\t"\ - :: "m"(map):YMM_REGs) ; -#define _MOVE_128(ymm0, ymm1, ymm2, map) __asm__ volatile("vperm2i128 $"#map", %%"\ - #ymm2", %%"#ymm1", %%"#ymm0" ":::YMM_REGs) ; -#define _MOVE_BYTE(ymm0, ymm1, map) __asm__ volatile("vpshufb %0, %%"#ymm1", %%"\ - #ymm0"\n\t":: "m"(map):YMM_REGs) ; -#define _S_TEMP(dest, src, bits, temp) __asm__ volatile("vpsrld $"#bits", %%"\ - #src", %%"#dest"\n\tvpslld $32-"#bits", %%"#src", %%"#temp"\n\tvpor %%"\ - #temp",%%"#dest", %%"#dest" ":::YMM_REGs) ; -#define _AVX2_R(dest, src, bits) __asm__ volatile("vpsrld $"#bits", %%"\ - #src", %%"#dest" ":::YMM_REGs) ; -#define _XOR(dest, src1, src2) __asm__ volatile("vpxor %%"#src1", %%"\ - #src2", %%"#dest" ":::YMM_REGs) ; -#define _OR(dest, src1, src2) __asm__ volatile("vpor %%"#src1", %%"\ - #src2", %%"#dest" ":::YMM_REGs) ; -#define _ADD(dest, src1, src2) __asm__ volatile("vpaddd %%"#src1", %%"\ - #src2", %%"#dest" ":::YMM_REGs) ; -#define _ADD_MEM(dest, src1, mem) __asm__ volatile("vpaddd %0, %%"#src1", %%"\ - #dest" "::"m"(mem):YMM_REGs) ; -#define _BLEND(map, dest, src1, src2) __asm__ volatile("vpblendd $"#map", %%"\ - #src1", %%"#src2", %%"#dest" ":::YMM_REGs) ; - -#define _EXTRACT_XMM_0(xmm, mem) __asm__ volatile("vpextrd $0, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; -#define _EXTRACT_XMM_1(xmm, mem) __asm__ volatile("vpextrd $1, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; -#define _EXTRACT_XMM_2(xmm, mem) __asm__ volatile("vpextrd $2, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; -#define _EXTRACT_XMM_3(xmm, mem) __asm__ volatile("vpextrd $3, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; -#define _EXTRACT_XMM_4(ymm, xmm, mem)\ - __asm__ volatile("vperm2i128 $0x1, %%"#ymm", %%"#ymm", %%"#ymm" ":::YMM_REGs) ;\ - __asm__ volatile("vpextrd $0, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; -#define _EXTRACT_XMM_5(xmm, mem) __asm__ volatile("vpextrd $1, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; -#define _EXTRACT_XMM_6(xmm, mem) __asm__ volatile("vpextrd $2, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; -#define _EXTRACT_XMM_7(xmm, mem) __asm__ volatile("vpextrd $3, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; - -#define _SWAP_YMM_HL(ymm) __asm__ volatile("vperm2i128 $0x1, %%"#ymm", %%"#ymm", %%"#ymm" ":::YMM_REGs) ; -#define SWAP_YMM_HL(ymm) _SWAP_YMM_HL(ymm) - -#define MOVE_to_REG(ymm, mem) _MOVE_to_REG(ymm, mem) -#define MOVE_to_MEM(mem, ymm) _MOVE_to_MEM(mem, ymm) -#define BYTE_SWAP(ymm, map) _BYTE_SWAP(ymm, map) -#define MOVE_128(ymm0, ymm1, ymm2, map) _MOVE_128(ymm0, ymm1, ymm2, map) -#define MOVE_BYTE(ymm0, ymm1, map) _MOVE_BYTE(ymm0, ymm1, map) -#define XOR(dest, src1, src2) _XOR(dest, src1, src2) -#define OR(dest, src1, src2) _OR(dest, src1, src2) -#define ADD(dest, src1, src2) _ADD(dest, src1, src2) -#define ADD_MEM(dest, src1, mem) _ADD_MEM(dest, src1, mem) -#define BLEND(map, dest, src1, src2) _BLEND(map, dest, src1, src2) - -#define S_TMP(dest, src, bits, temp) _S_TEMP(dest, src, bits, temp); -#define AVX2_S(dest, src, bits) S_TMP(dest, src, bits, S_TEMP) -#define AVX2_R(dest, src, bits) _AVX2_R(dest, src, bits) - -#define GAMMA0(dest, src) AVX2_S(dest, src, 7); AVX2_S(G_TEMP, src, 18); \ - XOR(dest, G_TEMP, dest) ; AVX2_R(G_TEMP, src, 3); XOR(dest, G_TEMP, dest) ; -#define GAMMA0_1(dest, src) AVX2_S(dest, src, 7); AVX2_S(G_TEMP, src, 18); -#define GAMMA0_2(dest, src) XOR(dest, G_TEMP, dest) ; AVX2_R(G_TEMP, src, 3); \ - XOR(dest, G_TEMP, dest) ; - -#define GAMMA1(dest, src) AVX2_S(dest, src, 17); AVX2_S(G_TEMP, src, 19); \ - XOR(dest, G_TEMP, dest) ; AVX2_R(G_TEMP, src, 10); XOR(dest, G_TEMP, dest) ; -#define GAMMA1_1(dest, src) AVX2_S(dest, src, 17); AVX2_S(G_TEMP, src, 19); -#define GAMMA1_2(dest, src) XOR(dest, G_TEMP, dest) ; AVX2_R(G_TEMP, src, 10); \ - XOR(dest, G_TEMP, dest) ; - -#define FEEDBACK1_to_W_I_2 MOVE_BYTE(YMM_TEMP0, W_I, mMAP1toW_I_2[0]) ; \ - BLEND(0x0c, W_I_2, YMM_TEMP0, W_I_2) ; -#define FEEDBACK2_to_W_I_2 MOVE_128(YMM_TEMP0, W_I, W_I, 0x08) ; \ - MOVE_BYTE(YMM_TEMP0, YMM_TEMP0, mMAP2toW_I_2[0]) ; BLEND(0x30, W_I_2, YMM_TEMP0, W_I_2) ; -#define FEEDBACK3_to_W_I_2 MOVE_BYTE(YMM_TEMP0, W_I, mMAP3toW_I_2[0]) ; \ - BLEND(0xc0, W_I_2, YMM_TEMP0, W_I_2) ; - -#define FEEDBACK_to_W_I_7 MOVE_128(YMM_TEMP0, W_I, W_I, 0x08) ;\ - MOVE_BYTE(YMM_TEMP0, YMM_TEMP0, mMAPtoW_I_7[0]) ; BLEND(0x80, W_I_7, YMM_TEMP0, W_I_7) ; - -#undef voitle - -#define W_I_16 ymm8 -#define W_I_15 ymm9 -#define W_I_7 ymm10 -#define W_I_2 ymm11 -#define W_I ymm12 -#define G_TEMP ymm13 -#define S_TEMP ymm14 -#define YMM_TEMP0 ymm15 -#define YMM_TEMP0x xmm15 -#define W_I_TEMP ymm7 -#define W_K_TEMP ymm15 -#define W_K_TEMPx xmm15 - -#define YMM_REGs /* Registers are saved in Sha256Update/Finel */ - /* "%ymm7","%ymm8","%ymm9","%ymm10","%ymm11","%ymm12","%ymm13","%ymm14","%ymm15"*/ - - -#define MOVE_15_to_16(w_i_16, w_i_15, w_i_7)\ - __asm__ volatile("vperm2i128 $0x01, %%"#w_i_15", %%"#w_i_15", %%"#w_i_15" ":::YMM_REGs) ;\ - __asm__ volatile("vpblendd $0x08, %%"#w_i_15", %%"#w_i_7", %%"#w_i_16" ":::YMM_REGs) ;\ - __asm__ volatile("vperm2i128 $0x01, %%"#w_i_7", %%"#w_i_7", %%"#w_i_15" ":::YMM_REGs) ;\ - __asm__ volatile("vpblendd $0x80, %%"#w_i_15", %%"#w_i_16", %%"#w_i_16" ":::YMM_REGs) ;\ - __asm__ volatile("vpshufd $0x93, %%"#w_i_16", %%"#w_i_16" ":::YMM_REGs) ;\ - -#define MOVE_7_to_15(w_i_15, w_i_7)\ - __asm__ volatile("vmovdqu %%"#w_i_7", %%"#w_i_15" ":::YMM_REGs) ;\ - -#define MOVE_I_to_7(w_i_7, w_i)\ - __asm__ volatile("vperm2i128 $0x01, %%"#w_i", %%"#w_i", %%"#w_i_7" ":::YMM_REGs) ;\ - __asm__ volatile("vpblendd $0x01, %%"#w_i_7", %%"#w_i", %%"#w_i_7" ":::YMM_REGs) ;\ - __asm__ volatile("vpshufd $0x39, %%"#w_i_7", %%"#w_i_7" ":::YMM_REGs) ;\ - -#define MOVE_I_to_2(w_i_2, w_i)\ - __asm__ volatile("vperm2i128 $0x01, %%"#w_i", %%"#w_i", %%"#w_i_2" ":::YMM_REGs) ;\ - __asm__ volatile("vpshufd $0x0e, %%"#w_i_2", %%"#w_i_2" ":::YMM_REGs) ;\ - -#define ROTATE_W(w_i_16, w_i_15, w_i_7, w_i_2, w_i)\ - MOVE_15_to_16(w_i_16, w_i_15, w_i_7) ; \ - MOVE_7_to_15(w_i_15, w_i_7) ; \ - MOVE_I_to_7(w_i_7, w_i) ; \ - MOVE_I_to_2(w_i_2, w_i) ;\ - -#define _RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ - { word32 d ;\ - __asm__ volatile("movl %"#S_0", %0":"=r"(d)::SSE_REGs) ;\ - sha256->digest[0] += d;\ - __asm__ volatile("movl %"#S_1", %0":"=r"(d)::SSE_REGs) ;\ - sha256->digest[1] += d;\ - __asm__ volatile("movl %"#S_2", %0":"=r"(d)::SSE_REGs) ;\ - sha256->digest[2] += d;\ - __asm__ volatile("movl %"#S_3", %0":"=r"(d)::SSE_REGs) ;\ - sha256->digest[3] += d;\ - __asm__ volatile("movl %"#S_4", %0":"=r"(d)::SSE_REGs) ;\ - sha256->digest[4] += d;\ - __asm__ volatile("movl %"#S_5", %0":"=r"(d)::SSE_REGs) ;\ - sha256->digest[5] += d;\ - __asm__ volatile("movl %"#S_6", %0":"=r"(d)::SSE_REGs) ;\ - sha256->digest[6] += d;\ - __asm__ volatile("movl %"#S_7", %0":"=r"(d)::SSE_REGs) ;\ - sha256->digest[7] += d;\ -} - -#define _DumpS(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ - { word32 d[8] ;\ - __asm__ volatile("movl %"#S_0", %0":"=r"(d[0])::SSE_REGs) ;\ - __asm__ volatile("movl %"#S_1", %0":"=r"(d[1])::SSE_REGs) ;\ - __asm__ volatile("movl %"#S_2", %0":"=r"(d[2])::SSE_REGs) ;\ - __asm__ volatile("movl %"#S_3", %0":"=r"(d[3])::SSE_REGs) ;\ - __asm__ volatile("movl %"#S_4", %0":"=r"(d[4])::SSE_REGs) ;\ - __asm__ volatile("movl %"#S_5", %0":"=r"(d[5])::SSE_REGs) ;\ - __asm__ volatile("movl %"#S_6", %0":"=r"(d[6])::SSE_REGs) ;\ - __asm__ volatile("movl %"#S_7", %0":"=r"(d[7])::SSE_REGs) ;\ - printf("S[0..7]=%08x,%08x,%08x,%08x,%08x,%08x,%08x,%08x\n", d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7]);\ - __asm__ volatile("movl %0, %"#S_0::"r"(d[0]):SSE_REGs) ;\ - __asm__ volatile("movl %0, %"#S_1::"r"(d[1]):SSE_REGs) ;\ - __asm__ volatile("movl %0, %"#S_2::"r"(d[2]):SSE_REGs) ;\ - __asm__ volatile("movl %0, %"#S_3::"r"(d[3]):SSE_REGs) ;\ - __asm__ volatile("movl %0, %"#S_4::"r"(d[4]):SSE_REGs) ;\ - __asm__ volatile("movl %0, %"#S_5::"r"(d[5]):SSE_REGs) ;\ - __asm__ volatile("movl %0, %"#S_6::"r"(d[6]):SSE_REGs) ;\ - __asm__ volatile("movl %0, %"#S_7::"r"(d[7]):SSE_REGs) ;\ -} - - -#define DigestToReg(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ - _DigestToReg(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 ) - -#define RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ - _RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 ) - -#define DumS(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ - _DumpS(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 ) - - - /* Byte swap Masks to ensure that rest of the words are filled with zero's. */ - static const unsigned long mBYTE_FLIP_MASK_16[] = - { 0x0405060700010203, 0x0c0d0e0f08090a0b, 0x0405060700010203, 0x0c0d0e0f08090a0b } ; - static const unsigned long mBYTE_FLIP_MASK_15[] = - { 0x0405060700010203, 0x0c0d0e0f08090a0b, 0x0405060700010203, 0x0c0d0e0f08090a0b } ; - static const unsigned long mBYTE_FLIP_MASK_7 [] = - { 0x0405060700010203, 0x0c0d0e0f08090a0b, 0x0405060700010203, 0x8080808008090a0b } ; - static const unsigned long mBYTE_FLIP_MASK_2 [] = - { 0x0405060700010203, 0x8080808080808080, 0x8080808080808080, 0x8080808080808080 } ; - - static const unsigned long mMAPtoW_I_7[] = - { 0x8080808080808080, 0x8080808080808080, 0x8080808080808080, 0x0302010080808080 } ; - static const unsigned long mMAP1toW_I_2[] = - { 0x8080808080808080, 0x0706050403020100, 0x8080808080808080, 0x8080808080808080 } ; - static const unsigned long mMAP2toW_I_2[] = - { 0x8080808080808080, 0x8080808080808080, 0x0f0e0d0c0b0a0908, 0x8080808080808080 } ; - static const unsigned long mMAP3toW_I_2[] = - { 0x8080808080808080, 0x8080808080808080, 0x8080808080808080, 0x0706050403020100 } ; - -static int Transform_AVX2(Sha256* sha256) -{ - - #ifdef WOLFSSL_SMALL_STACK - word32* W_K; - W_K = (word32*) XMALLOC(sizeof(word32) * 64, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (W_K == NULL) - return MEMORY_E; - #else - word32 W_K[64] ; - #endif - - MOVE_to_REG(W_I_16, sha256->buffer[0]); BYTE_SWAP(W_I_16, mBYTE_FLIP_MASK_16[0]) ; - MOVE_to_REG(W_I_15, sha256->buffer[1]); BYTE_SWAP(W_I_15, mBYTE_FLIP_MASK_15[0]) ; - MOVE_to_REG(W_I, sha256->buffer[8]) ; BYTE_SWAP(W_I, mBYTE_FLIP_MASK_16[0]) ; - MOVE_to_REG(W_I_7, sha256->buffer[16-7]) ; BYTE_SWAP(W_I_7, mBYTE_FLIP_MASK_7[0]) ; - MOVE_to_REG(W_I_2, sha256->buffer[16-2]) ; BYTE_SWAP(W_I_2, mBYTE_FLIP_MASK_2[0]) ; - - DigestToReg(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; - - ADD_MEM(W_K_TEMP, W_I_16, K[0]) ; - MOVE_to_MEM(W_K[0], W_K_TEMP) ; - - RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,0) ; - RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,1) ; - RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,2) ; - RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,3) ; - RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,4) ; - RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,5) ; - RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,6) ; - RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,7) ; - - ADD_MEM(YMM_TEMP0, W_I, K[8]) ; - MOVE_to_MEM(W_K[8], YMM_TEMP0) ; - - /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ - RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,8) ; - GAMMA0_1(W_I_TEMP, W_I_15) ; - RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,8) ; - GAMMA0_2(W_I_TEMP, W_I_15) ; - RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,8) ; - ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ - RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,9) ; - ADD(W_I, W_I_7, W_I_TEMP); - RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,9) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,9) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,10) ; - ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ - RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,10) ; - FEEDBACK1_to_W_I_2 ; - RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,10) ; - FEEDBACK_to_W_I_7 ; - RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,11) ; - ADD(W_I_TEMP, W_I_7, W_I_TEMP); - RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,11) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,11) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,12) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ - RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,12) ; - FEEDBACK2_to_W_I_2 ; - RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,12) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,13) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,13) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ - RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,13) ; - FEEDBACK3_to_W_I_2 ; - RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,14) ; - GAMMA1(YMM_TEMP0, W_I_2) ; - RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,14) ; - RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,14) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ - RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,15) ; - - MOVE_to_REG(YMM_TEMP0, K[16]) ; - RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,15) ; - ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; - RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,15) ; - ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; - MOVE_to_MEM(W_K[16], YMM_TEMP0) ; - - /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ - RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,16) ; - GAMMA0_1(W_I_TEMP, W_I_15) ; - RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,16) ; - GAMMA0_2(W_I_TEMP, W_I_15) ; - RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,16) ; - ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ - RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,17) ; - ADD(W_I, W_I_7, W_I_TEMP); - RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,17) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,17) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,18) ; - ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ - RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,18) ; - FEEDBACK1_to_W_I_2 ; - RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,18) ; - FEEDBACK_to_W_I_7 ; - RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,19) ; - ADD(W_I_TEMP, W_I_7, W_I_TEMP); - RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,19) ; - GAMMA1(YMM_TEMP0, W_I_2) ; - RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,19) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,20) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ - RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,20) ; - FEEDBACK2_to_W_I_2 ; - RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,20) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,21) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,21) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ - RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,21) ; - FEEDBACK3_to_W_I_2 ; - RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,22) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,22) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,22) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ - RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,23) ; - - MOVE_to_REG(YMM_TEMP0, K[24]) ; - RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,23) ; - ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; - RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,23) ; - ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; - MOVE_to_MEM(W_K[24], YMM_TEMP0) ; - - /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ - RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,24) ; - GAMMA0_1(W_I_TEMP, W_I_15) ; - RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,24) ; - GAMMA0_2(W_I_TEMP, W_I_15) ; - RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,24) ; - ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ - RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,25) ; - ADD(W_I, W_I_7, W_I_TEMP); - RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,25) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,25) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,26) ; - ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ - RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,26) ; - FEEDBACK1_to_W_I_2 ; - RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,26) ; - FEEDBACK_to_W_I_7 ; - RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,27) ; - ADD(W_I_TEMP, W_I_7, W_I_TEMP); - RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,27) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,27) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,28) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ - RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,28) ; - FEEDBACK2_to_W_I_2 ; - RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,28) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,29) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,29) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ - RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,29) ; - FEEDBACK3_to_W_I_2 ; - RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,30) ; - GAMMA1(YMM_TEMP0, W_I_2) ; - RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,30) ; - RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,30) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ - RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,31) ; - - MOVE_to_REG(YMM_TEMP0, K[32]) ; - RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,31) ; - ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; - RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,31) ; - ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; - MOVE_to_MEM(W_K[32], YMM_TEMP0) ; - - - /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ - RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,32) ; - GAMMA0_1(W_I_TEMP, W_I_15) ; - RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,32) ; - GAMMA0_2(W_I_TEMP, W_I_15) ; - RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,32) ; - ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ - RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,33) ; - ADD(W_I, W_I_7, W_I_TEMP); - RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,33) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,33) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,34) ; - ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ - RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,34) ; - FEEDBACK1_to_W_I_2 ; - RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,34) ; - FEEDBACK_to_W_I_7 ; - RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,35) ; - ADD(W_I_TEMP, W_I_7, W_I_TEMP); - RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,35) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,35) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,36) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ - RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,36) ; - FEEDBACK2_to_W_I_2 ; - RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,36) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,37) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,37) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ - RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,37) ; - FEEDBACK3_to_W_I_2 ; - RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,38) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,38) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,38) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ - RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,39) ; - - MOVE_to_REG(YMM_TEMP0, K[40]) ; - RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,39) ; - ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; - RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,39) ; - ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; - MOVE_to_MEM(W_K[40], YMM_TEMP0) ; - - /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ - RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,40) ; - GAMMA0_1(W_I_TEMP, W_I_15) ; - RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,40) ; - GAMMA0_2(W_I_TEMP, W_I_15) ; - RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,40) ; - ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ - RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,41) ; - ADD(W_I, W_I_7, W_I_TEMP); - RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,41) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,41) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,42) ; - ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ - RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,42) ; - FEEDBACK1_to_W_I_2 ; - RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,42) ; - FEEDBACK_to_W_I_7 ; - RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,43) ; - ADD(W_I_TEMP, W_I_7, W_I_TEMP); - RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,43) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,43) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,44) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ - RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,44) ; - FEEDBACK2_to_W_I_2 ; - RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,44) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,45) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,45) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ - RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,45) ; - FEEDBACK3_to_W_I_2 ; - RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,46) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,46) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,46) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ - RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,47) ; - - MOVE_to_REG(YMM_TEMP0, K[48]) ; - RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,47) ; - ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; - RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,47) ; - ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; - MOVE_to_MEM(W_K[48], YMM_TEMP0) ; - - /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ - RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,48) ; - GAMMA0_1(W_I_TEMP, W_I_15) ; - RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,48) ; - GAMMA0_2(W_I_TEMP, W_I_15) ; - RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,48) ; - ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ - RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,49) ; - ADD(W_I, W_I_7, W_I_TEMP); - RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,49) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,49) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,50) ; - ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ - RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,50) ; - FEEDBACK1_to_W_I_2 ; - RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,50) ; - FEEDBACK_to_W_I_7 ; - RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,51) ; - ADD(W_I_TEMP, W_I_7, W_I_TEMP); - RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,51) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,51) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,52) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ - RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,52) ; - FEEDBACK2_to_W_I_2 ; - RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,52) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,53) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,53) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ - RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,53) ; - FEEDBACK3_to_W_I_2 ; - RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,54) ; - GAMMA1_1(YMM_TEMP0, W_I_2) ; - RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,54) ; - GAMMA1_2(YMM_TEMP0, W_I_2) ; - RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,54) ; - ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ - RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,55) ; - - MOVE_to_REG(YMM_TEMP0, K[56]) ; - RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,55) ; - ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; - RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,55) ; - ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; - MOVE_to_MEM(W_K[56], YMM_TEMP0) ; - - RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,56) ; - RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,57) ; - RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,58) ; - RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,59) ; - - RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,60) ; - RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,61) ; - RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,62) ; - RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,63) ; - - RegToDigest(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; - - #ifdef WOLFSSL_SMALL_STACK - XFREE(W, NULL, DYNAMIC_TYPE_TMP_BUFFER); - #endif - - return 0; -} - -#endif /* HAVE_INTEL_AVX2 */ - -#endif /* WOLFSSL_TI_HAHS */ - -#endif /* HAVE_FIPS */ - -#endif /* NO_SHA256 */ - +/* sha256.c + * + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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. + * + * wolfSSL 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 + */ + +/* code submitted by raphael.huck@efixo.com */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include + +#if !defined(NO_SHA256) +#ifdef HAVE_FIPS + +int wc_InitSha256(Sha256* sha) +{ + return InitSha256_fips(sha); +} + + +int wc_Sha256Update(Sha256* sha, const byte* data, word32 len) +{ + return Sha256Update_fips(sha, data, len); +} + + +int wc_Sha256Final(Sha256* sha, byte* out) +{ + return Sha256Final_fips(sha, out); +} + + +int wc_Sha256Hash(const byte* data, word32 len, byte* out) +{ + return Sha256Hash(data, len, out); +} + +#else /* else build without fips */ + +#if !defined(NO_SHA256) && !defined(WOLFSSL_TI_HASH) + /* defined in port/ti/ti_sha256.c */ + +#if !defined (ALIGN32) + #if defined (__GNUC__) + #define ALIGN32 __attribute__ ( (aligned (32))) + #elif defined(_MSC_VER) + /* disable align warning, we want alignment ! */ + #pragma warning(disable: 4324) + #define ALIGN32 __declspec (align (32)) + #else + #define ALIGN32 + #endif +#endif + +#ifdef WOLFSSL_PIC32MZ_HASH +#define wc_InitSha256 wc_InitSha256_sw +#define wc_Sha256Update wc_Sha256Update_sw +#define wc_Sha256Final wc_Sha256Final_sw +#endif + +#ifdef HAVE_FIPS + /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ + #define FIPS_NO_WRAPPERS +#endif + +#if defined(USE_INTEL_SPEEDUP) +#define HAVE_INTEL_AVX1 +#define HAVE_INTEL_AVX2 + +#if defined(DEBUG_XMM) +#include "stdio.h" +#endif + +#endif + +#if defined(HAVE_INTEL_AVX2) +#define HAVE_INTEL_RORX +#endif + + +/***** +Intel AVX1/AVX2 Macro Control Structure + +#define HAVE_INTEL_AVX1 +#define HAVE_INTEL_AVX2 + +#define HAVE_INTEL_RORX + + +int InitSha256(Sha256* sha256) { + Save/Recover XMM, YMM + ... +} + +#if defined(HAVE_INTEL_AVX1)|| defined(HAVE_INTEL_AVX2) + Transform() ; Function prototype +#else + Transform() { } + int Sha256Final() { + Save/Recover XMM, YMM + ... + } +#endif + +#if defined(HAVE_INTEL_AVX1)|| defined(HAVE_INTEL_AVX2) + #if defined(HAVE_INTEL_RORX + #define RND with rorx instuction + #else + #define RND + #endif +#endif + +#if defined(HAVE_INTEL_AVX1) + + #define XMM Instructions/inline asm + + int Transform() { + Stitched Message Sched/Round + } + +#elif defined(HAVE_INTEL_AVX2) + + #define YMM Instructions/inline asm + + int Transform() { + More granural Stitched Message Sched/Round + } + +*/ + + +#if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) + +/* Each platform needs to query info type 1 from cpuid to see if aesni is + * supported. Also, let's setup a macro for proper linkage w/o ABI conflicts + */ + +#ifndef _MSC_VER + #define cpuid(reg, leaf, sub)\ + __asm__ __volatile__ ("cpuid":\ + "=a" (reg[0]), "=b" (reg[1]), "=c" (reg[2]), "=d" (reg[3]) :\ + "a" (leaf), "c"(sub)); + + #define XASM_LINK(f) asm(f) +#else + + #include + #define cpuid(a,b) __cpuid((int*)a,b) + + #define XASM_LINK(f) + +#endif /* _MSC_VER */ + +#define EAX 0 +#define EBX 1 +#define ECX 2 +#define EDX 3 + +#define CPUID_AVX1 0x1 +#define CPUID_AVX2 0x2 +#define CPUID_RDRAND 0x4 +#define CPUID_RDSEED 0x8 +#define CPUID_BMI2 0x10 /* MULX, RORX */ + +#define IS_INTEL_AVX1 (cpuid_flags&CPUID_AVX1) +#define IS_INTEL_AVX2 (cpuid_flags&CPUID_AVX2) +#define IS_INTEL_BMI2 (cpuid_flags&CPUID_BMI2) +#define IS_INTEL_RDRAND (cpuid_flags&CPUID_RDRAND) +#define IS_INTEL_RDSEED (cpuid_flags&CPUID_RDSEED) + +static word32 cpuid_check = 0 ; +static word32 cpuid_flags = 0 ; + +static word32 cpuid_flag(word32 leaf, word32 sub, word32 num, word32 bit) { + int got_intel_cpu=0; + unsigned int reg[5]; + + reg[4] = '\0' ; + cpuid(reg, 0, 0); + if(memcmp((char *)&(reg[EBX]), "Genu", 4) == 0 && + memcmp((char *)&(reg[EDX]), "ineI", 4) == 0 && + memcmp((char *)&(reg[ECX]), "ntel", 4) == 0) { + got_intel_cpu = 1; + } + if (got_intel_cpu) { + cpuid(reg, leaf, sub); + return((reg[num]>>bit)&0x1) ; + } + return 0 ; +} + +static int set_cpuid_flags(void) { + if(cpuid_check==0) { + if(cpuid_flag(1, 0, ECX, 28)){ cpuid_flags |= CPUID_AVX1 ;} + if(cpuid_flag(7, 0, EBX, 5)){ cpuid_flags |= CPUID_AVX2 ; } + if(cpuid_flag(7, 0, EBX, 8)) { cpuid_flags |= CPUID_BMI2 ; } + if(cpuid_flag(1, 0, ECX, 30)){ cpuid_flags |= CPUID_RDRAND ; } + if(cpuid_flag(7, 0, EBX, 18)){ cpuid_flags |= CPUID_RDSEED ; } + cpuid_check = 1 ; + return 0 ; + } + return 1 ; +} + + +/* #if defined(HAVE_INTEL_AVX1/2) at the tail of sha512 */ +static int Transform(Sha256* sha256); + +#if defined(HAVE_INTEL_AVX1) +static int Transform_AVX1(Sha256 *sha256) ; +#endif +#if defined(HAVE_INTEL_AVX2) +static int Transform_AVX2(Sha256 *sha256) ; +static int Transform_AVX1_RORX(Sha256 *sha256) ; +#endif + +static int (*Transform_p)(Sha256* sha256) /* = _Transform */; + +#define XTRANSFORM(sha256, B) (*Transform_p)(sha256) + +static void set_Transform(void) { + if(set_cpuid_flags())return ; + +#if defined(HAVE_INTEL_AVX2) + if(IS_INTEL_AVX2 && IS_INTEL_BMI2){ + Transform_p = Transform_AVX1_RORX; return ; + Transform_p = Transform_AVX2 ; + /* for avoiding warning,"not used" */ + } +#endif +#if defined(HAVE_INTEL_AVX1) + Transform_p = ((IS_INTEL_AVX1) ? Transform_AVX1 : Transform) ; return ; +#endif + Transform_p = Transform ; return ; +} + +#else + #if defined(FREESCALE_MMCAU) + #define XTRANSFORM(sha256, B) Transform(sha256, B) + #else + #define XTRANSFORM(sha256, B) Transform(sha256) + #endif +#endif + +/* Dummy for saving MM_REGs on behalf of Transform */ +#if defined(HAVE_INTEL_AVX2)&& !defined(HAVE_INTEL_AVX1) +#define SAVE_XMM_YMM __asm__ volatile("or %%r8d, %%r8d":::\ + "%ymm4","%ymm5","%ymm6","%ymm7","%ymm8","%ymm9","%ymm10","%ymm11","%ymm12","%ymm13","%ymm14","%ymm15") +#elif defined(HAVE_INTEL_AVX1) +#define SAVE_XMM_YMM __asm__ volatile("or %%r8d, %%r8d":::\ + "xmm0","xmm1","xmm2","xmm3","xmm4","xmm5","xmm6","xmm7","xmm8","xmm9","xmm10",\ + "xmm11","xmm12","xmm13","xmm14","xmm15") +#else +#define SAVE_XMM_YMM +#endif + +#ifdef WOLFSSL_PIC32MZ_HASH +#define InitSha256 InitSha256_sw +#define Sha256Update Sha256Update_sw +#define Sha256Final Sha256Final_sw +#endif + +#include +#include + +#ifdef NO_INLINE + #include +#else + #include +#endif + +#ifdef FREESCALE_MMCAU + #include "cau_api.h" +#endif + +#ifndef WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MIN + + static INLINE word32 min(word32 a, word32 b) + { + return a > b ? b : a; + } + +#endif /* WOLFSSL_HAVE_MIN */ + + +int wc_InitSha256(Sha256* sha256) +{ + #ifdef FREESCALE_MMCAU + cau_sha256_initialize_output(sha256->digest); + #else + sha256->digest[0] = 0x6A09E667L; + sha256->digest[1] = 0xBB67AE85L; + sha256->digest[2] = 0x3C6EF372L; + sha256->digest[3] = 0xA54FF53AL; + sha256->digest[4] = 0x510E527FL; + sha256->digest[5] = 0x9B05688CL; + sha256->digest[6] = 0x1F83D9ABL; + sha256->digest[7] = 0x5BE0CD19L; + #endif + + sha256->buffLen = 0; + sha256->loLen = 0; + sha256->hiLen = 0; + +#if defined(HAVE_INTEL_AVX1)|| defined(HAVE_INTEL_AVX2) + set_Transform() ; /* choose best Transform function under this runtime environment */ +#endif + + return 0; +} + + +#if !defined(FREESCALE_MMCAU) +static const ALIGN32 word32 K[64] = { + 0x428A2F98L, 0x71374491L, 0xB5C0FBCFL, 0xE9B5DBA5L, 0x3956C25BL, + 0x59F111F1L, 0x923F82A4L, 0xAB1C5ED5L, 0xD807AA98L, 0x12835B01L, + 0x243185BEL, 0x550C7DC3L, 0x72BE5D74L, 0x80DEB1FEL, 0x9BDC06A7L, + 0xC19BF174L, 0xE49B69C1L, 0xEFBE4786L, 0x0FC19DC6L, 0x240CA1CCL, + 0x2DE92C6FL, 0x4A7484AAL, 0x5CB0A9DCL, 0x76F988DAL, 0x983E5152L, + 0xA831C66DL, 0xB00327C8L, 0xBF597FC7L, 0xC6E00BF3L, 0xD5A79147L, + 0x06CA6351L, 0x14292967L, 0x27B70A85L, 0x2E1B2138L, 0x4D2C6DFCL, + 0x53380D13L, 0x650A7354L, 0x766A0ABBL, 0x81C2C92EL, 0x92722C85L, + 0xA2BFE8A1L, 0xA81A664BL, 0xC24B8B70L, 0xC76C51A3L, 0xD192E819L, + 0xD6990624L, 0xF40E3585L, 0x106AA070L, 0x19A4C116L, 0x1E376C08L, + 0x2748774CL, 0x34B0BCB5L, 0x391C0CB3L, 0x4ED8AA4AL, 0x5B9CCA4FL, + 0x682E6FF3L, 0x748F82EEL, 0x78A5636FL, 0x84C87814L, 0x8CC70208L, + 0x90BEFFFAL, 0xA4506CEBL, 0xBEF9A3F7L, 0xC67178F2L +}; + +#endif + +#if defined(FREESCALE_MMCAU) + +static int Transform(Sha256* sha256, byte* buf) +{ + cau_sha256_hash_n(buf, 1, sha256->digest); + + return 0; +} + +#endif /* FREESCALE_MMCAU */ + +#define Ch(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) +#define Maj(x,y,z) ((((x) | (y)) & (z)) | ((x) & (y))) +#define R(x, n) (((x)&0xFFFFFFFFU)>>(n)) + +#define S(x, n) rotrFixed(x, n) +#define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22)) +#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25)) +#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3)) +#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10)) + +#define RND(a,b,c,d,e,f,g,h,i) \ + t0 = (h) + Sigma1((e)) + Ch((e), (f), (g)) + K[(i)] + W[(i)]; \ + t1 = Sigma0((a)) + Maj((a), (b), (c)); \ + (d) += t0; \ + (h) = t0 + t1; + +#if !defined(FREESCALE_MMCAU) +static int Transform(Sha256* sha256) +{ + word32 S[8], t0, t1; + int i; + +#ifdef WOLFSSL_SMALL_STACK + word32* W; + + W = (word32*) XMALLOC(sizeof(word32) * 64, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (W == NULL) + return MEMORY_E; +#else + word32 W[64]; +#endif + + /* Copy context->state[] to working vars */ + for (i = 0; i < 8; i++) + S[i] = sha256->digest[i]; + + for (i = 0; i < 16; i++) + W[i] = sha256->buffer[i]; + + for (i = 16; i < 64; i++) + W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15]) + W[i-16]; + + for (i = 0; i < 64; i += 8) { + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],i+0); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],i+1); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],i+2); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],i+3); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],i+4); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],i+5); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],i+6); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],i+7); + } + + /* Add the working vars back into digest state[] */ + for (i = 0; i < 8; i++) { + sha256->digest[i] += S[i]; + } + +#ifdef WOLFSSL_SMALL_STACK + XFREE(W, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return 0; +} + +#endif /* #if !defined(FREESCALE_MMCAU) */ + +static INLINE void AddLength(Sha256* sha256, word32 len) +{ + word32 tmp = sha256->loLen; + if ( (sha256->loLen += len) < tmp) + sha256->hiLen++; /* carry low to high */ +} + +int wc_Sha256Update(Sha256* sha256, const byte* data, word32 len) +{ + + /* do block size increments */ + byte* local = (byte*)sha256->buffer; + + SAVE_XMM_YMM ; /* for Intel AVX */ + + while (len) { + word32 add = min(len, SHA256_BLOCK_SIZE - sha256->buffLen); + XMEMCPY(&local[sha256->buffLen], data, add); + + sha256->buffLen += add; + data += add; + len -= add; + + if (sha256->buffLen == SHA256_BLOCK_SIZE) { + int ret; + + #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) + #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) + if(!IS_INTEL_AVX1 && !IS_INTEL_AVX2) + #endif + ByteReverseWords(sha256->buffer, sha256->buffer, + SHA256_BLOCK_SIZE); + #endif + ret = XTRANSFORM(sha256, local); + if (ret != 0) + return ret; + + AddLength(sha256, SHA256_BLOCK_SIZE); + sha256->buffLen = 0; + } + } + + return 0; +} + +int wc_Sha256Final(Sha256* sha256, byte* hash) +{ + byte* local = (byte*)sha256->buffer; + int ret; + + SAVE_XMM_YMM ; /* for Intel AVX */ + + AddLength(sha256, sha256->buffLen); /* before adding pads */ + + local[sha256->buffLen++] = 0x80; /* add 1 */ + + /* pad with zeros */ + if (sha256->buffLen > SHA256_PAD_SIZE) { + XMEMSET(&local[sha256->buffLen], 0, SHA256_BLOCK_SIZE - sha256->buffLen); + sha256->buffLen += SHA256_BLOCK_SIZE - sha256->buffLen; + + #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) + #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) + if(!IS_INTEL_AVX1 && !IS_INTEL_AVX2) + #endif + ByteReverseWords(sha256->buffer, sha256->buffer, SHA256_BLOCK_SIZE); + #endif + + ret = XTRANSFORM(sha256, local); + if (ret != 0) + return ret; + + sha256->buffLen = 0; + } + XMEMSET(&local[sha256->buffLen], 0, SHA256_PAD_SIZE - sha256->buffLen); + + /* put lengths in bits */ + sha256->hiLen = (sha256->loLen >> (8*sizeof(sha256->loLen) - 3)) + + (sha256->hiLen << 3); + sha256->loLen = sha256->loLen << 3; + + /* store lengths */ + #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU) + #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) + if(!IS_INTEL_AVX1 && !IS_INTEL_AVX2) + #endif + ByteReverseWords(sha256->buffer, sha256->buffer, SHA256_BLOCK_SIZE); + #endif + /* ! length ordering dependent on digest endian type ! */ + XMEMCPY(&local[SHA256_PAD_SIZE], &sha256->hiLen, sizeof(word32)); + XMEMCPY(&local[SHA256_PAD_SIZE + sizeof(word32)], &sha256->loLen, + sizeof(word32)); + + #if defined(FREESCALE_MMCAU) || defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) + /* Kinetis requires only these bytes reversed */ + #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) + if(IS_INTEL_AVX1 || IS_INTEL_AVX2) + #endif + ByteReverseWords(&sha256->buffer[SHA256_PAD_SIZE/sizeof(word32)], + &sha256->buffer[SHA256_PAD_SIZE/sizeof(word32)], + 2 * sizeof(word32)); + #endif + + ret = XTRANSFORM(sha256, local); + if (ret != 0) + return ret; + + #if defined(LITTLE_ENDIAN_ORDER) + ByteReverseWords(sha256->digest, sha256->digest, SHA256_DIGEST_SIZE); + #endif + XMEMCPY(hash, sha256->digest, SHA256_DIGEST_SIZE); + + return wc_InitSha256(sha256); /* reset state */ +} + + + +int wc_Sha256Hash(const byte* data, word32 len, byte* hash) +{ + int ret = 0; +#ifdef WOLFSSL_SMALL_STACK + Sha256* sha256; +#else + Sha256 sha256[1]; +#endif + +#ifdef WOLFSSL_SMALL_STACK + sha256 = (Sha256*)XMALLOC(sizeof(Sha256), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (sha256 == NULL) + return MEMORY_E; +#endif + + if ((ret = wc_InitSha256(sha256)) != 0) { + WOLFSSL_MSG("InitSha256 failed"); + } + else if ((ret = wc_Sha256Update(sha256, data, len)) != 0) { + WOLFSSL_MSG("Sha256Update failed"); + } + else if ((ret = wc_Sha256Final(sha256, hash)) != 0) { + WOLFSSL_MSG("Sha256Final failed"); + } + +#ifdef WOLFSSL_SMALL_STACK + XFREE(sha256, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return ret; +} + +#ifdef WOLFSSL_TI_HASH +#include "wolfssl/wolfcrypt/port/ti/ti-hash.h" +#endif +int wc_Sha256GetHash(Sha256* sha256, byte* hash) +{ +#if defined(WOLFSS_TI_HASH) + return wc_Sha256GetHash_TI(sha256, hash) ; +#else + int ret ; + Sha256 save = *sha256 ; + ret = wc_Sha256Final(sha256, hash) ; + *sha256 = save ; + return ret ; +#endif +} + +#if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) + +#define _DigestToReg(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ + { word32 d ;\ + d = sha256->digest[0]; __asm__ volatile("movl %0, %"#S_0::"r"(d):SSE_REGs) ;\ + d = sha256->digest[1]; __asm__ volatile("movl %0, %"#S_1::"r"(d):SSE_REGs) ;\ + d = sha256->digest[2]; __asm__ volatile("movl %0, %"#S_2::"r"(d):SSE_REGs) ;\ + d = sha256->digest[3]; __asm__ volatile("movl %0, %"#S_3::"r"(d):SSE_REGs) ;\ + d = sha256->digest[4]; __asm__ volatile("movl %0, %"#S_4::"r"(d):SSE_REGs) ;\ + d = sha256->digest[5]; __asm__ volatile("movl %0, %"#S_5::"r"(d):SSE_REGs) ;\ + d = sha256->digest[6]; __asm__ volatile("movl %0, %"#S_6::"r"(d):SSE_REGs) ;\ + d = sha256->digest[7]; __asm__ volatile("movl %0, %"#S_7::"r"(d):SSE_REGs) ;\ +} + +#define _RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ + { word32 d ; \ + __asm__ volatile("movl %"#S_0", %0":"=r"(d)::SSE_REGs) ; sha256->digest[0] += d;\ + __asm__ volatile("movl %"#S_1", %0":"=r"(d)::SSE_REGs) ; sha256->digest[1] += d;\ + __asm__ volatile("movl %"#S_2", %0":"=r"(d)::SSE_REGs) ; sha256->digest[2] += d;\ + __asm__ volatile("movl %"#S_3", %0":"=r"(d)::SSE_REGs) ; sha256->digest[3] += d;\ + __asm__ volatile("movl %"#S_4", %0":"=r"(d)::SSE_REGs) ; sha256->digest[4] += d;\ + __asm__ volatile("movl %"#S_5", %0":"=r"(d)::SSE_REGs) ; sha256->digest[5] += d;\ + __asm__ volatile("movl %"#S_6", %0":"=r"(d)::SSE_REGs) ; sha256->digest[6] += d;\ + __asm__ volatile("movl %"#S_7", %0":"=r"(d)::SSE_REGs) ; sha256->digest[7] += d;\ +} + + +#define DigestToReg(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ + _DigestToReg(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 ) + +#define RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ + _RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 ) + + + + +#define S_0 %r15d +#define S_1 %r10d +#define S_2 %r11d +#define S_3 %r12d +#define S_4 %r13d +#define S_5 %r14d +#define S_6 %ebx +#define S_7 %r9d + +#define SSE_REGs "%edi", "%ecx", "%esi", "%edx", "%ebx","%r8","%r9","%r10","%r11","%r12","%r13","%r14","%r15" + +#if defined(HAVE_INTEL_RORX) +#define RND_STEP_RORX_1(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("rorx $6, %"#e", %%edx\n\t":::"%edx",SSE_REGs); /* edx = e>>6 */\ + +#define RND_STEP_RORX_2(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("rorx $11, %"#e",%%edi\n\t":::"%edi",SSE_REGs); /* edi = e>>11 */\ +__asm__ volatile("xorl %%edx, %%edi\n\t":::"%edx","%edi",SSE_REGs); /* edi = (e>>11) ^ (e>>6) */\ +__asm__ volatile("rorx $25, %"#e", %%edx\n\t":::"%edx",SSE_REGs); /* edx = e>>25 */\ + +#define RND_STEP_RORX_3(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("movl %"#f", %%esi\n\t":::"%esi",SSE_REGs); /* esi = f */\ +__asm__ volatile("xorl %"#g", %%esi\n\t":::"%esi",SSE_REGs); /* esi = f ^ g */\ +__asm__ volatile("xorl %%edi, %%edx\n\t":::"%edi","%edx",SSE_REGs); /* edx = Sigma1(e) */\ +__asm__ volatile("andl %"#e", %%esi\n\t":::"%esi",SSE_REGs); /* esi = (f ^ g) & e */\ +__asm__ volatile("xorl %"#g", %%esi\n\t":::"%esi",SSE_REGs); /* esi = Ch(e,f,g) */\ + +#define RND_STEP_RORX_4(a,b,c,d,e,f,g,h,i)\ +/*__asm__ volatile("movl %0, %%edx\n\t"::"m"(w_k):"%edx");*/\ +__asm__ volatile("addl %0, %"#h"\n\t"::"r"(W_K[i]):SSE_REGs); /* h += w_k */\ +__asm__ volatile("addl %%edx, %"#h"\n\t":::"%edx",SSE_REGs); /* h = h + w_k + Sigma1(e) */\ +__asm__ volatile("rorx $2, %"#a", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = a>>2 */\ +__asm__ volatile("rorx $13, %"#a", %%edi\n\t":::"%edi",SSE_REGs);/* edi = a>>13 */\ + +#define RND_STEP_RORX_5(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("rorx $22, %"#a", %%edx\n\t":::"%edx",SSE_REGs); /* edx = a>>22 */\ +__asm__ volatile("xorl %%r8d, %%edi\n\t":::"%edi","%r8",SSE_REGs);/* edi = (a>>2) ^ (a>>13) */\ +__asm__ volatile("xorl %%edi, %%edx\n\t":::"%edi","%edx",SSE_REGs); /* edx = Sigma0(a) */\ + +#define RND_STEP_RORX_6(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("movl %"#b", %%edi\n\t":::"%edi",SSE_REGs); /* edi = b */\ +__asm__ volatile("orl %"#a", %%edi\n\t":::"%edi",SSE_REGs); /* edi = a | b */\ +__asm__ volatile("andl %"#c", %%edi\n\t":::"%edi",SSE_REGs); /* edi = (a | b) & c*/\ +__asm__ volatile("movl %"#b", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = b */\ + +#define RND_STEP_RORX_7(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("addl %%esi, %"#h"\n\t":::"%esi",SSE_REGs); /* h += Ch(e,f,g) */\ +__asm__ volatile("andl %"#a", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = b & a */\ +__asm__ volatile("orl %%edi, %%r8d\n\t":::"%edi","%r8",SSE_REGs); /* r8d = Maj(a,b,c) */\ + +#define RND_STEP_RORX_8(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("addl "#h", "#d"\n\t"); /* d += h + w_k + Sigma1(e) + Ch(e,f,g) */\ +__asm__ volatile("addl %"#h", %%r8d\n\t":::"%r8",SSE_REGs); \ +__asm__ volatile("addl %%edx, %%r8d\n\t":::"%edx","%r8",SSE_REGs); \ +__asm__ volatile("movl %r8d, "#h"\n\t"); + +#endif + +#define RND_STEP_1(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("movl %"#e", %%edx\n\t":::"%edx",SSE_REGs);\ +__asm__ volatile("roll $26, %%edx\n\t":::"%edx",SSE_REGs); /* edx = e>>6 */\ +__asm__ volatile("movl %"#e", %%edi\n\t":::"%edi",SSE_REGs);\ + +#define RND_STEP_2(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("roll $21, %%edi\n\t":::"%edi",SSE_REGs); /* edi = e>>11 */\ +__asm__ volatile("xorl %%edx, %%edi\n\t":::"%edx","%edi",SSE_REGs); /* edi = (e>>11) ^ (e>>6) */\ +__asm__ volatile("movl %"#e", %%edx\n\t":::"%edx",SSE_REGs); /* edx = e */\ +__asm__ volatile("roll $7, %%edx\n\t":::"%edx",SSE_REGs); /* edx = e>>25 */\ + +#define RND_STEP_3(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("movl %"#f", %%esi\n\t":::"%esi",SSE_REGs); /* esi = f */\ +__asm__ volatile("xorl %"#g", %%esi\n\t":::"%esi",SSE_REGs); /* esi = f ^ g */\ +__asm__ volatile("xorl %%edi, %%edx\n\t":::"%edi","%edx",SSE_REGs); /* edx = Sigma1(e) */\ +__asm__ volatile("andl %"#e", %%esi\n\t":::"%esi",SSE_REGs); /* esi = (f ^ g) & e */\ +__asm__ volatile("xorl %"#g", %%esi\n\t":::"%esi",SSE_REGs); /* esi = Ch(e,f,g) */\ + +#define RND_STEP_4(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("addl %0, %"#h"\n\t"::"r"(W_K[i]):SSE_REGs); /* h += w_k */\ +__asm__ volatile("addl %%edx, %"#h"\n\t":::"%edx",SSE_REGs); /* h = h + w_k + Sigma1(e) */\ +__asm__ volatile("movl %"#a", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = a */\ +__asm__ volatile("roll $30, %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = a>>2 */\ +__asm__ volatile("movl %"#a", %%edi\n\t":::"%edi",SSE_REGs); /* edi = a */\ +__asm__ volatile("roll $19, %%edi\n\t":::"%edi",SSE_REGs); /* edi = a>>13 */\ +__asm__ volatile("movl %"#a", %%edx\n\t":::"%edx",SSE_REGs); /* edx = a */\ + +#define RND_STEP_5(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("roll $10, %%edx\n\t":::"%edx",SSE_REGs); /* edx = a>>22 */\ +__asm__ volatile("xorl %%r8d, %%edi\n\t":::"%edi","%r8",SSE_REGs); /* edi = (a>>2) ^ (a>>13) */\ +__asm__ volatile("xorl %%edi, %%edx\n\t":::"%edi","%edx",SSE_REGs);/* edx = Sigma0(a) */\ + +#define RND_STEP_6(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("movl %"#b", %%edi\n\t":::"%edi",SSE_REGs); /* edi = b */\ +__asm__ volatile("orl %"#a", %%edi\n\t":::"%edi",SSE_REGs); /* edi = a | b */\ +__asm__ volatile("andl %"#c", %%edi\n\t":::"%edi",SSE_REGs); /* edi = (a | b) & c */\ +__asm__ volatile("movl %"#b", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = b */\ + +#define RND_STEP_7(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("addl %%esi, %"#h"\n\t":::"%esi",SSE_REGs); /* h += Ch(e,f,g) */\ +__asm__ volatile("andl %"#a", %%r8d\n\t":::"%r8",SSE_REGs); /* r8d = b & a */\ +__asm__ volatile("orl %%edi, %%r8d\n\t":::"%edi","%r8",SSE_REGs); /* r8d = Maj(a,b,c) */\ + +#define RND_STEP_8(a,b,c,d,e,f,g,h,i)\ +__asm__ volatile("addl "#h", "#d"\n\t"); /* d += h + w_k + Sigma1(e) + Ch(e,f,g) */\ +__asm__ volatile("addl %"#h", %%r8d\n\t":::"%r8",SSE_REGs); \ + /* r8b = h + w_k + Sigma1(e) + Ch(e,f,g) + Maj(a,b,c) */\ +__asm__ volatile("addl %%edx, %%r8d\n\t":::"%edx","%r8",SSE_REGs);\ + /* r8b = h + w_k + Sigma1(e) Sigma0(a) + Ch(e,f,g) + Maj(a,b,c) */\ +__asm__ volatile("movl %%r8d, %"#h"\n\t":::"%r8", SSE_REGs); \ + /* h = h + w_k + Sigma1(e) + Sigma0(a) + Ch(e,f,g) + Maj(a,b,c) */ \ + +#define RND_X(a,b,c,d,e,f,g,h,i) \ + RND_STEP_1(a,b,c,d,e,f,g,h,i); \ + RND_STEP_2(a,b,c,d,e,f,g,h,i); \ + RND_STEP_3(a,b,c,d,e,f,g,h,i); \ + RND_STEP_4(a,b,c,d,e,f,g,h,i); \ + RND_STEP_5(a,b,c,d,e,f,g,h,i); \ + RND_STEP_6(a,b,c,d,e,f,g,h,i); \ + RND_STEP_7(a,b,c,d,e,f,g,h,i); \ + RND_STEP_8(a,b,c,d,e,f,g,h,i); + +#define RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i); +#define RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_7,S_0,S_1,S_2,S_3,S_4,S_5,S_6,_i); +#define RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_6,S_7,S_0,S_1,S_2,S_3,S_4,S_5,_i); +#define RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_5,S_6,S_7,S_0,S_1,S_2,S_3,S_4,_i); +#define RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,_i); +#define RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_3,S_4,S_5,S_6,S_7,S_0,S_1,S_2,_i); +#define RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_2,S_3,S_4,S_5,S_6,S_7,S_0,S_1,_i); +#define RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_0,_i); + + +#define RND_1_3(a,b,c,d,e,f,g,h,i) {\ + RND_STEP_1(a,b,c,d,e,f,g,h,i); \ + RND_STEP_2(a,b,c,d,e,f,g,h,i); \ + RND_STEP_3(a,b,c,d,e,f,g,h,i); \ +} + +#define RND_4_6(a,b,c,d,e,f,g,h,i) {\ + RND_STEP_4(a,b,c,d,e,f,g,h,i); \ + RND_STEP_5(a,b,c,d,e,f,g,h,i); \ + RND_STEP_6(a,b,c,d,e,f,g,h,i); \ +} + +#define RND_7_8(a,b,c,d,e,f,g,h,i) {\ + RND_STEP_7(a,b,c,d,e,f,g,h,i); \ + RND_STEP_8(a,b,c,d,e,f,g,h,i); \ +} + +#define RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i); +#define RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_7,S_0,S_1,S_2,S_3,S_4,S_5,S_6,_i); +#define RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_6,S_7,S_0,S_1,S_2,S_3,S_4,S_5,_i); +#define RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_5,S_6,S_7,S_0,S_1,S_2,S_3,S_4,_i); +#define RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,_i); +#define RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_3,S_4,S_5,S_6,S_7,S_0,S_1,S_2,_i); +#define RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_2,S_3,S_4,S_5,S_6,S_7,S_0,S_1,_i); +#define RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_X(S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_0,_i); + + +#define RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i); +#define RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_7,S_0,S_1,S_2,S_3,S_4,S_5,S_6,_i); +#define RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_6,S_7,S_0,S_1,S_2,S_3,S_4,S_5,_i); +#define RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_5,S_6,S_7,S_0,S_1,S_2,S_3,S_4,_i); +#define RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,_i); +#define RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_3,S_4,S_5,S_6,S_7,S_0,S_1,S_2,_i); +#define RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_2,S_3,S_4,S_5,S_6,S_7,S_0,S_1,_i); +#define RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_1_3(S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_0,_i); + +#define RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i); +#define RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_7,S_0,S_1,S_2,S_3,S_4,S_5,S_6,_i); +#define RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_6,S_7,S_0,S_1,S_2,S_3,S_4,S_5,_i); +#define RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_5,S_6,S_7,S_0,S_1,S_2,S_3,S_4,_i); +#define RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,_i); +#define RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_3,S_4,S_5,S_6,S_7,S_0,S_1,S_2,_i); +#define RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_2,S_3,S_4,S_5,S_6,S_7,S_0,S_1,_i); +#define RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_4_6(S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_0,_i); + +#define RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i); +#define RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_7,S_0,S_1,S_2,S_3,S_4,S_5,S_6,_i); +#define RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_6,S_7,S_0,S_1,S_2,S_3,S_4,S_5,_i); +#define RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_5,S_6,S_7,S_0,S_1,S_2,S_3,S_4,_i); +#define RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,_i); +#define RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_3,S_4,S_5,S_6,S_7,S_0,S_1,S_2,_i); +#define RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_2,S_3,S_4,S_5,S_6,S_7,S_0,S_1,_i); +#define RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,_i) RND_7_8(S_1,S_2,S_3,S_4,S_5,S_6,S_7,S_0,_i); + +#define FOR(cnt, init, max, inc, loop) \ + __asm__ volatile("movl $"#init", %0\n\t"#loop":"::"m"(cnt):) +#define END(cnt, init, max, inc, loop) \ + __asm__ volatile("addl $"#inc", %0\n\tcmpl $"#max", %0\n\tjle "#loop"\n\t":"=m"(cnt)::) ; + +#endif /* defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) */ + +#if defined(HAVE_INTEL_AVX1) /* inline Assember for Intel AVX1 instructions */ + +#define VPALIGNR(op1,op2,op3,op4) __asm__ volatile("vpalignr $"#op4", %"#op3", %"#op2", %"#op1:::XMM_REGs) +#define VPADDD(op1,op2,op3) __asm__ volatile("vpaddd %"#op3", %"#op2", %"#op1:::XMM_REGs) +#define VPSRLD(op1,op2,op3) __asm__ volatile("vpsrld $"#op3", %"#op2", %"#op1:::XMM_REGs) +#define VPSRLQ(op1,op2,op3) __asm__ volatile("vpsrlq $"#op3", %"#op2", %"#op1:::XMM_REGs) +#define VPSLLD(op1,op2,op3) __asm__ volatile("vpslld $"#op3", %"#op2", %"#op1:::XMM_REGs) +#define VPOR(op1,op2,op3) __asm__ volatile("vpor %"#op3", %"#op2", %"#op1:::XMM_REGs) +#define VPXOR(op1,op2,op3) __asm__ volatile("vpxor %"#op3", %"#op2", %"#op1:::XMM_REGs) +#define VPSHUFD(op1,op2,op3) __asm__ volatile("vpshufd $"#op3", %"#op2", %"#op1:::XMM_REGs) +#define VPSHUFB(op1,op2,op3) __asm__ volatile("vpshufb %"#op3", %"#op2", %"#op1:::XMM_REGs) + +#define MessageSched(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, SHUF_00BA, SHUF_DC00,\ + a,b,c,d,e,f,g,h,_i)\ + RND_STEP_1(a,b,c,d,e,f,g,h,_i);\ + VPALIGNR (XTMP0, X3, X2, 4) ;\ + RND_STEP_2(a,b,c,d,e,f,g,h,_i);\ + VPADDD (XTMP0, XTMP0, X0) ;\ + RND_STEP_3(a,b,c,d,e,f,g,h,_i);\ + VPALIGNR (XTMP1, X1, X0, 4) ; /* XTMP1 = W[-15] */\ + RND_STEP_4(a,b,c,d,e,f,g,h,_i);\ + VPSRLD (XTMP2, XTMP1, 7) ;\ + RND_STEP_5(a,b,c,d,e,f,g,h,_i);\ + VPSLLD (XTMP3, XTMP1, 25) ; /* VPSLLD (XTMP3, XTMP1, (32-7)) */\ + RND_STEP_6(a,b,c,d,e,f,g,h,_i);\ + VPOR (XTMP3, XTMP3, XTMP2) ; /* XTMP1 = W[-15] MY_ROR 7 */\ + RND_STEP_7(a,b,c,d,e,f,g,h,_i);\ + VPSRLD (XTMP2, XTMP1,18) ;\ + RND_STEP_8(a,b,c,d,e,f,g,h,_i);\ +\ + RND_STEP_1(h,a,b,c,d,e,f,g,_i+1);\ + VPSRLD (XTMP4, XTMP1, 3) ; /* XTMP4 = W[-15] >> 3 */\ + RND_STEP_2(h,a,b,c,d,e,f,g,_i+1);\ + VPSLLD (XTMP1, XTMP1, 14) ; /* VPSLLD (XTMP1, XTMP1, (32-18)) */\ + RND_STEP_3(h,a,b,c,d,e,f,g,_i+1);\ + VPXOR (XTMP3, XTMP3, XTMP1) ;\ + RND_STEP_4(h,a,b,c,d,e,f,g,_i+1);\ + VPXOR (XTMP3, XTMP3, XTMP2) ; /* XTMP1 = W[-15] MY_ROR 7 ^ W[-15] MY_ROR 18 */\ + RND_STEP_5(h,a,b,c,d,e,f,g,_i+1);\ + VPXOR (XTMP1, XTMP3, XTMP4) ; /* XTMP1 = s0 */\ + RND_STEP_6(h,a,b,c,d,e,f,g,_i+1);\ + VPSHUFD(XTMP2, X3, 0b11111010) ; /* XTMP2 = W[-2] {BBAA}*/\ + RND_STEP_7(h,a,b,c,d,e,f,g,_i+1);\ + VPADDD (XTMP0, XTMP0, XTMP1) ; /* XTMP0 = W[-16] + W[-7] + s0 */\ + RND_STEP_8(h,a,b,c,d,e,f,g,_i+1);\ +\ + RND_STEP_1(g,h,a,b,c,d,e,f,_i+2);\ + VPSRLD (XTMP4, XTMP2, 10) ; /* XTMP4 = W[-2] >> 10 {BBAA} */\ + RND_STEP_2(g,h,a,b,c,d,e,f,_i+2);\ + VPSRLQ (XTMP3, XTMP2, 19) ; /* XTMP3 = W[-2] MY_ROR 19 {xBxA} */\ + RND_STEP_3(g,h,a,b,c,d,e,f,_i+2);\ + VPSRLQ (XTMP2, XTMP2, 17) ; /* XTMP2 = W[-2] MY_ROR 17 {xBxA} */\ + RND_STEP_4(g,h,a,b,c,d,e,f,_i+2);\ + VPXOR (XTMP2, XTMP2, XTMP3) ;\ + RND_STEP_5(g,h,a,b,c,d,e,f,_i+2);\ + VPXOR (XTMP4, XTMP4, XTMP2) ; /* XTMP4 = s1 {xBxA} */\ + RND_STEP_6(g,h,a,b,c,d,e,f,_i+2);\ + VPSHUFB (XTMP4, XTMP4, SHUF_00BA) ; /* XTMP4 = s1 {00BA} */\ + RND_STEP_7(g,h,a,b,c,d,e,f,_i+2);\ + VPADDD (XTMP0, XTMP0, XTMP4) ; /* XTMP0 = {..., ..., W[1], W[0]} */\ + RND_STEP_8(g,h,a,b,c,d,e,f,_i+2);\ +\ + RND_STEP_1(f,g,h,a,b,c,d,e,_i+3);\ + VPSHUFD (XTMP2, XTMP0, 0b01010000) ; /* XTMP2 = W[-2] {DDCC} */\ + RND_STEP_2(f,g,h,a,b,c,d,e,_i+3);\ + VPSRLD (XTMP5, XTMP2, 10); /* XTMP5 = W[-2] >> 10 {DDCC} */\ + RND_STEP_3(f,g,h,a,b,c,d,e,_i+3);\ + VPSRLQ (XTMP3, XTMP2, 19); /* XTMP3 = W[-2] MY_ROR 19 {xDxC} */\ + RND_STEP_4(f,g,h,a,b,c,d,e,_i+3);\ + VPSRLQ (XTMP2, XTMP2, 17) ; /* XTMP2 = W[-2] MY_ROR 17 {xDxC} */\ + RND_STEP_5(f,g,h,a,b,c,d,e,_i+3);\ + VPXOR (XTMP2, XTMP2, XTMP3) ;\ + RND_STEP_6(f,g,h,a,b,c,d,e,_i+3);\ + VPXOR (XTMP5, XTMP5, XTMP2) ; /* XTMP5 = s1 {xDxC} */\ + RND_STEP_7(f,g,h,a,b,c,d,e,_i+3);\ + VPSHUFB (XTMP5, XTMP5, SHUF_DC00) ; /* XTMP5 = s1 {DC00} */\ + RND_STEP_8(f,g,h,a,b,c,d,e,_i+3);\ + VPADDD (X0, XTMP5, XTMP0) ; /* X0 = {W[3], W[2], W[1], W[0]} */\ + +#if defined(HAVE_INTEL_RORX) + +#define MessageSched_RORX(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, \ + XFER, SHUF_00BA, SHUF_DC00,a,b,c,d,e,f,g,h,_i)\ + RND_STEP_RORX_1(a,b,c,d,e,f,g,h,_i);\ + VPALIGNR (XTMP0, X3, X2, 4) ;\ + RND_STEP_RORX_2(a,b,c,d,e,f,g,h,_i);\ + VPADDD (XTMP0, XTMP0, X0) ;\ + RND_STEP_RORX_3(a,b,c,d,e,f,g,h,_i);\ + VPALIGNR (XTMP1, X1, X0, 4) ; /* XTMP1 = W[-15] */\ + RND_STEP_RORX_4(a,b,c,d,e,f,g,h,_i);\ + VPSRLD (XTMP2, XTMP1, 7) ;\ + RND_STEP_RORX_5(a,b,c,d,e,f,g,h,_i);\ + VPSLLD (XTMP3, XTMP1, 25) ; /* VPSLLD (XTMP3, XTMP1, (32-7)) */\ + RND_STEP_RORX_6(a,b,c,d,e,f,g,h,_i);\ + VPOR (XTMP3, XTMP3, XTMP2) ; /* XTMP1 = W[-15] MY_ROR 7 */\ + RND_STEP_RORX_7(a,b,c,d,e,f,g,h,_i);\ + VPSRLD (XTMP2, XTMP1,18) ;\ + RND_STEP_RORX_8(a,b,c,d,e,f,g,h,_i);\ +\ + RND_STEP_RORX_1(h,a,b,c,d,e,f,g,_i+1);\ + VPSRLD (XTMP4, XTMP1, 3) ; /* XTMP4 = W[-15] >> 3 */\ + RND_STEP_RORX_2(h,a,b,c,d,e,f,g,_i+1);\ + VPSLLD (XTMP1, XTMP1, 14) ; /* VPSLLD (XTMP1, XTMP1, (32-18)) */\ + RND_STEP_RORX_3(h,a,b,c,d,e,f,g,_i+1);\ + VPXOR (XTMP3, XTMP3, XTMP1) ;\ + RND_STEP_RORX_4(h,a,b,c,d,e,f,g,_i+1);\ + VPXOR (XTMP3, XTMP3, XTMP2) ; /* XTMP1 = W[-15] MY_ROR 7 ^ W[-15] MY_ROR 18 */\ + RND_STEP_RORX_5(h,a,b,c,d,e,f,g,_i+1);\ + VPXOR (XTMP1, XTMP3, XTMP4) ; /* XTMP1 = s0 */\ + RND_STEP_RORX_6(h,a,b,c,d,e,f,g,_i+1);\ + VPSHUFD(XTMP2, X3, 0b11111010) ; /* XTMP2 = W[-2] {BBAA}*/\ + RND_STEP_RORX_7(h,a,b,c,d,e,f,g,_i+1);\ + VPADDD (XTMP0, XTMP0, XTMP1) ; /* XTMP0 = W[-16] + W[-7] + s0 */\ + RND_STEP_RORX_8(h,a,b,c,d,e,f,g,_i+1);\ +\ + RND_STEP_RORX_1(g,h,a,b,c,d,e,f,_i+2);\ + VPSRLD (XTMP4, XTMP2, 10) ; /* XTMP4 = W[-2] >> 10 {BBAA} */\ + RND_STEP_RORX_2(g,h,a,b,c,d,e,f,_i+2);\ + VPSRLQ (XTMP3, XTMP2, 19) ; /* XTMP3 = W[-2] MY_ROR 19 {xBxA} */\ + RND_STEP_RORX_3(g,h,a,b,c,d,e,f,_i+2);\ + VPSRLQ (XTMP2, XTMP2, 17) ; /* XTMP2 = W[-2] MY_ROR 17 {xBxA} */\ + RND_STEP_RORX_4(g,h,a,b,c,d,e,f,_i+2);\ + VPXOR (XTMP2, XTMP2, XTMP3) ;\ + RND_STEP_RORX_5(g,h,a,b,c,d,e,f,_i+2);\ + VPXOR (XTMP4, XTMP4, XTMP2) ; /* XTMP4 = s1 {xBxA} */\ + RND_STEP_RORX_6(g,h,a,b,c,d,e,f,_i+2);\ + VPSHUFB (XTMP4, XTMP4, SHUF_00BA) ; /* XTMP4 = s1 {00BA} */\ + RND_STEP_RORX_7(g,h,a,b,c,d,e,f,_i+2);\ + VPADDD (XTMP0, XTMP0, XTMP4) ; /* XTMP0 = {..., ..., W[1], W[0]} */\ + RND_STEP_RORX_8(g,h,a,b,c,d,e,f,_i+2);\ +\ + RND_STEP_RORX_1(f,g,h,a,b,c,d,e,_i+3);\ + VPSHUFD (XTMP2, XTMP0, 0b01010000) ; /* XTMP2 = W[-2] {DDCC} */\ + RND_STEP_RORX_2(f,g,h,a,b,c,d,e,_i+3);\ + VPSRLD (XTMP5, XTMP2, 10); /* XTMP5 = W[-2] >> 10 {DDCC} */\ + RND_STEP_RORX_3(f,g,h,a,b,c,d,e,_i+3);\ + VPSRLQ (XTMP3, XTMP2, 19); /* XTMP3 = W[-2] MY_ROR 19 {xDxC} */\ + RND_STEP_RORX_4(f,g,h,a,b,c,d,e,_i+3);\ + VPSRLQ (XTMP2, XTMP2, 17) ; /* XTMP2 = W[-2] MY_ROR 17 {xDxC} */\ + RND_STEP_RORX_5(f,g,h,a,b,c,d,e,_i+3);\ + VPXOR (XTMP2, XTMP2, XTMP3) ;\ + RND_STEP_RORX_6(f,g,h,a,b,c,d,e,_i+3);\ + VPXOR (XTMP5, XTMP5, XTMP2) ; /* XTMP5 = s1 {xDxC} */\ + RND_STEP_RORX_7(f,g,h,a,b,c,d,e,_i+3);\ + VPSHUFB (XTMP5, XTMP5, SHUF_DC00) ; /* XTMP5 = s1 {DC00} */\ + RND_STEP_RORX_8(f,g,h,a,b,c,d,e,_i+3);\ + VPADDD (X0, XTMP5, XTMP0) ; /* X0 = {W[3], W[2], W[1], W[0]} */\ + +#endif + + +#define W_K_from_buff\ + __asm__ volatile("vmovdqu %0, %%xmm4\n\t"\ + "vpshufb %%xmm13, %%xmm4, %%xmm4\n\t"\ + :: "m"(sha256->buffer[0]):"%xmm4") ;\ + __asm__ volatile("vmovdqu %0, %%xmm5\n\t"\ + "vpshufb %%xmm13, %%xmm5, %%xmm5\n\t"\ + ::"m"(sha256->buffer[4]):"%xmm5") ;\ + __asm__ volatile("vmovdqu %0, %%xmm6\n\t"\ + "vpshufb %%xmm13, %%xmm6, %%xmm6\n\t"\ + ::"m"(sha256->buffer[8]):"%xmm6") ;\ + __asm__ volatile("vmovdqu %0, %%xmm7\n\t"\ + "vpshufb %%xmm13, %%xmm7, %%xmm7\n\t"\ + ::"m"(sha256->buffer[12]):"%xmm7") ;\ + +#define _SET_W_K_XFER(reg, i)\ + __asm__ volatile("vpaddd %0, %"#reg", %%xmm9"::"m"(K[i]):XMM_REGs) ;\ + __asm__ volatile("vmovdqa %%xmm9, %0":"=m"(W_K[i])::XMM_REGs) ; + +#define SET_W_K_XFER(reg, i) _SET_W_K_XFER(reg, i) + +static const ALIGN32 word64 mSHUF_00BA[] = { 0x0b0a090803020100, 0xFFFFFFFFFFFFFFFF } ; /* shuffle xBxA -> 00BA */ +static const ALIGN32 word64 mSHUF_DC00[] = { 0xFFFFFFFFFFFFFFFF, 0x0b0a090803020100 } ; /* shuffle xDxC -> DC00 */ +static const ALIGN32 word64 mBYTE_FLIP_MASK[] = { 0x0405060700010203, 0x0c0d0e0f08090a0b } ; + + +#define _Init_Masks(mask1, mask2, mask3)\ +__asm__ volatile("vmovdqu %0, %"#mask1 ::"m"(mBYTE_FLIP_MASK[0])) ;\ +__asm__ volatile("vmovdqu %0, %"#mask2 ::"m"(mSHUF_00BA[0])) ;\ +__asm__ volatile("vmovdqu %0, %"#mask3 ::"m"(mSHUF_DC00[0])) ; + +#define Init_Masks(BYTE_FLIP_MASK, SHUF_00BA, SHUF_DC00)\ + _Init_Masks(BYTE_FLIP_MASK, SHUF_00BA, SHUF_DC00) + +#define X0 %xmm4 +#define X1 %xmm5 +#define X2 %xmm6 +#define X3 %xmm7 +#define X_ X0 + +#define XTMP0 %xmm0 +#define XTMP1 %xmm1 +#define XTMP2 %xmm2 +#define XTMP3 %xmm3 +#define XTMP4 %xmm8 +#define XTMP5 %xmm9 +#define XFER %xmm10 + +#define SHUF_00BA %xmm11 /* shuffle xBxA -> 00BA */ +#define SHUF_DC00 %xmm12 /* shuffle xDxC -> DC00 */ +#define BYTE_FLIP_MASK %xmm13 + +#define XMM_REGs /* Registers are saved in Sha256Update/Finel */ + /*"xmm4","xmm5","xmm6","xmm7","xmm8","xmm9","xmm10","xmm11","xmm12","xmm13" */ + +static int Transform_AVX1(Sha256* sha256) +{ + + word32 W_K[64] ; /* temp for W+K */ + + #if defined(DEBUG_XMM) + int i, j ; + word32 xmm[29][4*15] ; + #endif + + Init_Masks(BYTE_FLIP_MASK, SHUF_00BA, SHUF_DC00) ; + W_K_from_buff ; /* X0, X1, X2, X3 = W[0..15] ; */ + + DigestToReg(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; + + SET_W_K_XFER(X0, 0) ; + MessageSched(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,0) ; + SET_W_K_XFER(X1, 4) ; + MessageSched(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,4) ; + SET_W_K_XFER(X2, 8) ; + MessageSched(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,8) ; + SET_W_K_XFER(X3, 12) ; + MessageSched(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,12) ; + SET_W_K_XFER(X0, 16) ; + MessageSched(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,16) ; + SET_W_K_XFER(X1, 20) ; + MessageSched(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,20) ; + SET_W_K_XFER(X2, 24) ; + MessageSched(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,24) ; + SET_W_K_XFER(X3, 28) ; + MessageSched(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,28) ; + SET_W_K_XFER(X0, 32) ; + MessageSched(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,32) ; + SET_W_K_XFER(X1, 36) ; + MessageSched(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,36) ; + SET_W_K_XFER(X2, 40) ; + MessageSched(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,40) ; + SET_W_K_XFER(X3, 44) ; + MessageSched(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, XFER, + SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,44) ; + + SET_W_K_XFER(X0, 48) ; + SET_W_K_XFER(X1, 52) ; + SET_W_K_XFER(X2, 56) ; + SET_W_K_XFER(X3, 60) ; + + RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,48) ; + RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,49) ; + RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,50) ; + RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,51) ; + + RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,52) ; + RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,53) ; + RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,54) ; + RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,55) ; + + RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,56) ; + RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,57) ; + RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,58) ; + RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,59) ; + + RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,60) ; + RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,61) ; + RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,62) ; + RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,63) ; + + RegToDigest(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; + + #if defined(DEBUG_XMM) + for(i=0; i<29; i++) { + for(j=0; j<4*14; j+=4) + printf("xmm%d[%d]=%08x,%08x,%08x,%08x\n", j/4, i, + xmm[i][j],xmm[i][j+1],xmm[i][j+2],xmm[i][j+3]) ; + printf("\n") ; + } + + for(i=0; i<64; i++)printf("W_K[%d]%08x\n", i, W_K[i]) ; + #endif + + return 0; +} + +#if defined(HAVE_INTEL_RORX) +static int Transform_AVX1_RORX(Sha256* sha256) +{ + + word32 W_K[64] ; /* temp for W+K */ + + #if defined(DEBUG_XMM) + int i, j ; + word32 xmm[29][4*15] ; + #endif + + Init_Masks(BYTE_FLIP_MASK, SHUF_00BA, SHUF_DC00) ; + W_K_from_buff ; /* X0, X1, X2, X3 = W[0..15] ; */ + + DigestToReg(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; + SET_W_K_XFER(X0, 0) ; + MessageSched_RORX(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,0) ; + SET_W_K_XFER(X1, 4) ; + MessageSched_RORX(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,4) ; + SET_W_K_XFER(X2, 8) ; + MessageSched_RORX(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,8) ; + SET_W_K_XFER(X3, 12) ; + MessageSched_RORX(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,12) ; + SET_W_K_XFER(X0, 16) ; + MessageSched_RORX(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,16) ; + SET_W_K_XFER(X1, 20) ; + MessageSched_RORX(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,20) ; + SET_W_K_XFER(X2, 24) ; + MessageSched_RORX(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,24) ; + SET_W_K_XFER(X3, 28) ; + MessageSched_RORX(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,28) ; + SET_W_K_XFER(X0, 32) ; + MessageSched_RORX(X0, X1, X2, X3, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,32) ; + SET_W_K_XFER(X1, 36) ; + MessageSched_RORX(X1, X2, X3, X0, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,36) ; + SET_W_K_XFER(X2, 40) ; + MessageSched_RORX(X2, X3, X0, X1, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,40) ; + SET_W_K_XFER(X3, 44) ; + MessageSched_RORX(X3, X0, X1, X2, XTMP0, XTMP1, XTMP2, XTMP3, XTMP4, XTMP5, + XFER, SHUF_00BA, SHUF_DC00, S_4,S_5,S_6,S_7,S_0,S_1,S_2,S_3,44) ; + + SET_W_K_XFER(X0, 48) ; + SET_W_K_XFER(X1, 52) ; + SET_W_K_XFER(X2, 56) ; + SET_W_K_XFER(X3, 60) ; + + RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,48) ; + RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,49) ; + RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,50) ; + RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,51) ; + + RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,52) ; + RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,53) ; + RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,54) ; + RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,55) ; + + RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,56) ; + RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,57) ; + RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,58) ; + RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,59) ; + + RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,60) ; + RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,61) ; + RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,62) ; + RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,63) ; + + RegToDigest(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; + + #if defined(DEBUG_XMM) + for(i=0; i<29; i++) { + for(j=0; j<4*14; j+=4) + printf("xmm%d[%d]=%08x,%08x,%08x,%08x\n", j/4, i, + xmm[i][j],xmm[i][j+1],xmm[i][j+2],xmm[i][j+3]) ; + printf("\n") ; + } + + for(i=0; i<64; i++)printf("W_K[%d]%08x\n", i, W_K[i]) ; + #endif + + return 0; +} +#endif /* HAVE_INTEL_RORX */ + +#endif /* HAVE_INTEL_AVX1 */ + + +#if defined(HAVE_INTEL_AVX2) + +#define _MOVE_to_REG(ymm, mem) __asm__ volatile("vmovdqu %0, %%"#ymm" ":: "m"(mem):YMM_REGs) ; +#define _MOVE_to_MEM(mem, ymm) __asm__ volatile("vmovdqu %%"#ymm", %0" : "=m"(mem)::YMM_REGs) ; +#define _BYTE_SWAP(ymm, map) __asm__ volatile("vpshufb %0, %%"#ymm", %%"#ymm"\n\t"\ + :: "m"(map):YMM_REGs) ; +#define _MOVE_128(ymm0, ymm1, ymm2, map) __asm__ volatile("vperm2i128 $"#map", %%"\ + #ymm2", %%"#ymm1", %%"#ymm0" ":::YMM_REGs) ; +#define _MOVE_BYTE(ymm0, ymm1, map) __asm__ volatile("vpshufb %0, %%"#ymm1", %%"\ + #ymm0"\n\t":: "m"(map):YMM_REGs) ; +#define _S_TEMP(dest, src, bits, temp) __asm__ volatile("vpsrld $"#bits", %%"\ + #src", %%"#dest"\n\tvpslld $32-"#bits", %%"#src", %%"#temp"\n\tvpor %%"\ + #temp",%%"#dest", %%"#dest" ":::YMM_REGs) ; +#define _AVX2_R(dest, src, bits) __asm__ volatile("vpsrld $"#bits", %%"\ + #src", %%"#dest" ":::YMM_REGs) ; +#define _XOR(dest, src1, src2) __asm__ volatile("vpxor %%"#src1", %%"\ + #src2", %%"#dest" ":::YMM_REGs) ; +#define _OR(dest, src1, src2) __asm__ volatile("vpor %%"#src1", %%"\ + #src2", %%"#dest" ":::YMM_REGs) ; +#define _ADD(dest, src1, src2) __asm__ volatile("vpaddd %%"#src1", %%"\ + #src2", %%"#dest" ":::YMM_REGs) ; +#define _ADD_MEM(dest, src1, mem) __asm__ volatile("vpaddd %0, %%"#src1", %%"\ + #dest" "::"m"(mem):YMM_REGs) ; +#define _BLEND(map, dest, src1, src2) __asm__ volatile("vpblendd $"#map", %%"\ + #src1", %%"#src2", %%"#dest" ":::YMM_REGs) ; + +#define _EXTRACT_XMM_0(xmm, mem) __asm__ volatile("vpextrd $0, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; +#define _EXTRACT_XMM_1(xmm, mem) __asm__ volatile("vpextrd $1, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; +#define _EXTRACT_XMM_2(xmm, mem) __asm__ volatile("vpextrd $2, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; +#define _EXTRACT_XMM_3(xmm, mem) __asm__ volatile("vpextrd $3, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; +#define _EXTRACT_XMM_4(ymm, xmm, mem)\ + __asm__ volatile("vperm2i128 $0x1, %%"#ymm", %%"#ymm", %%"#ymm" ":::YMM_REGs) ;\ + __asm__ volatile("vpextrd $0, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; +#define _EXTRACT_XMM_5(xmm, mem) __asm__ volatile("vpextrd $1, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; +#define _EXTRACT_XMM_6(xmm, mem) __asm__ volatile("vpextrd $2, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; +#define _EXTRACT_XMM_7(xmm, mem) __asm__ volatile("vpextrd $3, %%"#xmm", %0 ":"=r"(mem)::YMM_REGs) ; + +#define _SWAP_YMM_HL(ymm) __asm__ volatile("vperm2i128 $0x1, %%"#ymm", %%"#ymm", %%"#ymm" ":::YMM_REGs) ; +#define SWAP_YMM_HL(ymm) _SWAP_YMM_HL(ymm) + +#define MOVE_to_REG(ymm, mem) _MOVE_to_REG(ymm, mem) +#define MOVE_to_MEM(mem, ymm) _MOVE_to_MEM(mem, ymm) +#define BYTE_SWAP(ymm, map) _BYTE_SWAP(ymm, map) +#define MOVE_128(ymm0, ymm1, ymm2, map) _MOVE_128(ymm0, ymm1, ymm2, map) +#define MOVE_BYTE(ymm0, ymm1, map) _MOVE_BYTE(ymm0, ymm1, map) +#define XOR(dest, src1, src2) _XOR(dest, src1, src2) +#define OR(dest, src1, src2) _OR(dest, src1, src2) +#define ADD(dest, src1, src2) _ADD(dest, src1, src2) +#define ADD_MEM(dest, src1, mem) _ADD_MEM(dest, src1, mem) +#define BLEND(map, dest, src1, src2) _BLEND(map, dest, src1, src2) + +#define S_TMP(dest, src, bits, temp) _S_TEMP(dest, src, bits, temp); +#define AVX2_S(dest, src, bits) S_TMP(dest, src, bits, S_TEMP) +#define AVX2_R(dest, src, bits) _AVX2_R(dest, src, bits) + +#define GAMMA0(dest, src) AVX2_S(dest, src, 7); AVX2_S(G_TEMP, src, 18); \ + XOR(dest, G_TEMP, dest) ; AVX2_R(G_TEMP, src, 3); XOR(dest, G_TEMP, dest) ; +#define GAMMA0_1(dest, src) AVX2_S(dest, src, 7); AVX2_S(G_TEMP, src, 18); +#define GAMMA0_2(dest, src) XOR(dest, G_TEMP, dest) ; AVX2_R(G_TEMP, src, 3); \ + XOR(dest, G_TEMP, dest) ; + +#define GAMMA1(dest, src) AVX2_S(dest, src, 17); AVX2_S(G_TEMP, src, 19); \ + XOR(dest, G_TEMP, dest) ; AVX2_R(G_TEMP, src, 10); XOR(dest, G_TEMP, dest) ; +#define GAMMA1_1(dest, src) AVX2_S(dest, src, 17); AVX2_S(G_TEMP, src, 19); +#define GAMMA1_2(dest, src) XOR(dest, G_TEMP, dest) ; AVX2_R(G_TEMP, src, 10); \ + XOR(dest, G_TEMP, dest) ; + +#define FEEDBACK1_to_W_I_2 MOVE_BYTE(YMM_TEMP0, W_I, mMAP1toW_I_2[0]) ; \ + BLEND(0x0c, W_I_2, YMM_TEMP0, W_I_2) ; +#define FEEDBACK2_to_W_I_2 MOVE_128(YMM_TEMP0, W_I, W_I, 0x08) ; \ + MOVE_BYTE(YMM_TEMP0, YMM_TEMP0, mMAP2toW_I_2[0]) ; BLEND(0x30, W_I_2, YMM_TEMP0, W_I_2) ; +#define FEEDBACK3_to_W_I_2 MOVE_BYTE(YMM_TEMP0, W_I, mMAP3toW_I_2[0]) ; \ + BLEND(0xc0, W_I_2, YMM_TEMP0, W_I_2) ; + +#define FEEDBACK_to_W_I_7 MOVE_128(YMM_TEMP0, W_I, W_I, 0x08) ;\ + MOVE_BYTE(YMM_TEMP0, YMM_TEMP0, mMAPtoW_I_7[0]) ; BLEND(0x80, W_I_7, YMM_TEMP0, W_I_7) ; + +#undef voitle + +#define W_I_16 ymm8 +#define W_I_15 ymm9 +#define W_I_7 ymm10 +#define W_I_2 ymm11 +#define W_I ymm12 +#define G_TEMP ymm13 +#define S_TEMP ymm14 +#define YMM_TEMP0 ymm15 +#define YMM_TEMP0x xmm15 +#define W_I_TEMP ymm7 +#define W_K_TEMP ymm15 +#define W_K_TEMPx xmm15 + +#define YMM_REGs /* Registers are saved in Sha256Update/Finel */ + /* "%ymm7","%ymm8","%ymm9","%ymm10","%ymm11","%ymm12","%ymm13","%ymm14","%ymm15"*/ + + +#define MOVE_15_to_16(w_i_16, w_i_15, w_i_7)\ + __asm__ volatile("vperm2i128 $0x01, %%"#w_i_15", %%"#w_i_15", %%"#w_i_15" ":::YMM_REGs) ;\ + __asm__ volatile("vpblendd $0x08, %%"#w_i_15", %%"#w_i_7", %%"#w_i_16" ":::YMM_REGs) ;\ + __asm__ volatile("vperm2i128 $0x01, %%"#w_i_7", %%"#w_i_7", %%"#w_i_15" ":::YMM_REGs) ;\ + __asm__ volatile("vpblendd $0x80, %%"#w_i_15", %%"#w_i_16", %%"#w_i_16" ":::YMM_REGs) ;\ + __asm__ volatile("vpshufd $0x93, %%"#w_i_16", %%"#w_i_16" ":::YMM_REGs) ;\ + +#define MOVE_7_to_15(w_i_15, w_i_7)\ + __asm__ volatile("vmovdqu %%"#w_i_7", %%"#w_i_15" ":::YMM_REGs) ;\ + +#define MOVE_I_to_7(w_i_7, w_i)\ + __asm__ volatile("vperm2i128 $0x01, %%"#w_i", %%"#w_i", %%"#w_i_7" ":::YMM_REGs) ;\ + __asm__ volatile("vpblendd $0x01, %%"#w_i_7", %%"#w_i", %%"#w_i_7" ":::YMM_REGs) ;\ + __asm__ volatile("vpshufd $0x39, %%"#w_i_7", %%"#w_i_7" ":::YMM_REGs) ;\ + +#define MOVE_I_to_2(w_i_2, w_i)\ + __asm__ volatile("vperm2i128 $0x01, %%"#w_i", %%"#w_i", %%"#w_i_2" ":::YMM_REGs) ;\ + __asm__ volatile("vpshufd $0x0e, %%"#w_i_2", %%"#w_i_2" ":::YMM_REGs) ;\ + +#define ROTATE_W(w_i_16, w_i_15, w_i_7, w_i_2, w_i)\ + MOVE_15_to_16(w_i_16, w_i_15, w_i_7) ; \ + MOVE_7_to_15(w_i_15, w_i_7) ; \ + MOVE_I_to_7(w_i_7, w_i) ; \ + MOVE_I_to_2(w_i_2, w_i) ;\ + +#define _RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ + { word32 d ;\ + __asm__ volatile("movl %"#S_0", %0":"=r"(d)::SSE_REGs) ;\ + sha256->digest[0] += d;\ + __asm__ volatile("movl %"#S_1", %0":"=r"(d)::SSE_REGs) ;\ + sha256->digest[1] += d;\ + __asm__ volatile("movl %"#S_2", %0":"=r"(d)::SSE_REGs) ;\ + sha256->digest[2] += d;\ + __asm__ volatile("movl %"#S_3", %0":"=r"(d)::SSE_REGs) ;\ + sha256->digest[3] += d;\ + __asm__ volatile("movl %"#S_4", %0":"=r"(d)::SSE_REGs) ;\ + sha256->digest[4] += d;\ + __asm__ volatile("movl %"#S_5", %0":"=r"(d)::SSE_REGs) ;\ + sha256->digest[5] += d;\ + __asm__ volatile("movl %"#S_6", %0":"=r"(d)::SSE_REGs) ;\ + sha256->digest[6] += d;\ + __asm__ volatile("movl %"#S_7", %0":"=r"(d)::SSE_REGs) ;\ + sha256->digest[7] += d;\ +} + +#define _DumpS(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ + { word32 d[8] ;\ + __asm__ volatile("movl %"#S_0", %0":"=r"(d[0])::SSE_REGs) ;\ + __asm__ volatile("movl %"#S_1", %0":"=r"(d[1])::SSE_REGs) ;\ + __asm__ volatile("movl %"#S_2", %0":"=r"(d[2])::SSE_REGs) ;\ + __asm__ volatile("movl %"#S_3", %0":"=r"(d[3])::SSE_REGs) ;\ + __asm__ volatile("movl %"#S_4", %0":"=r"(d[4])::SSE_REGs) ;\ + __asm__ volatile("movl %"#S_5", %0":"=r"(d[5])::SSE_REGs) ;\ + __asm__ volatile("movl %"#S_6", %0":"=r"(d[6])::SSE_REGs) ;\ + __asm__ volatile("movl %"#S_7", %0":"=r"(d[7])::SSE_REGs) ;\ + printf("S[0..7]=%08x,%08x,%08x,%08x,%08x,%08x,%08x,%08x\n", d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7]);\ + __asm__ volatile("movl %0, %"#S_0::"r"(d[0]):SSE_REGs) ;\ + __asm__ volatile("movl %0, %"#S_1::"r"(d[1]):SSE_REGs) ;\ + __asm__ volatile("movl %0, %"#S_2::"r"(d[2]):SSE_REGs) ;\ + __asm__ volatile("movl %0, %"#S_3::"r"(d[3]):SSE_REGs) ;\ + __asm__ volatile("movl %0, %"#S_4::"r"(d[4]):SSE_REGs) ;\ + __asm__ volatile("movl %0, %"#S_5::"r"(d[5]):SSE_REGs) ;\ + __asm__ volatile("movl %0, %"#S_6::"r"(d[6]):SSE_REGs) ;\ + __asm__ volatile("movl %0, %"#S_7::"r"(d[7]):SSE_REGs) ;\ +} + + +#define DigestToReg(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ + _DigestToReg(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 ) + +#define RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ + _RegToDigest(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 ) + +#define DumS(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ + _DumpS(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 ) + + + /* Byte swap Masks to ensure that rest of the words are filled with zero's. */ + static const unsigned long mBYTE_FLIP_MASK_16[] = + { 0x0405060700010203, 0x0c0d0e0f08090a0b, 0x0405060700010203, 0x0c0d0e0f08090a0b } ; + static const unsigned long mBYTE_FLIP_MASK_15[] = + { 0x0405060700010203, 0x0c0d0e0f08090a0b, 0x0405060700010203, 0x0c0d0e0f08090a0b } ; + static const unsigned long mBYTE_FLIP_MASK_7 [] = + { 0x0405060700010203, 0x0c0d0e0f08090a0b, 0x0405060700010203, 0x8080808008090a0b } ; + static const unsigned long mBYTE_FLIP_MASK_2 [] = + { 0x0405060700010203, 0x8080808080808080, 0x8080808080808080, 0x8080808080808080 } ; + + static const unsigned long mMAPtoW_I_7[] = + { 0x8080808080808080, 0x8080808080808080, 0x8080808080808080, 0x0302010080808080 } ; + static const unsigned long mMAP1toW_I_2[] = + { 0x8080808080808080, 0x0706050403020100, 0x8080808080808080, 0x8080808080808080 } ; + static const unsigned long mMAP2toW_I_2[] = + { 0x8080808080808080, 0x8080808080808080, 0x0f0e0d0c0b0a0908, 0x8080808080808080 } ; + static const unsigned long mMAP3toW_I_2[] = + { 0x8080808080808080, 0x8080808080808080, 0x8080808080808080, 0x0706050403020100 } ; + +static int Transform_AVX2(Sha256* sha256) +{ + + #ifdef WOLFSSL_SMALL_STACK + word32* W_K; + W_K = (word32*) XMALLOC(sizeof(word32) * 64, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (W_K == NULL) + return MEMORY_E; + #else + word32 W_K[64] ; + #endif + + MOVE_to_REG(W_I_16, sha256->buffer[0]); BYTE_SWAP(W_I_16, mBYTE_FLIP_MASK_16[0]) ; + MOVE_to_REG(W_I_15, sha256->buffer[1]); BYTE_SWAP(W_I_15, mBYTE_FLIP_MASK_15[0]) ; + MOVE_to_REG(W_I, sha256->buffer[8]) ; BYTE_SWAP(W_I, mBYTE_FLIP_MASK_16[0]) ; + MOVE_to_REG(W_I_7, sha256->buffer[16-7]) ; BYTE_SWAP(W_I_7, mBYTE_FLIP_MASK_7[0]) ; + MOVE_to_REG(W_I_2, sha256->buffer[16-2]) ; BYTE_SWAP(W_I_2, mBYTE_FLIP_MASK_2[0]) ; + + DigestToReg(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; + + ADD_MEM(W_K_TEMP, W_I_16, K[0]) ; + MOVE_to_MEM(W_K[0], W_K_TEMP) ; + + RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,0) ; + RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,1) ; + RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,2) ; + RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,3) ; + RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,4) ; + RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,5) ; + RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,6) ; + RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,7) ; + + ADD_MEM(YMM_TEMP0, W_I, K[8]) ; + MOVE_to_MEM(W_K[8], YMM_TEMP0) ; + + /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ + RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,8) ; + GAMMA0_1(W_I_TEMP, W_I_15) ; + RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,8) ; + GAMMA0_2(W_I_TEMP, W_I_15) ; + RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,8) ; + ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ + RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,9) ; + ADD(W_I, W_I_7, W_I_TEMP); + RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,9) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,9) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,10) ; + ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ + RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,10) ; + FEEDBACK1_to_W_I_2 ; + RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,10) ; + FEEDBACK_to_W_I_7 ; + RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,11) ; + ADD(W_I_TEMP, W_I_7, W_I_TEMP); + RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,11) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,11) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,12) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ + RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,12) ; + FEEDBACK2_to_W_I_2 ; + RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,12) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,13) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,13) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ + RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,13) ; + FEEDBACK3_to_W_I_2 ; + RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,14) ; + GAMMA1(YMM_TEMP0, W_I_2) ; + RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,14) ; + RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,14) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ + RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,15) ; + + MOVE_to_REG(YMM_TEMP0, K[16]) ; + RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,15) ; + ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; + RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,15) ; + ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; + MOVE_to_MEM(W_K[16], YMM_TEMP0) ; + + /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ + RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,16) ; + GAMMA0_1(W_I_TEMP, W_I_15) ; + RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,16) ; + GAMMA0_2(W_I_TEMP, W_I_15) ; + RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,16) ; + ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ + RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,17) ; + ADD(W_I, W_I_7, W_I_TEMP); + RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,17) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,17) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,18) ; + ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ + RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,18) ; + FEEDBACK1_to_W_I_2 ; + RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,18) ; + FEEDBACK_to_W_I_7 ; + RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,19) ; + ADD(W_I_TEMP, W_I_7, W_I_TEMP); + RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,19) ; + GAMMA1(YMM_TEMP0, W_I_2) ; + RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,19) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,20) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ + RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,20) ; + FEEDBACK2_to_W_I_2 ; + RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,20) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,21) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,21) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ + RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,21) ; + FEEDBACK3_to_W_I_2 ; + RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,22) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,22) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,22) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ + RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,23) ; + + MOVE_to_REG(YMM_TEMP0, K[24]) ; + RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,23) ; + ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; + RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,23) ; + ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; + MOVE_to_MEM(W_K[24], YMM_TEMP0) ; + + /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ + RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,24) ; + GAMMA0_1(W_I_TEMP, W_I_15) ; + RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,24) ; + GAMMA0_2(W_I_TEMP, W_I_15) ; + RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,24) ; + ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ + RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,25) ; + ADD(W_I, W_I_7, W_I_TEMP); + RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,25) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,25) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,26) ; + ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ + RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,26) ; + FEEDBACK1_to_W_I_2 ; + RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,26) ; + FEEDBACK_to_W_I_7 ; + RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,27) ; + ADD(W_I_TEMP, W_I_7, W_I_TEMP); + RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,27) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,27) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,28) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ + RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,28) ; + FEEDBACK2_to_W_I_2 ; + RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,28) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,29) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,29) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ + RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,29) ; + FEEDBACK3_to_W_I_2 ; + RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,30) ; + GAMMA1(YMM_TEMP0, W_I_2) ; + RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,30) ; + RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,30) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ + RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,31) ; + + MOVE_to_REG(YMM_TEMP0, K[32]) ; + RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,31) ; + ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; + RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,31) ; + ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; + MOVE_to_MEM(W_K[32], YMM_TEMP0) ; + + + /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ + RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,32) ; + GAMMA0_1(W_I_TEMP, W_I_15) ; + RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,32) ; + GAMMA0_2(W_I_TEMP, W_I_15) ; + RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,32) ; + ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ + RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,33) ; + ADD(W_I, W_I_7, W_I_TEMP); + RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,33) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,33) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,34) ; + ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ + RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,34) ; + FEEDBACK1_to_W_I_2 ; + RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,34) ; + FEEDBACK_to_W_I_7 ; + RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,35) ; + ADD(W_I_TEMP, W_I_7, W_I_TEMP); + RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,35) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,35) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,36) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ + RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,36) ; + FEEDBACK2_to_W_I_2 ; + RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,36) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,37) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,37) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ + RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,37) ; + FEEDBACK3_to_W_I_2 ; + RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,38) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,38) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,38) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ + RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,39) ; + + MOVE_to_REG(YMM_TEMP0, K[40]) ; + RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,39) ; + ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; + RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,39) ; + ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; + MOVE_to_MEM(W_K[40], YMM_TEMP0) ; + + /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ + RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,40) ; + GAMMA0_1(W_I_TEMP, W_I_15) ; + RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,40) ; + GAMMA0_2(W_I_TEMP, W_I_15) ; + RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,40) ; + ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ + RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,41) ; + ADD(W_I, W_I_7, W_I_TEMP); + RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,41) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,41) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,42) ; + ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ + RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,42) ; + FEEDBACK1_to_W_I_2 ; + RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,42) ; + FEEDBACK_to_W_I_7 ; + RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,43) ; + ADD(W_I_TEMP, W_I_7, W_I_TEMP); + RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,43) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,43) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,44) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ + RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,44) ; + FEEDBACK2_to_W_I_2 ; + RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,44) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,45) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,45) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ + RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,45) ; + FEEDBACK3_to_W_I_2 ; + RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,46) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,46) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,46) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ + RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,47) ; + + MOVE_to_REG(YMM_TEMP0, K[48]) ; + RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,47) ; + ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; + RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,47) ; + ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; + MOVE_to_MEM(W_K[48], YMM_TEMP0) ; + + /* W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15] + W[i-16]) */ + RND_0_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,48) ; + GAMMA0_1(W_I_TEMP, W_I_15) ; + RND_0_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,48) ; + GAMMA0_2(W_I_TEMP, W_I_15) ; + RND_0_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,48) ; + ADD(W_I_TEMP, W_I_16, W_I_TEMP) ;/* for saving W_I before adding incomplete W_I_7 */ + RND_7_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,49) ; + ADD(W_I, W_I_7, W_I_TEMP); + RND_7_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,49) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_7_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,49) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_6_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,50) ; + ADD(W_I, W_I, YMM_TEMP0) ;/* now W[16..17] are completed */ + RND_6_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,50) ; + FEEDBACK1_to_W_I_2 ; + RND_6_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,50) ; + FEEDBACK_to_W_I_7 ; + RND_5_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,51) ; + ADD(W_I_TEMP, W_I_7, W_I_TEMP); + RND_5_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,51) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_5_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,51) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_4_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,52) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ;/* now W[16..19] are completed */ + RND_4_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,52) ; + FEEDBACK2_to_W_I_2 ; + RND_4_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,52) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_3_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,53) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_3_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,53) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..21] are completed */ + RND_3_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,53) ; + FEEDBACK3_to_W_I_2 ; + RND_2_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,54) ; + GAMMA1_1(YMM_TEMP0, W_I_2) ; + RND_2_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,54) ; + GAMMA1_2(YMM_TEMP0, W_I_2) ; + RND_2_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,54) ; + ADD(W_I, W_I_TEMP, YMM_TEMP0) ; /* now W[16..23] are completed */ + RND_1_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,55) ; + + MOVE_to_REG(YMM_TEMP0, K[56]) ; + RND_1_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,55) ; + ROTATE_W(W_I_16, W_I_15, W_I_7, W_I_2, W_I) ; + RND_1_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,55) ; + ADD(YMM_TEMP0, YMM_TEMP0, W_I) ; + MOVE_to_MEM(W_K[56], YMM_TEMP0) ; + + RND_0(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,56) ; + RND_7(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,57) ; + RND_6(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,58) ; + RND_5(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,59) ; + + RND_4(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,60) ; + RND_3(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,61) ; + RND_2(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,62) ; + RND_1(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7,63) ; + + RegToDigest(S_0,S_1,S_2,S_3,S_4,S_5,S_6,S_7) ; + + #ifdef WOLFSSL_SMALL_STACK + XFREE(W, NULL, DYNAMIC_TYPE_TMP_BUFFER); + #endif + + return 0; +} + +#endif /* HAVE_INTEL_AVX2 */ + +#endif /* WOLFSSL_TI_HAHS */ + +#endif /* HAVE_FIPS */ + +#endif /* NO_SHA256 */ + diff --git a/wolfssl/wolfcrypt/md5.h b/wolfssl/wolfcrypt/md5.h index 94e4466f7..f7d7c150a 100644 --- a/wolfssl/wolfcrypt/md5.h +++ b/wolfssl/wolfcrypt/md5.h @@ -1,100 +1,100 @@ -/* md5.h - * - * Copyright (C) 2006-2015 wolfSSL Inc. - * - * This file is part of wolfSSL. (formerly known as CyaSSL) - * - * wolfSSL 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. - * - * wolfSSL 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 - */ - -#ifndef WOLF_CRYPT_MD5_H -#define WOLF_CRYPT_MD5_H - -#include - -#ifndef NO_MD5 - -#ifdef HAVE_FIPS - #define wc_InitMd5 InitMd5 - #define wc_Md5Update Md5Update - #define wc_Md5Final Md5Final - #define wc_Md5Hash Md5Hash -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -/* in bytes */ -enum { -#ifdef STM32F2_HASH - MD5_REG_SIZE = 4, /* STM32 register size, bytes */ -#endif - MD5 = 0, /* hash type unique */ - MD5_BLOCK_SIZE = 64, - MD5_DIGEST_SIZE = 16, - MD5_PAD_SIZE = 56 -}; - -#if defined(WOLFSSL_PIC32MZ_HASH) -#include "port/pic32/pic32mz-crypt.h" -#endif - -#ifdef TI_HASH_TEST -#include "wolfssl/wolfcrypt/port/ti/ti-hash.h" -#endif - - -#ifndef WOLFSSL_TI_HASH - -/* MD5 digest */ -typedef struct Md5 { - word32 buffLen; /* in bytes */ - word32 loLen; /* length in bytes */ - word32 hiLen; /* length in bytes */ - word32 buffer[MD5_BLOCK_SIZE / sizeof(word32)]; - #if !defined(WOLFSSL_PIC32MZ_HASH) - word32 digest[MD5_DIGEST_SIZE / sizeof(word32)]; - #else - word32 digest[PIC32_HASH_SIZE / sizeof(word32)]; - pic32mz_desc desc ; /* Crypt Engine descripter */ - #endif - -#ifdef TI_HASH_TEST - wolfssl_TI_Hash ti ; -#endif - -} Md5; - -#if defined(TI_HASH_TEST) -void wc_Md5GetHash_ti(Md5* md5, byte* hash) ; -#endif - -#else /* WOLFSSL_TI_HASH */ - #include "wolfssl/wolfcrypt/port/ti/ti-hash.h" -#endif - -WOLFSSL_API void wc_InitMd5(Md5*); -WOLFSSL_API void wc_Md5Update(Md5*, const byte*, word32); -WOLFSSL_API void wc_Md5Final(Md5*, byte*); -WOLFSSL_API int wc_Md5Hash(const byte*, word32, byte*); -WOLFSSL_API void wc_Md5GetHash(Md5*, byte*); - -#ifdef __cplusplus - } /* extern "C" */ -#endif - -#endif /* NO_MD5 */ -#endif /* WOLF_CRYPT_MD5_H */ +/* md5.h + * + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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. + * + * wolfSSL 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 + */ + +#ifndef WOLF_CRYPT_MD5_H +#define WOLF_CRYPT_MD5_H + +#include + +#ifndef NO_MD5 + +#ifdef HAVE_FIPS + #define wc_InitMd5 InitMd5 + #define wc_Md5Update Md5Update + #define wc_Md5Final Md5Final + #define wc_Md5Hash Md5Hash +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +/* in bytes */ +enum { +#ifdef STM32F2_HASH + MD5_REG_SIZE = 4, /* STM32 register size, bytes */ +#endif + MD5 = 0, /* hash type unique */ + MD5_BLOCK_SIZE = 64, + MD5_DIGEST_SIZE = 16, + MD5_PAD_SIZE = 56 +}; + +#if defined(WOLFSSL_PIC32MZ_HASH) +#include "port/pic32/pic32mz-crypt.h" +#endif + +#ifdef TI_HASH_TEST +#include "wolfssl/wolfcrypt/port/ti/ti-hash.h" +#endif + + +#ifndef WOLFSSL_TI_HASH + +/* MD5 digest */ +typedef struct Md5 { + word32 buffLen; /* in bytes */ + word32 loLen; /* length in bytes */ + word32 hiLen; /* length in bytes */ + word32 buffer[MD5_BLOCK_SIZE / sizeof(word32)]; + #if !defined(WOLFSSL_PIC32MZ_HASH) + word32 digest[MD5_DIGEST_SIZE / sizeof(word32)]; + #else + word32 digest[PIC32_HASH_SIZE / sizeof(word32)]; + pic32mz_desc desc ; /* Crypt Engine descripter */ + #endif + +#ifdef TI_HASH_TEST + wolfssl_TI_Hash ti ; +#endif + +} Md5; + +#if defined(TI_HASH_TEST) +void wc_Md5GetHash_ti(Md5* md5, byte* hash) ; +#endif + +#else /* WOLFSSL_TI_HASH */ + #include "wolfssl/wolfcrypt/port/ti/ti-hash.h" +#endif + +WOLFSSL_API void wc_InitMd5(Md5*); +WOLFSSL_API void wc_Md5Update(Md5*, const byte*, word32); +WOLFSSL_API void wc_Md5Final(Md5*, byte*); +WOLFSSL_API int wc_Md5Hash(const byte*, word32, byte*); +WOLFSSL_API void wc_Md5GetHash(Md5*, byte*); + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* NO_MD5 */ +#endif /* WOLF_CRYPT_MD5_H */ diff --git a/wolfssl/wolfcrypt/sha.h b/wolfssl/wolfcrypt/sha.h index 46dce03d0..b5ff4908d 100644 --- a/wolfssl/wolfcrypt/sha.h +++ b/wolfssl/wolfcrypt/sha.h @@ -1,88 +1,88 @@ -/* sha.h - * - * Copyright (C) 2006-2015 wolfSSL Inc. - * - * This file is part of wolfSSL. (formerly known as CyaSSL) - * - * wolfSSL 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. - * - * wolfSSL 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 - */ - -#ifndef WOLF_CRYPT_SHA_H -#define WOLF_CRYPT_SHA_H - -#include - -#ifndef NO_SHA - -#ifdef HAVE_FIPS -/* for fips @wc_fips */ -#include -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef HAVE_FIPS /* avoid redefining structs */ -/* in bytes */ -enum { -#ifdef STM32F2_HASH - SHA_REG_SIZE = 4, /* STM32 register size, bytes */ -#endif - SHA = 1, /* hash type unique */ - SHA_BLOCK_SIZE = 64, - SHA_DIGEST_SIZE = 20, - SHA_PAD_SIZE = 56 -}; - -#ifdef WOLFSSL_PIC32MZ_HASH -#include "port/pic32/pic32mz-crypt.h" -#endif - -#ifndef WOLFSSL_TI_HASH - -/* Sha digest */ -typedef struct Sha { - word32 buffLen; /* in bytes */ - word32 loLen; /* length in bytes */ - word32 hiLen; /* length in bytes */ - word32 buffer[SHA_BLOCK_SIZE / sizeof(word32)]; - #ifndef WOLFSSL_PIC32MZ_HASH - word32 digest[SHA_DIGEST_SIZE / sizeof(word32)]; - #else - word32 digest[PIC32_HASH_SIZE / sizeof(word32)]; - pic32mz_desc desc; /* Crypt Engine descripter */ - #endif -} Sha; - -#else /* WOLFSSL_TI_HASH */ - #include "wolfssl/wolfcrypt/port/ti/ti-hash.h" -#endif - -#endif /* HAVE_FIPS */ - -WOLFSSL_API int wc_InitSha(Sha*); -WOLFSSL_API int wc_ShaUpdate(Sha*, const byte*, word32); -WOLFSSL_API int wc_ShaFinal(Sha*, byte*); -WOLFSSL_API int wc_ShaHash(const byte*, word32, byte*); -WOLFSSL_API int wc_ShaGetHash(Sha*, byte*); - -#ifdef __cplusplus - } /* extern "C" */ -#endif - -#endif /* NO_SHA */ -#endif /* WOLF_CRYPT_SHA_H */ - +/* sha.h + * + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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. + * + * wolfSSL 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 + */ + +#ifndef WOLF_CRYPT_SHA_H +#define WOLF_CRYPT_SHA_H + +#include + +#ifndef NO_SHA + +#ifdef HAVE_FIPS +/* for fips @wc_fips */ +#include +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef HAVE_FIPS /* avoid redefining structs */ +/* in bytes */ +enum { +#ifdef STM32F2_HASH + SHA_REG_SIZE = 4, /* STM32 register size, bytes */ +#endif + SHA = 1, /* hash type unique */ + SHA_BLOCK_SIZE = 64, + SHA_DIGEST_SIZE = 20, + SHA_PAD_SIZE = 56 +}; + +#ifdef WOLFSSL_PIC32MZ_HASH +#include "port/pic32/pic32mz-crypt.h" +#endif + +#ifndef WOLFSSL_TI_HASH + +/* Sha digest */ +typedef struct Sha { + word32 buffLen; /* in bytes */ + word32 loLen; /* length in bytes */ + word32 hiLen; /* length in bytes */ + word32 buffer[SHA_BLOCK_SIZE / sizeof(word32)]; + #ifndef WOLFSSL_PIC32MZ_HASH + word32 digest[SHA_DIGEST_SIZE / sizeof(word32)]; + #else + word32 digest[PIC32_HASH_SIZE / sizeof(word32)]; + pic32mz_desc desc; /* Crypt Engine descripter */ + #endif +} Sha; + +#else /* WOLFSSL_TI_HASH */ + #include "wolfssl/wolfcrypt/port/ti/ti-hash.h" +#endif + +#endif /* HAVE_FIPS */ + +WOLFSSL_API int wc_InitSha(Sha*); +WOLFSSL_API int wc_ShaUpdate(Sha*, const byte*, word32); +WOLFSSL_API int wc_ShaFinal(Sha*, byte*); +WOLFSSL_API int wc_ShaHash(const byte*, word32, byte*); +WOLFSSL_API int wc_ShaGetHash(Sha*, byte*); + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* NO_SHA */ +#endif /* WOLF_CRYPT_SHA_H */ + diff --git a/wolfssl/wolfcrypt/sha256.h b/wolfssl/wolfcrypt/sha256.h index 86616e320..d022d3ac5 100644 --- a/wolfssl/wolfcrypt/sha256.h +++ b/wolfssl/wolfcrypt/sha256.h @@ -1,86 +1,86 @@ -/* sha256.h - * - * Copyright (C) 2006-2015 wolfSSL Inc. - * - * This file is part of wolfSSL. (formerly known as CyaSSL) - * - * wolfSSL 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. - * - * wolfSSL 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 - */ - -/* code submitted by raphael.huck@efixo.com */ - -#ifndef WOLF_CRYPT_SHA256_H -#define WOLF_CRYPT_SHA256_H - -#include - -#ifndef NO_SHA256 - -#ifdef HAVE_FIPS - /* for fips @wc_fips */ - #include -#endif - - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef HAVE_FIPS /* avoid redefinition of structs */ -#ifdef WOLFSSL_PIC32MZ_HASH - #include "port/pic32/pic32mz-crypt.h" -#endif - -/* in bytes */ -enum { - SHA256 = 2, /* hash type unique */ - SHA256_BLOCK_SIZE = 64, - SHA256_DIGEST_SIZE = 32, - SHA256_PAD_SIZE = 56 -}; - -#ifndef WOLFSSL_TI_HASH - -/* Sha256 digest */ -typedef struct Sha256 { - word32 buffLen; /* in bytes */ - word32 loLen; /* length in bytes */ - word32 hiLen; /* length in bytes */ - word32 digest[SHA256_DIGEST_SIZE / sizeof(word32)]; - word32 buffer[SHA256_BLOCK_SIZE / sizeof(word32)]; - #ifdef WOLFSSL_PIC32MZ_HASH - pic32mz_desc desc ; /* Crypt Engine descripter */ - #endif -} Sha256; - -#else /* WOLFSSL_TI_HASH */ - #include "wolfssl/wolfcrypt/port/ti/ti-hash.h" -#endif - -#endif /* HAVE_FIPS */ - -WOLFSSL_API int wc_InitSha256(Sha256*); -WOLFSSL_API int wc_Sha256Update(Sha256*, const byte*, word32); -WOLFSSL_API int wc_Sha256Final(Sha256*, byte*); -WOLFSSL_API int wc_Sha256Hash(const byte*, word32, byte*); -WOLFSSL_API int wc_Sha256GetHash(Sha256*, byte*); - -#ifdef __cplusplus - } /* extern "C" */ -#endif - -#endif /* NO_SHA256 */ -#endif /* WOLF_CRYPT_SHA256_H */ - +/* sha256.h + * + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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. + * + * wolfSSL 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 + */ + +/* code submitted by raphael.huck@efixo.com */ + +#ifndef WOLF_CRYPT_SHA256_H +#define WOLF_CRYPT_SHA256_H + +#include + +#ifndef NO_SHA256 + +#ifdef HAVE_FIPS + /* for fips @wc_fips */ + #include +#endif + + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef HAVE_FIPS /* avoid redefinition of structs */ +#ifdef WOLFSSL_PIC32MZ_HASH + #include "port/pic32/pic32mz-crypt.h" +#endif + +/* in bytes */ +enum { + SHA256 = 2, /* hash type unique */ + SHA256_BLOCK_SIZE = 64, + SHA256_DIGEST_SIZE = 32, + SHA256_PAD_SIZE = 56 +}; + +#ifndef WOLFSSL_TI_HASH + +/* Sha256 digest */ +typedef struct Sha256 { + word32 buffLen; /* in bytes */ + word32 loLen; /* length in bytes */ + word32 hiLen; /* length in bytes */ + word32 digest[SHA256_DIGEST_SIZE / sizeof(word32)]; + word32 buffer[SHA256_BLOCK_SIZE / sizeof(word32)]; + #ifdef WOLFSSL_PIC32MZ_HASH + pic32mz_desc desc ; /* Crypt Engine descripter */ + #endif +} Sha256; + +#else /* WOLFSSL_TI_HASH */ + #include "wolfssl/wolfcrypt/port/ti/ti-hash.h" +#endif + +#endif /* HAVE_FIPS */ + +WOLFSSL_API int wc_InitSha256(Sha256*); +WOLFSSL_API int wc_Sha256Update(Sha256*, const byte*, word32); +WOLFSSL_API int wc_Sha256Final(Sha256*, byte*); +WOLFSSL_API int wc_Sha256Hash(const byte*, word32, byte*); +WOLFSSL_API int wc_Sha256GetHash(Sha256*, byte*); + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* NO_SHA256 */ +#endif /* WOLF_CRYPT_SHA256_H */ + From d24c7f070cb1c39764aa6599b67f99ad0c719837 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Thu, 21 May 2015 18:12:43 +0900 Subject: [PATCH 092/350] files cleaned --- src/include.am | 5 +-- wolfcrypt/src/md5.c | 25 ----------- wolfcrypt/src/sha.c | 7 ---- wolfcrypt/src/sha256.c | 7 ---- wolfssl/wolfcrypt/port/ti/ti-ccm.h | 40 ++++++++++++++++++ wolfssl/wolfcrypt/port/ti/ti-hash.h | 64 +++++++++++++++++++++++++++++ 6 files changed, 106 insertions(+), 42 deletions(-) create mode 100644 wolfssl/wolfcrypt/port/ti/ti-ccm.h create mode 100644 wolfssl/wolfcrypt/port/ti/ti-hash.h diff --git a/src/include.am b/src/include.am index 1dcf24a2b..f65331b4c 100644 --- a/src/include.am +++ b/src/include.am @@ -74,7 +74,8 @@ endif src_libwolfssl_la_SOURCES += \ wolfcrypt/src/logging.c \ wolfcrypt/src/wc_port.c \ - wolfcrypt/src/error.c + wolfcrypt/src/error.c\ + wolfcrypt/src/port/ti/ti-hash.c if BUILD_MEMORY src_libwolfssl_la_SOURCES += wolfcrypt/src/memory.c @@ -191,8 +192,6 @@ if BUILD_PKCS7 src_libwolfssl_la_SOURCES += wolfcrypt/src/pkcs7.c endif -src_libwolfssl_la_SOURCES += wolfcrypt/src/port/ti/ti-hash.c - # ssl files src_libwolfssl_la_SOURCES += \ src/internal.c \ diff --git a/wolfcrypt/src/md5.c b/wolfcrypt/src/md5.c index 6c2e45d9f..64c2ff15a 100644 --- a/wolfcrypt/src/md5.c +++ b/wolfcrypt/src/md5.c @@ -180,12 +180,6 @@ #endif /* WOLFSSL_HAVE_MIN */ -#ifdef TI_HASH_TEST -void wc_InitMd5_ti(Md5* md5) ; -void wc_Md5Update_ti(Md5* md5, const byte* data, word32 len) ; -void wc_Md5Final_ti(Md5* md5, byte* hash) ; -#endif - void wc_InitMd5(Md5* md5) { md5->digest[0] = 0x67452301L; @@ -196,10 +190,6 @@ void wc_InitMd5(Md5* md5) md5->buffLen = 0; md5->loLen = 0; md5->hiLen = 0; - -#ifdef TI_HASH_TEST - wc_InitMd5_ti(md5) ; -#endif } #ifndef FREESCALE_MMCAU @@ -328,10 +318,6 @@ void wc_Md5Update(Md5* md5, const byte* data, word32 len) md5->buffLen = 0; } } -#ifdef TI_HASH_TEST - wc_Md5Update_ti(md5, data, len) ; -#endif - } @@ -376,10 +362,6 @@ void wc_Md5Final(Md5* md5, byte* hash) XMEMCPY(hash, md5->digest, MD5_DIGEST_SIZE); wc_InitMd5(md5); /* reset state */ - -#ifdef TI_HASH_TEST - wc_Md5Final_ti(md5, hash) ; -#endif } #endif /* STM32F2_HASH */ @@ -410,17 +392,10 @@ int wc_Md5Hash(const byte* data, word32 len, byte* hash) return 0; } -#if defined(WOLFSSL_TI_HASH)||defined(TI_HASH_TEST) -#include "wolfssl/wolfcrypt/port/ti/ti-hash.h" -#endif void wc_Md5GetHash(Md5* md5, byte* hash) { -#if defined(WOLFSSL_TI_HASH) || defined(TI_HASH_TEST) - wc_Md5GetHash_ti(md5, hash) ; -#else Md5 save = *md5 ; wc_Md5Final(md5, hash) ; *md5 = save ; -#endif } #endif /* NO_MD5 */ diff --git a/wolfcrypt/src/sha.c b/wolfcrypt/src/sha.c index be2106cbd..d1b2dc572 100644 --- a/wolfcrypt/src/sha.c +++ b/wolfcrypt/src/sha.c @@ -452,20 +452,13 @@ int wc_ShaHash(const byte* data, word32 len, byte* hash) } -#ifdef WOLFSSL_TI_HASH -#include "wolfssl/wolfcrypt/port/ti/ti-hash.h" -#endif int wc_ShaGetHash(Sha* sha, byte* hash) { -#if defined(WOLFSS_TI_HASH) - wc_ShaGetHash_TI(sha, hash) ; -#else int ret ; Sha save = *sha ; ret = wc_ShaFinal(sha, hash) ; *sha = save ; return ret ; -#endif } #endif /* HAVE_FIPS */ diff --git a/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c index 90f99a35b..93e94666d 100644 --- a/wolfcrypt/src/sha256.c +++ b/wolfcrypt/src/sha256.c @@ -576,20 +576,13 @@ int wc_Sha256Hash(const byte* data, word32 len, byte* hash) return ret; } -#ifdef WOLFSSL_TI_HASH -#include "wolfssl/wolfcrypt/port/ti/ti-hash.h" -#endif int wc_Sha256GetHash(Sha256* sha256, byte* hash) { -#if defined(WOLFSS_TI_HASH) - return wc_Sha256GetHash_TI(sha256, hash) ; -#else int ret ; Sha256 save = *sha256 ; ret = wc_Sha256Final(sha256, hash) ; *sha256 = save ; return ret ; -#endif } #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) diff --git a/wolfssl/wolfcrypt/port/ti/ti-ccm.h b/wolfssl/wolfcrypt/port/ti/ti-ccm.h new file mode 100644 index 000000000..f0fb24799 --- /dev/null +++ b/wolfssl/wolfcrypt/port/ti/ti-ccm.h @@ -0,0 +1,40 @@ +/* port/ti/ti_ccm.c + * + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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. + * + * wolfSSL 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 + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#if defined(WOLFSSL_TI_CRYPT) || defined(WOLFSSL_TI_HASH) + +bool wolfSSL_TI_CCMInit(void) ; + +#ifndef SINGLE_THREADED +void wolfSSL_TI_lockCCM() ; +void wolfSSL_TI_unlockCCM() ; +#else +#define wolfSSL_TI_lockCCM() +#define wolfSSL_TI_unlockCCM() +#endif + +#endif diff --git a/wolfssl/wolfcrypt/port/ti/ti-hash.h b/wolfssl/wolfcrypt/port/ti/ti-hash.h new file mode 100644 index 000000000..505ccc498 --- /dev/null +++ b/wolfssl/wolfcrypt/port/ti/ti-hash.h @@ -0,0 +1,64 @@ +/* port/ti/ti-hash.h + * + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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. + * + * wolfSSL 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 + */ + +#ifndef WOLF_CRYPT_TI_HASH_H +#define WOLF_CRYPT_TI_HASH_H + +#include + +#ifndef WOLFSSL_TI_INITBUFF +#define WOLFSSL_TI_INITBUFF 64 +#endif + +#define WOLFSSL_MAX_HASH_SIZE 64 + +typedef struct { + byte *msg ; + word32 used ; + word32 len ; + byte hash[WOLFSSL_MAX_HASH_SIZE] ; +} wolfssl_TI_Hash ; + + +#ifndef TI_HASH_TEST +#if !defined(NO_MD5) +typedef wolfssl_TI_Hash Md5 ; + +#endif +#if !defined(NO_SHA) +typedef wolfssl_TI_Hash Sha ; +#endif +#if !defined(NO_SHA256) +typedef wolfssl_TI_Hash Sha256 ; +#endif + +#if defined(HAVE_SHA224) +typedef wolfssl_TI_Hash Sha224 ; +#define SHA224_DIGEST_SIZE 28 + +WOLFSSL_API int wc_InitSha224(Sha224* sha224) ; +WOLFSSL_API int wc_Sha224Update(Sha224* sha224, const byte* data, word32 len) ; +WOLFSSL_API int wc_Sha224Final(Sha224* sha224, byte* hash) ; +WOLFSSL_API int wc_Sha224Hash(const byte* data, word32 len, byte*hash) ; + +#endif +#endif +#endif /* WOLF_CRYPT_TI_HASH_H */ From ce8b4e0cdc2022fac9c1118709aa0e73a1c0cedb Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Thu, 21 May 2015 18:26:35 +0900 Subject: [PATCH 093/350] Added ti-hash.c --- wolfcrypt/src/md5.c | 2 +- wolfcrypt/src/port/ti/ti-hash.c | 128 ++++++++++++-------------------- wolfcrypt/src/sha.c | 2 +- wolfcrypt/src/sha256.c | 2 +- 4 files changed, 50 insertions(+), 84 deletions(-) diff --git a/wolfcrypt/src/md5.c b/wolfcrypt/src/md5.c index 64c2ff15a..d5bb17b63 100644 --- a/wolfcrypt/src/md5.c +++ b/wolfcrypt/src/md5.c @@ -166,7 +166,7 @@ #elif defined(WOLFSSL_IT_HASH) - /* defined in port/ti_md5.c */ + /* defined in port/ti_hash.c */ #else /* CTaoCrypt software implementation */ diff --git a/wolfcrypt/src/port/ti/ti-hash.c b/wolfcrypt/src/port/ti/ti-hash.c index 7647dcdb4..4b7f49a20 100644 --- a/wolfcrypt/src/port/ti/ti-hash.c +++ b/wolfcrypt/src/port/ti/ti-hash.c @@ -20,9 +20,15 @@ */ +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + #include -#if defined(WOLFSSL_TI_HASH)||defined(TI_HASH_TEST) +#if defined(WOLFSSL_TI_HASH) #ifdef __cplusplus extern "C" { @@ -39,7 +45,7 @@ #include #include -#if !defined(TI_HASH_TEST) +#ifndef TI_DUMMY_BUILD #include "inc/hw_memmap.h" #include "inc/hw_shamd5.h" #include "inc/hw_ints.h" @@ -47,6 +53,11 @@ #include "driverlib/sysctl.h" #include "driverlib/rom_map.h" #include "driverlib/rom.h" +#else +#define SHAMD5_ALGO_MD5 1 +#define SHAMD5_ALGO_SHA1 2 +#define SHAMD5_ALGO_SHA256 3 +bool wolfSSL_TI_CCMInit(void) { return true ; } #endif static int hashInit(wolfssl_TI_Hash *hash) { @@ -76,50 +87,33 @@ static int hashUpdate(wolfssl_TI_Hash *hash, const byte* data, word32 len) return 0 ; } -static int hashFinal(wolfssl_TI_Hash *hash, byte* result, word32 algo, word32 hsize) +static int hashGetHash(wolfssl_TI_Hash *hash, byte* result, word32 algo, word32 hsize) { - #if !defined(TI_HASH_TEST) uint32_t h[16] ; - +#ifndef TI_DUMMY_BUILD wolfSSL_TI_lockCCM() ; ROM_SHAMD5Reset(SHAMD5_BASE); ROM_SHAMD5ConfigSet(SHAMD5_BASE, algo); ROM_SHAMD5DataProcess(SHAMD5_BASE, (uint32_t *)hash->msg, hash->used, h); - XMEMCPY(result, h, hsize) ; wolfSSL_TI_unlockCCM() ; - #else - (void) result ; +#else + (void) hash ; (void) algo ; - (void) hsize ; - #endif +#endif + XMEMCPY(result, h, hsize) ; + + return 0 ; +} + +static int hashFinal(wolfssl_TI_Hash *hash, byte* result, word32 algo, word32 hsize) +{ + hashGetHash(hash, result, algo, hsize) ; XFREE(hash->msg, NULL, DYNAMIC_TYPE_TMP_BUFFER); hashInit(hash) ; return 0 ; } -static int hashGetHash(wolfssl_TI_Hash *hash, byte* result, word32 algo, word32 hsize) -{ - #if !defined(TI_HASH_TEST) - uint32_t h[16] ; - - wolfSSL_TI_lockCCM() ; - ROM_SHAMD5Reset(SHAMD5_BASE); - ROM_SHAMD5ConfigSet(SHAMD5_BASE, algo); - ROM_SHAMD5DataProcess(SHAMD5_BASE, - (uint32_t *)hash->msg, hash->used, h); - XMEMCPY(result, h, hsize) ; - wolfSSL_TI_unlockCCM() ; - #else - (void) hash ; - (void) result ; - (void) algo ; - (void) hsize ; - #endif - return 0 ; -} - -#ifndef TI_HASH_TEST static int hashHash(const byte* data, word32 len, byte* hash, word32 algo, word32 hsize) { int ret = 0; @@ -149,82 +143,39 @@ static int hashHash(const byte* data, word32 len, byte* hash, word32 algo, word3 return ret; } -#endif #if !defined(NO_MD5) - -#ifdef TI_HASH_TEST -#define SHAMD5_ALGO_MD5 1 -void wc_InitMd5_ti(Md5* md5) ; -void wc_Md5Update_ti(Md5* md5, const byte* data, word32 len); -void wc_Md5Final_ti(Md5* md5, byte* hash); -bool wolfSSL_TI_CCMInit(void) ; -bool wolfSSL_TI_CCMInit(void) { return true ; } -#endif - -#ifdef TI_HASH_TEST -void wc_InitMd5_ti(Md5* md5) -#else -void wc_InitMd5(Md5* md5) -#endif +WOLFSSL_API void wc_InitMd5(Md5* md5) { if (md5 == NULL) return ; if(!wolfSSL_TI_CCMInit())return ; - #ifdef TI_HASH_TEST - hashInit(&(md5->ti)) ; - #else hashInit((wolfssl_TI_Hash *)md5) ; - #endif } -#ifdef TI_HASH_TEST -void wc_Md5Update_ti(Md5* md5, const byte* data, word32 len) -#else -void wc_Md5Update(Md5* md5, const byte* data, word32 len) -#endif +WOLFSSL_API void wc_Md5Update(Md5* md5, const byte* data, word32 len) { - #ifdef TI_HASH_TEST - hashUpdate(&(md5->ti), data, len) ; - #else hashUpdate((wolfssl_TI_Hash *)md5, data, len) ; - #endif } -#ifdef TI_HASH_TEST -void wc_Md5Final_ti(Md5* md5, byte* hash) -#else -void wc_Md5Final(Md5* md5, byte* hash) -#endif +WOLFSSL_API void wc_Md5Final(Md5* md5, byte* hash) { - #ifdef TI_HASH_TEST - hashFinal(&(md5->ti), hash, SHAMD5_ALGO_MD5, MD5_DIGEST_SIZE) ; - #else hashFinal((wolfssl_TI_Hash *)md5, hash, SHAMD5_ALGO_MD5, MD5_DIGEST_SIZE) ; - #endif } - -void wc_Md5GetHash_ti(Md5* md5, byte* hash) +WOLFSSL_API void wc_Md5GetHash(Md5* md5, byte* hash) { - hashGetHash(&(md5->ti), hash, SHAMD5_ALGO_MD5, MD5_DIGEST_SIZE) ; - #ifdef TI_HASH_TEST - wc_Md5Final(md5, hash) ; - #endif + hashGetHash(md5, hash, SHAMD5_ALGO_MD5, MD5_DIGEST_SIZE) ; } -#ifndef TI_HASH_TEST WOLFSSL_API int wc_Md5Hash(const byte*data, word32 len, byte*hash) { return hashHash(data, len, hash, SHAMD5_ALGO_MD5, MD5_DIGEST_SIZE) ; } -#endif #endif /* NO_MD5 */ -#ifndef TI_HASH_TEST #if !defined(NO_SHA) - WOLFSSL_API int wc_InitSha(Sha* sha) { if (sha == NULL) @@ -242,6 +193,12 @@ WOLFSSL_API int wc_ShaFinal(Sha* sha, byte* hash) { return hashFinal((wolfssl_TI_Hash *)sha, hash, SHAMD5_ALGO_SHA1, SHA_DIGEST_SIZE) ; } + +WOLFSSL_API int wc_ShaGetHash(Sha* sha, byte* hash) +{ + return hashGetHash(sha, hash, SHAMD5_ALGO_SHA1, SHA_DIGEST_SIZE) ; +} + WOLFSSL_API int wc_ShaHash(const byte*data, word32 len, byte*hash) { return hashHash(data, len, hash, SHAMD5_ALGO_SHA1, SHA_DIGEST_SIZE) ; @@ -268,6 +225,11 @@ WOLFSSL_API int wc_Sha224Final(Sha224* sha224, byte* hash) return hashFinal((wolfssl_TI_Hash *)sha224, hash, SHAMD5_ALGO_SHA224, SHA224_DIGEST_SIZE) ; } +WOLFSSL_API int wc_Sha224GetHash(Sha224* sha224, byte* hash) +{ + return hashGetHash(sha224, hash, SHAMD5_ALGO_SHA224, SHA224_DIGEST_SIZE) ; +} + WOLFSSL_API int wc_Sha224Hash(const byte* data, word32 len, byte*hash) { return hashHash(data, len, hash, SHAMD5_ALGO_SHA224, SHA224_DIGEST_SIZE) ; @@ -294,11 +256,15 @@ WOLFSSL_API int wc_Sha256Final(Sha256* sha256, byte* hash) return hashFinal((wolfssl_TI_Hash *)sha256, hash, SHAMD5_ALGO_SHA256, SHA256_DIGEST_SIZE) ; } +WOLFSSL_API int wc_Sha256GetHash(Sha256* sha256, byte* hash) +{ + return hashGetHash(sha256, hash, SHAMD5_ALGO_SHA256, SHA_DIGEST_SIZE) ; +} + WOLFSSL_API int wc_Sha256Hash(const byte* data, word32 len, byte*hash) { return hashHash(data, len, hash, SHAMD5_ALGO_SHA256, SHA256_DIGEST_SIZE) ; } #endif -#endif /* TI_HASH_TEST */ #endif diff --git a/wolfcrypt/src/sha.c b/wolfcrypt/src/sha.c index d1b2dc572..78f2640f0 100644 --- a/wolfcrypt/src/sha.c +++ b/wolfcrypt/src/sha.c @@ -198,7 +198,7 @@ int wc_ShaFinal(Sha* sha, byte* hash) #elif defined(WOLFSSL_TI_HASH) - /* defined in port/ti/ti_sha.c */ + /* defined in port/ti/ti_hash.c */ #else /* wc_ software implementation */ diff --git a/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c index 93e94666d..a204637f4 100644 --- a/wolfcrypt/src/sha256.c +++ b/wolfcrypt/src/sha256.c @@ -57,7 +57,7 @@ int wc_Sha256Hash(const byte* data, word32 len, byte* out) #else /* else build without fips */ #if !defined(NO_SHA256) && !defined(WOLFSSL_TI_HASH) - /* defined in port/ti/ti_sha256.c */ + /* defined in port/ti/ti_hash.c */ #if !defined (ALIGN32) #if defined (__GNUC__) From 5bcce85de41d499fa6af0c9c921d692b36fdc409 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Thu, 21 May 2015 18:34:51 +0900 Subject: [PATCH 094/350] md5.h cleaned --- wolfssl/wolfcrypt/md5.h | 9 --------- 1 file changed, 9 deletions(-) diff --git a/wolfssl/wolfcrypt/md5.h b/wolfssl/wolfcrypt/md5.h index f7d7c150a..b1f775c4c 100644 --- a/wolfssl/wolfcrypt/md5.h +++ b/wolfssl/wolfcrypt/md5.h @@ -71,17 +71,8 @@ typedef struct Md5 { word32 digest[PIC32_HASH_SIZE / sizeof(word32)]; pic32mz_desc desc ; /* Crypt Engine descripter */ #endif - -#ifdef TI_HASH_TEST - wolfssl_TI_Hash ti ; -#endif - } Md5; -#if defined(TI_HASH_TEST) -void wc_Md5GetHash_ti(Md5* md5, byte* hash) ; -#endif - #else /* WOLFSSL_TI_HASH */ #include "wolfssl/wolfcrypt/port/ti/ti-hash.h" #endif From 64602d19698870aa36d69ba091f6718ec431ded7 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Thu, 21 May 2015 10:11:21 -0700 Subject: [PATCH 095/350] added check for allowed minimum DH key size --- certs/test/catalog.txt | 6 ++++++ certs/test/dh1024.der | Bin 0 -> 138 bytes certs/test/dh1024.pem | 17 +++++++++++++++++ certs/test/dh512.der | Bin 0 -> 72 bytes certs/test/dh512.pem | 12 ++++++++++++ examples/client/client.c | 22 +++++++++++++++++++++- examples/server/server.c | 33 +++++++++++++++++++++++++++++++-- src/internal.c | 27 +++++++++++++++++++++++++++ src/ssl.c | 35 +++++++++++++++++++++++++++++++++++ wolfssl/error-ssl.h | 2 ++ wolfssl/internal.h | 21 +++++++++++++++++++++ wolfssl/ssl.h | 4 ++++ wolfssl/test.h | 5 +++++ 13 files changed, 181 insertions(+), 3 deletions(-) create mode 100644 certs/test/dh1024.der create mode 100644 certs/test/dh1024.pem create mode 100644 certs/test/dh512.der create mode 100644 certs/test/dh512.pem diff --git a/certs/test/catalog.txt b/certs/test/catalog.txt index dcc1393d4..a1f77b4b3 100644 --- a/certs/test/catalog.txt +++ b/certs/test/catalog.txt @@ -1,3 +1,9 @@ crit-cert.pem: Simple self-signed certificate with critical Basic Constraints and Key Usage extensions. +dh512.pem, dh512.der: + 512-bit DH parameters. Used for testing the rejection of lower-bit sized DH + keys. +dh1024.pem, dh1024.der: + 1024-bit DH parameters. Used for testing the rejection of lower-bit sized DH + keys. diff --git a/certs/test/dh1024.der b/certs/test/dh1024.der new file mode 100644 index 0000000000000000000000000000000000000000..1a3ff399f733d01722161352eee93f06dae5dcd6 GIT binary patch literal 138 zcmXqLY-eh0WO!G+Z1TR9JK}?O&bhLJzxU^cV9k}PYi&jd@#vTqkyuhoMnTe4J0Mcng9smFU literal 0 HcmV?d00001 diff --git a/certs/test/dh1024.pem b/certs/test/dh1024.pem new file mode 100644 index 000000000..82d14e766 --- /dev/null +++ b/certs/test/dh1024.pem @@ -0,0 +1,17 @@ + DH Parameters: (1024 bit) + prime: + 00:ee:73:a6:93:be:a9:b8:5f:52:b9:9c:d4:a8:0f: + 8d:f9:b0:53:29:a9:25:06:0e:95:dd:f5:89:c8:6b: + 09:ae:94:1c:62:35:05:39:ab:6d:46:c5:b2:a2:fd: + a0:e1:ba:01:a5:00:4f:7f:44:e5:74:81:8b:3a:2e: + fa:ea:fe:f6:c3:18:11:ca:fd:ee:8b:9c:9e:0d:1a: + 5a:57:77:74:63:91:e7:51:bb:6d:79:93:e2:b4:5c: + fa:21:21:ff:5d:b3:e7:5c:92:08:ca:cb:4e:e7:8c: + f3:1c:21:8c:44:8c:6d:31:60:7a:e6:37:15:79:1b: + 1d:5d:c3:56:c3:a0:4a:8d:03 + generator: 2 (0x2) +-----BEGIN DH PARAMETERS----- +MIGHAoGBAO5zppO+qbhfUrmc1KgPjfmwUympJQYOld31ichrCa6UHGI1BTmrbUbF +sqL9oOG6AaUAT39E5XSBizou+ur+9sMYEcr97oucng0aWld3dGOR51G7bXmT4rRc ++iEh/12z51ySCMrLTueM8xwhjESMbTFgeuY3FXkbHV3DVsOgSo0DAgEC +-----END DH PARAMETERS----- diff --git a/certs/test/dh512.der b/certs/test/dh512.der new file mode 100644 index 0000000000000000000000000000000000000000..f743db4219b6080049fd58d208f515c65f32584c GIT binary patch literal 72 zcmXqTV{&9@FH@fR@c!*A=RN~%|KwoS@^cMLeH&M}_#50f>3Z{Q>SJ%+ZLiB0tG)7N eZn=4VTh_L_fz#6tmOsmWD>>2isQP9mMkWBCtRchz literal 0 HcmV?d00001 diff --git a/certs/test/dh512.pem b/certs/test/dh512.pem new file mode 100644 index 000000000..d1fef9243 --- /dev/null +++ b/certs/test/dh512.pem @@ -0,0 +1,12 @@ + DH Parameters: (512 bit) + prime: + 00:87:76:23:99:e1:df:db:6a:43:8e:30:2b:4f:63: + 53:05:77:ce:80:02:8e:b1:a8:44:4f:30:d8:c9:45: + d9:cd:65:e3:4b:2d:b6:eb:77:a3:26:ea:4d:03:84: + d9:d7:b6:6a:b6:dd:51:97:66:c1:77:e6:6b:ed:19: + 91:45:c5:27:b3 + generator: 2 (0x2) +-----BEGIN DH PARAMETERS----- +MEYCQQCHdiOZ4d/bakOOMCtPY1MFd86AAo6xqERPMNjJRdnNZeNLLbbrd6Mm6k0D +hNnXtmq23VGXZsF35mvtGZFFxSezAgEC +-----END DH PARAMETERS----- diff --git a/examples/client/client.c b/examples/client/client.c index ee5dae9ca..0546bb0f2 100644 --- a/examples/client/client.c +++ b/examples/client/client.c @@ -130,6 +130,10 @@ static void Usage(void) printf("-c Certificate file, default %s\n", cliCert); printf("-k Key file, default %s\n", cliKey); printf("-A Certificate Authority file, default %s\n", caCert); +#ifndef NO_DH + printf("-Z Minimum DH key bits, default %d\n", + DEFAULT_MIN_DHKEY_BITS); +#endif printf("-b Benchmark connections and print stats\n"); printf("-s Use pre Shared keys\n"); printf("-t Track wolfSSL memory use\n"); @@ -224,6 +228,7 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) int atomicUser = 0; int pkCallbacks = 0; int overrideDateErrors = 0; + int minDhKeyBits = DEFAULT_MIN_DHKEY_BITS; char* cipherList = NULL; const char* verifyCert = caCert; const char* ourCert = cliCert; @@ -269,11 +274,12 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) (void)useClientCert; (void)overrideDateErrors; (void)disableCRL; + (void)minDhKeyBits; StackTrap(); while ((ch = mygetopt(argc, argv, - "?gdDusmNrwRitfxXUPCh:p:v:l:A:c:k:b:zS:L:ToO:a")) + "?gdDusmNrwRitfxXUPCh:p:v:l:A:c:k:Z:b:zS:L:ToO:a")) != -1) { switch (ch) { case '?' : @@ -375,6 +381,16 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) ourKey = myoptarg; break; + case 'Z' : + #ifndef NO_DH + minDhKeyBits = atoi(myoptarg); + if (minDhKeyBits <= 0 || minDhKeyBits > 16000) { + Usage(); + exit(MY_EX_USAGE); + } + #endif + break; + case 'b' : benchmark = atoi(myoptarg); if (benchmark < 0 || benchmark > 1000000) { @@ -570,6 +586,10 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args) if (fewerPackets) wolfSSL_CTX_set_group_messages(ctx); +#ifndef NO_DH + wolfSSL_CTX_SetMinDhKey_Sz(ctx, (word16)minDhKeyBits); +#endif + if (usePsk) { #ifndef NO_PSK wolfSSL_CTX_set_psk_client_callback(ctx, my_psk_client_cb); diff --git a/examples/server/server.c b/examples/server/server.c index 5ebfb7d38..a8d597a7e 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -131,6 +131,11 @@ static void Usage(void) printf("-c Certificate file, default %s\n", svrCert); printf("-k Key file, default %s\n", svrKey); printf("-A Certificate Authority file, default %s\n", cliCert); +#ifndef NO_DH + printf("-D Diffie-Hellman Params file, default %s\n", dhParam); + printf("-Z Minimum DH key bits, default %d\n", + DEFAULT_MIN_DHKEY_BITS); +#endif printf("-d Disable client cert check\n"); printf("-b Bind to any interface instead of localhost only\n"); printf("-s Use pre Shared keys\n"); @@ -184,11 +189,13 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args) int serverReadyFile = 0; int wc_shutdown = 0; int resume = 0; /* do resume, and resume count */ + int minDhKeyBits = DEFAULT_MIN_DHKEY_BITS; int ret; char* cipherList = NULL; const char* verifyCert = cliCert; const char* ourCert = svrCert; const char* ourKey = svrKey; + const char* ourDhParam = dhParam; int argc = ((func_args*)args)->argc; char** argv = ((func_args*)args)->argv; @@ -213,15 +220,17 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args) (void)needDH; (void)ourKey; (void)ourCert; + (void)ourDhParam; (void)verifyCert; (void)useNtruKey; (void)doCliCertCheck; + (void)minDhKeyBits; #ifdef CYASSL_TIRTOS fdOpenSession(Task_self()); #endif - while ((ch = mygetopt(argc, argv, "?dbstnNufrRawPp:v:l:A:c:k:S:oO:")) + while ((ch = mygetopt(argc, argv, "?dbstnNufrRawPp:v:l:A:c:k:Z:S:oO:D:")) != -1) { switch (ch) { case '?' : @@ -310,6 +319,22 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args) ourKey = myoptarg; break; + case 'D' : + #ifndef NO_DH + ourDhParam = myoptarg; + #endif + break; + + case 'Z' : + #ifndef NO_DH + minDhKeyBits = atoi(myoptarg); + if (minDhKeyBits <= 0 || minDhKeyBits > 16000) { + Usage(); + exit(MY_EX_USAGE); + } + #endif + break; + case 'N': nonBlocking = 1; break; @@ -451,6 +476,10 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args) } #endif +#ifndef NO_DH + wolfSSL_CTX_SetMinDhKey_Sz(ctx, (word16)minDhKeyBits); +#endif + #ifdef HAVE_NTRU if (useNtruKey) { if (CyaSSL_CTX_use_NTRUPrivateKey_file(ctx, ourKey) @@ -579,7 +608,7 @@ while (1) { /* allow resume option */ SSL_set_fd(ssl, clientfd); if (usePsk == 0 || useAnon == 1 || cipherList != NULL || needDH == 1) { #if !defined(NO_FILESYSTEM) && !defined(NO_DH) && !defined(NO_ASN) - CyaSSL_SetTmpDH_file(ssl, dhParam, SSL_FILETYPE_PEM); + CyaSSL_SetTmpDH_file(ssl, ourDhParam, SSL_FILETYPE_PEM); #elif !defined(NO_DH) SetDH(ssl); /* repick suites with DHE, higher priority than PSK */ #endif diff --git a/src/internal.c b/src/internal.c index aa69f8310..217dec9b5 100644 --- a/src/internal.c +++ b/src/internal.c @@ -372,6 +372,10 @@ int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method) return BAD_MUTEX_E; } +#ifndef NO_DH + ctx->minDhKeySz = MIN_DHKEY_SZ; +#endif + #ifdef HAVE_ECC ctx->eccTempKeySz = ECDHE_SIZE; #endif @@ -1537,6 +1541,10 @@ int InitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx) ssl->options.handShakeState = NULL_STATE; ssl->options.processReply = doProcessInit; +#ifndef NO_DH + ssl->options.minDhKeySz = ctx->minDhKeySz; +#endif + #ifdef WOLFSSL_DTLS ssl->dtls_timeout_init = DTLS_TIMEOUT_INIT; ssl->dtls_timeout_max = DTLS_TIMEOUT_MAX; @@ -8024,6 +8032,9 @@ const char* wolfSSL_ERR_reason_error_string(unsigned long e) case BAD_TICKET_ENCRYPT: return "Bad user ticket callback encrypt Error"; + case DH_KEY_SIZE_E: + return "DH key too small Error"; + default : return "unknown error number"; } @@ -9755,6 +9766,12 @@ static void PickHashSigAlgo(WOLFSSL* ssl, if ((*inOutIdx - begin) + length > size) return BUFFER_ERROR; + if (length < ssl->options.minDhKeySz) { + WOLFSSL_MSG("Server using a DH key that is too small"); + SendAlert(ssl, alert_fatal, handshake_failure); + return DH_KEY_SIZE_E; + } + ssl->buffers.serverDH_P.buffer = (byte*) XMALLOC(length, ssl->heap, DYNAMIC_TYPE_DH); @@ -9766,6 +9783,8 @@ static void PickHashSigAlgo(WOLFSSL* ssl, XMEMCPY(ssl->buffers.serverDH_P.buffer, input + *inOutIdx, length); *inOutIdx += length; + ssl->options.dhKeySz = length; + /* g */ if ((*inOutIdx - begin) + OPAQUE16_LEN > size) return BUFFER_ERROR; @@ -9885,6 +9904,12 @@ static void PickHashSigAlgo(WOLFSSL* ssl, if ((*inOutIdx - begin) + length > size) return BUFFER_ERROR; + if (length < ssl->options.minDhKeySz) { + WOLFSSL_MSG("Server using a DH key that is too small"); + SendAlert(ssl, alert_fatal, handshake_failure); + return DH_KEY_SIZE_E; + } + ssl->buffers.serverDH_P.buffer = (byte*) XMALLOC(length, ssl->heap, DYNAMIC_TYPE_DH); @@ -9896,6 +9921,8 @@ static void PickHashSigAlgo(WOLFSSL* ssl, XMEMCPY(ssl->buffers.serverDH_P.buffer, input + *inOutIdx, length); *inOutIdx += length; + ssl->options.dhKeySz = length; + /* g */ if ((*inOutIdx - begin) + OPAQUE16_LEN > size) return BUFFER_ERROR; diff --git a/src/ssl.c b/src/ssl.c index 258b91db6..7342e81a4 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -438,6 +438,9 @@ int wolfSSL_SetTmpDH(WOLFSSL* ssl, const unsigned char* p, int pSz, WOLFSSL_ENTER("wolfSSL_SetTmpDH"); if (ssl == NULL || p == NULL || g == NULL) return BAD_FUNC_ARG; + if (pSz < ssl->options.minDhKeySz) + return DH_KEY_SIZE_E; + if (ssl->options.side != WOLFSSL_SERVER_END) return SIDE_ERROR; @@ -487,6 +490,9 @@ int wolfSSL_CTX_SetTmpDH(WOLFSSL_CTX* ctx, const unsigned char* p, int pSz, WOLFSSL_ENTER("wolfSSL_CTX_SetTmpDH"); if (ctx == NULL || p == NULL || g == NULL) return BAD_FUNC_ARG; + if (pSz < ctx->minDhKeySz) + return DH_KEY_SIZE_E; + XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_DH); XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_DH); @@ -3894,6 +3900,35 @@ int wolfSSL_CTX_SetTmpDH_file(WOLFSSL_CTX* ctx, const char* fname, int format) } +int wolfSSL_CTX_SetMinDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz) +{ + if (ctx == NULL || keySz > 16000 || keySz % 8 != 0) + return BAD_FUNC_ARG; + + ctx->minDhKeySz = keySz / 8; + return SSL_SUCCESS; +} + + +int wolfSSL_SetMinDhKey_Sz(WOLFSSL* ssl, word16 keySz) +{ + if (ssl == NULL || keySz > 16000 || keySz % 8 != 0) + return BAD_FUNC_ARG; + + ssl->options.minDhKeySz = keySz / 8; + return SSL_SUCCESS; +} + + +int wolfSSL_GetDhKey_Sz(WOLFSSL* ssl) +{ + if (ssl == NULL) + return BAD_FUNC_ARG; + + return (ssl->options.dhKeySz * 8); +} + + #endif /* NO_DH */ diff --git a/wolfssl/error-ssl.h b/wolfssl/error-ssl.h index d9dc80dc0..f151c3fb5 100644 --- a/wolfssl/error-ssl.h +++ b/wolfssl/error-ssl.h @@ -133,6 +133,8 @@ enum wolfSSL_ErrorCodes { BAD_TICKET_MSG_SZ = -399, /* Bad session ticket msg size */ BAD_TICKET_ENCRYPT = -400, /* Bad user ticket encrypt */ + DH_KEY_SIZE_E = -401, /* DH Key too small */ + /* add strings to SetErrorString !!!!! */ /* begin negotiation parameter errors */ diff --git a/wolfssl/internal.h b/wolfssl/internal.h index edba235dc..d8e4da871 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -895,6 +895,20 @@ enum Misc { COPY = 1 /* should we copy static buffer for write */ }; + +#ifndef WOLFSSL_MIN_DHKEY_BITS + #ifdef WOLFSSL_MAX_STRENGTH + #define WOLFSSL_MIN_DHKEY_BITS 2048 + #else + #define WOLFSSL_MIN_DHKEY_BITS 1024 + #endif +#endif +#if (WOLFSSL_MIN_DHKEY_BITS % 8) + #error DH minimum bit size must be multiple of 8 +#endif +#define MIN_DHKEY_SZ (WOLFSSL_MIN_DHKEY_BITS / 8) + + #ifdef SESSION_INDEX /* Shift values for making a session index */ #define SESSIDX_ROW_SHIFT 4 @@ -1508,6 +1522,9 @@ struct WOLFSSL_CTX { byte quietShutdown; /* don't send close notify */ byte groupMessages; /* group handshake messages before sending */ byte minDowngrade; /* minimum downgrade version */ +#ifndef NO_DH + word16 minDhKeySz; /* minimum DH key size */ +#endif CallbackIORecv CBIORecv; CallbackIOSend CBIOSend; #ifdef WOLFSSL_DTLS @@ -1916,6 +1933,10 @@ typedef struct Options { byte minDowngrade; /* minimum downgrade version */ byte connectState; /* nonblocking resume */ byte acceptState; /* nonblocking resume */ +#ifndef NO_DH + word16 minDhKeySz; /* minimum DH key size */ + word16 dhKeySz; /* actual DH key size */ +#endif } Options; diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index aaa100db8..f50bf9eb4 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -901,6 +901,10 @@ WOLFSSL_API int wolfSSL_CTX_SetTmpDH_buffer(WOLFSSL_CTX*, const unsigned char* WOLFSSL_API int wolfSSL_CTX_SetTmpDH_file(WOLFSSL_CTX*, const char* f, int format); #endif + +WOLFSSL_API int wolfSSL_CTX_SetMinDhKey_Sz(WOLFSSL_CTX*, unsigned short); +WOLFSSL_API int wolfSSL_SetMinDhKey_Sz(WOLFSSL*, unsigned short); +WOLFSSL_API int wolfSSL_GetDhKey_Sz(WOLFSSL*); #endif /* NO_DH */ WOLFSSL_API int wolfSSL_SetTmpEC_DHE_Sz(WOLFSSL*, unsigned short); diff --git a/wolfssl/test.h b/wolfssl/test.h index 31d90f12b..1b1e444ba 100644 --- a/wolfssl/test.h +++ b/wolfssl/test.h @@ -154,6 +154,11 @@ #define CLIENT_DEFAULT_VERSION 3 #define CLIENT_DTLS_DEFAULT_VERSION (-2) #define CLIENT_INVALID_VERSION (-99) +#if !defined(NO_FILESYSTEM) && defined(WOLFSSL_MAX_STRENGTH) + #define DEFAULT_MIN_DHKEY_BITS 2048 +#else + #define DEFAULT_MIN_DHKEY_BITS 1024 +#endif /* all certs relative to wolfSSL home directory now */ #define caCert "./certs/ca-cert.pem" From 8fbcd7d74b52768f680fdbe2b74ede25be0f73de Mon Sep 17 00:00:00 2001 From: John Safranek Date: Thu, 21 May 2015 10:30:54 -0700 Subject: [PATCH 096/350] added upper bound check on DH min bit size for configure forced default --- wolfssl/internal.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/wolfssl/internal.h b/wolfssl/internal.h index d8e4da871..d4dc91247 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -906,6 +906,9 @@ enum Misc { #if (WOLFSSL_MIN_DHKEY_BITS % 8) #error DH minimum bit size must be multiple of 8 #endif +#if (WOLFSSL_MIN_DHKEY_BITS > 16000) + #error DH minimum bit size must not be greater than 16000 +#endif #define MIN_DHKEY_SZ (WOLFSSL_MIN_DHKEY_BITS / 8) From aaa1fe813a8ce8f9ebcbf55ef719d462672a6d80 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Fri, 22 May 2015 09:55:49 +0900 Subject: [PATCH 097/350] Added aes.c/des3.c --- wolfcrypt/benchmark/benchmark.c | 6 ++--- wolfcrypt/src/aes.c | 40 ++++++++++++++++++++++++++------- wolfcrypt/src/des3.c | 3 +++ wolfssl/wolfcrypt/aes.h | 3 +++ 4 files changed, 41 insertions(+), 11 deletions(-) diff --git a/wolfcrypt/benchmark/benchmark.c b/wolfcrypt/benchmark/benchmark.c index 9c27980e7..bd5fd27f5 100644 --- a/wolfcrypt/benchmark/benchmark.c +++ b/wolfcrypt/benchmark/benchmark.c @@ -1846,9 +1846,9 @@ void bench_ed25519KeySign(void) return ( ns / CLOCK * 2.0); } -#elif defined(WOLFSSL_IAR_ARM) || defined (WOLFSSL_MDK_ARM) - #warning "Write your current_time()" - double current_time(int reset) { return 0.0 ; } +#elif defined(WOLFSSL_IAR_ARM_TIME) || defined (WOLFSSL_MDK_ARM) + extern double current_time(int reset); + #elif defined FREERTOS diff --git a/wolfcrypt/src/aes.c b/wolfcrypt/src/aes.c index 896ee147d..9e80e9839 100644 --- a/wolfcrypt/src/aes.c +++ b/wolfcrypt/src/aes.c @@ -230,6 +230,10 @@ void wc_AesFreeCavium(Aes* aes) word32 length); static int wc_AesCaviumCbcDecrypt(Aes* aes, byte* out, const byte* in, word32 length); +#elif defined(WOLFSSL_TI_CRYPT) + + /* defined in port/ti_aes.c */ + #else /* using CTaoCrypt software AES implementation */ #define NEED_AES_TABLES @@ -1505,6 +1509,11 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock) { return wc_AesSetKey(aes, userKey, keylen, iv, dir); } + +#elif defined(WOLFSSL_TI_CRYPT) + + /* defined in port/ti_md5.c */ + #else static int wc_AesSetKeyLocal(Aes* aes, const byte* userKey, word32 keylen, const byte* iv, int dir) @@ -1775,17 +1784,21 @@ int wc_AesCbcDecryptWithKey(byte* out, const byte* in, word32 inSz, #elif defined(WOLFSSL_PIC32MZ_CRYPT) #error "PIC32MZ doesn't yet support AES direct" + #elif defined(WOLFSSL_TI_CRYPT) + + /* defined in port/ti_aes.c */ + #else /* Allow direct access to one block encrypt */ void wc_AesEncryptDirect(Aes* aes, byte* out, const byte* in) { - return wc_AesEncrypt(aes, in, out); + wc_AesEncrypt(aes, in, out); } /* Allow direct access to one block decrypt */ void wc_AesDecryptDirect(Aes* aes, byte* out, const byte* in) { - return wc_AesDecrypt(aes, in, out); + wc_AesDecrypt(aes, in, out); } #endif /* FREESCALE_MMCAU, AES direct block */ @@ -2309,6 +2322,10 @@ int wc_AesCbcDecryptWithKey(byte* out, const byte* in, word32 inSz, return 0 ; } +#elif defined(WOLFSSL_TI_CRYPT) + + /* defined in port/ti_aes.c */ + #else int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) { @@ -2589,7 +2606,10 @@ int wc_AesCbcDecryptWithKey(byte* out, const byte* in, word32 inSz, #elif defined(FREESCALE_MMCAU) #error "Freescale mmCAU doesn't currently support AES-CTR mode" - + + #elif defined(WOLFSSL_TI_CRYPT) + /* defined in port/ti/ti_aes.c */ + #else /* Increment AES counter */ static INLINE void IncrementAesCounter(byte* inOutCtr) @@ -2671,7 +2691,7 @@ enum { CTR_SZ = 4 }; - +#if !defined(WOLFSSL_TI_CRYPT) static INLINE void InitGcmCounter(byte* inOutCtr) { inOutCtr[AES_BLOCK_SIZE - 4] = 0; @@ -2776,6 +2796,10 @@ int wc_AesGcmSetKey(Aes* aes, const byte* key, word32 len) if (ret == 0) { #ifdef FREESCALE_MMCAU cau_aes_encrypt(iv, rk, aes->rounds, aes->H); + + #elif defined(WOLFSSL_TI_CRYPT) + /* defined in port/ti/ti_aes.c */ + #else wc_AesEncrypt(aes, iv, aes->H); #endif @@ -3289,8 +3313,7 @@ static void GHASH(Aes* aes, const byte* a, word32 aSz, } #endif /* end GCM_WORD32 */ - - + int wc_AesGcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, const byte* iv, word32 ivSz, byte* authTag, word32 authTagSz, @@ -3445,8 +3468,7 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, } return 0; } - - +#endif WOLFSSL_API int wc_GmacSetKey(Gmac* gmac, const byte* key, word32 len) { @@ -3478,6 +3500,7 @@ WOLFSSL_API int wc_GmacUpdate(Gmac* gmac, const byte* iv, word32 ivSz, #endif +#if !defined(WOLFSSL_TI_CRYPT) void wc_AesCcmSetKey(Aes* aes, const byte* key, word32 keySz) { byte nonce[AES_BLOCK_SIZE]; @@ -3758,6 +3781,7 @@ int wc_AesCcmDecrypt(Aes* aes, byte* out, const byte* in, word32 inSz, return result; } +#endif /* WOLFCRYPT_TI_CRYPT */ #endif /* HAVE_AESCCM */ diff --git a/wolfcrypt/src/des3.c b/wolfcrypt/src/des3.c index 5edb7f79e..62e0ef12c 100644 --- a/wolfcrypt/src/des3.c +++ b/wolfcrypt/src/des3.c @@ -944,6 +944,9 @@ int wc_Des3_SetIV(Des3* des, const byte* iv); return 0; } +#elif defined(WOLFSSL_TI_CRYPT) + /* defined in port/ti/ti-des3.c */ + #else /* CTaoCrypt software implementation */ /* permuted choice table (key) */ diff --git a/wolfssl/wolfcrypt/aes.h b/wolfssl/wolfcrypt/aes.h index 5b6ad6a83..a94ad0801 100644 --- a/wolfssl/wolfcrypt/aes.h +++ b/wolfssl/wolfcrypt/aes.h @@ -113,6 +113,9 @@ typedef struct Aes { word32 iv_ce [AES_BLOCK_SIZE /sizeof(word32)] ; int keylen ; #endif +#ifdef WOLFSSL_TI_CRYPT + int keylen ; +#endif } Aes; From 67a93a5999b305651076eadd7069bd1869a28eb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moise=CC=81s=20Guimara=CC=83es?= Date: Fri, 22 May 2015 20:05:40 -0300 Subject: [PATCH 098/350] fixes trailing white spaces. adds port mapping in Vagrantfile. --- Vagrantfile | 2 ++ src/internal.c | 2 +- src/tls.c | 46 +++++++++++++++++++++++----------------------- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/Vagrantfile b/Vagrantfile index 58d4212c3..aef42caf7 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -45,4 +45,6 @@ VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.box = "hashicorp/precise64" config.vm.provision "shell", inline: $setup + config.vm.network "forwarded_port", guest: 11111, host: 33333 + end diff --git a/src/internal.c b/src/internal.c index 217dec9b5..d69cc114b 100644 --- a/src/internal.c +++ b/src/internal.c @@ -3669,7 +3669,7 @@ static int MatchDomainName(const char* pattern, int len, const char* str) break; if (p == '*') { - while (--len > 0 && + while (--len > 0 && (p = (char)XTOLOWER((unsigned char)*pattern++)) == '*') ; diff --git a/src/tls.c b/src/tls.c index ca94c5b71..754037bc3 100644 --- a/src/tls.c +++ b/src/tls.c @@ -72,7 +72,7 @@ static int p_hash(byte* result, word32 resLen, const byte* secret, #ifdef WOLFSSL_SMALL_STACK byte* previous; byte* current; - Hmac* hmac; + Hmac* hmac; #else byte previous[P_HASH_MAX_SIZE]; /* max size */ byte current[P_HASH_MAX_SIZE]; /* max size */ @@ -147,7 +147,7 @@ static int p_hash(byte* result, word32 resLen, const byte* secret, break; if ((i == lastTime) && lastLen) - XMEMCPY(&result[idx], current, + XMEMCPY(&result[idx], current, min(lastLen, P_HASH_MAX_SIZE)); else { XMEMCPY(&result[idx], current, len); @@ -187,7 +187,7 @@ static INLINE void get_xor(byte *digest, word32 digLen, byte* md5, byte* sha) { word32 i; - for (i = 0; i < digLen; i++) + for (i = 0; i < digLen; i++) digest[i] = md5[i] ^ sha[i]; } @@ -288,7 +288,7 @@ static int PRF(byte* digest, word32 digLen, const byte* secret, word32 secLen, if (labLen + seedLen > MAX_PRF_LABSEED) return BUFFER_E; - + #ifdef WOLFSSL_SMALL_STACK labelSeed = (byte*)XMALLOC(MAX_PRF_LABSEED, NULL, DYNAMIC_TYPE_TMP_BUFFER); @@ -430,7 +430,7 @@ int wolfSSL_DeriveTlsKeys(byte* key_data, word32 keyLen, int DeriveTlsKeys(WOLFSSL* ssl) { int ret; - int length = 2 * ssl->specs.hash_size + + int length = 2 * ssl->specs.hash_size + 2 * ssl->specs.key_size + 2 * ssl->specs.iv_size; #ifdef WOLFSSL_SMALL_STACK @@ -586,9 +586,9 @@ static INLINE word32 GetSEQIncrement(WOLFSSL* ssl, int verify) } #endif if (verify) - return ssl->keys.peer_sequence_number++; + return ssl->keys.peer_sequence_number++; else - return ssl->keys.sequence_number++; + return ssl->keys.sequence_number++; } @@ -640,10 +640,10 @@ int wolfSSL_GetHmacType(WOLFSSL* ssl) return SHA; } #endif - #ifdef HAVE_BLAKE2 + #ifdef HAVE_BLAKE2 case blake2b_mac: { - return BLAKE2B_ID; + return BLAKE2B_ID; } #endif default: @@ -667,7 +667,7 @@ int wolfSSL_SetTlsHmacInner(WOLFSSL* ssl, byte* inner, word32 sz, int content, c16toa((word16)GetEpoch(ssl, verify), inner); #endif c32toa(GetSEQIncrement(ssl, verify), &inner[sizeof(word32)]); - inner[SEQ_SZ] = (byte)content; + inner[SEQ_SZ] = (byte)content; inner[SEQ_SZ + ENUM_LEN] = ssl->version.major; inner[SEQ_SZ + ENUM_LEN + ENUM_LEN] = ssl->version.minor; c16toa((word16)sz, inner + SEQ_SZ + ENUM_LEN + VERSION_SZ); @@ -686,7 +686,7 @@ int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, if (ssl == NULL) return BAD_FUNC_ARG; - + #ifdef HAVE_FUZZER if (ssl->fuzzerCb) ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx); @@ -735,7 +735,7 @@ static INLINE word16 TLSX_ToSemaphore(word16 type) WOLFSSL_MSG("### TLSX semaphore colision or overflow detected!"); } } - + return type; } @@ -1044,7 +1044,7 @@ int TLSX_UseSNI(TLSX** extensions, byte type, const void* data, word16 size) return ret; if (!extension) { - if ((ret = TLSX_Push(extensions, SERVER_NAME_INDICATION, (void*)sni)) + if ((ret = TLSX_Push(extensions, SERVER_NAME_INDICATION, (void*)sni)) != 0) { TLSX_SNI_Free(sni); return ret; @@ -1053,7 +1053,7 @@ int TLSX_UseSNI(TLSX** extensions, byte type, const void* data, word16 size) else { /* push new SNI object to extension data. */ sni->next = (SNI*)extension->data; - extension->data = (void*)sni; + extension->data = (void*)sni; /* look for another server name of the same type to remove */ do { @@ -1626,7 +1626,7 @@ int TLSX_UseSupportedCurve(TLSX** extensions, word16 name) break; } - } while ((curve = curve->next)); + } while ((curve = curve->next)); } return SSL_SUCCESS; @@ -1680,7 +1680,7 @@ static byte TLSX_SecureRenegotiation_GetSize(SecureRenegotiation* data, static word16 TLSX_SecureRenegotiation_Write(SecureRenegotiation* data, byte* output, int isRequest) -{ +{ word16 offset = OPAQUE8_LEN; /* RenegotiationInfo length */ if (data->enabled) { @@ -1696,11 +1696,11 @@ static word16 TLSX_SecureRenegotiation_Write(SecureRenegotiation* data, } output[0] = offset - 1; /* info length - self */ - + return offset; -} - -static int TLSX_SecureRenegotiation_Parse(WOLFSSL* ssl, byte* input, +} + +static int TLSX_SecureRenegotiation_Parse(WOLFSSL* ssl, byte* input, word16 length, byte isRequest) { int ret = SECURE_RENEGOTIATION_E; @@ -1726,7 +1726,7 @@ static int TLSX_SecureRenegotiation_Parse(WOLFSSL* ssl, byte* input, if (!ssl->secure_renegotiation->enabled) { if (*input == 0) { ssl->secure_renegotiation->enabled = 1; - ret = 0; + ret = 0; } } else if (*input == 2 * TLS_FINISHED_SZ) { @@ -1749,7 +1749,7 @@ int TLSX_UseSecureRenegotiation(TLSX** extensions) { int ret = 0; SecureRenegotiation* data = NULL; - + data = (SecureRenegotiation*)XMALLOC(sizeof(SecureRenegotiation), NULL, DYNAMIC_TYPE_TLSX); if (data == NULL) @@ -2362,7 +2362,7 @@ int TLSX_Parse(WOLFSSL* ssl, byte* input, word16 length, byte isRequest, #endif #ifndef NO_OLD_TLS method->downgrade = 1; -#endif +#endif } return method; } From 559404137e8bcb2bcad712b786f585d9299b2579 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Wed, 27 May 2015 18:37:19 +0900 Subject: [PATCH 099/350] moving xxxGetHash to hash.c --- wolfcrypt/benchmark/benchmark.c | 3 +- wolfcrypt/src/hash.c | 66 +++++++++++++++++++++++++++++++++ wolfcrypt/src/md5.c | 6 --- wolfcrypt/src/sha.c | 9 ----- wolfcrypt/src/sha256.c | 9 ----- 5 files changed, 67 insertions(+), 26 deletions(-) create mode 100644 wolfcrypt/src/hash.c diff --git a/wolfcrypt/benchmark/benchmark.c b/wolfcrypt/benchmark/benchmark.c index bd5fd27f5..838a80e34 100644 --- a/wolfcrypt/benchmark/benchmark.c +++ b/wolfcrypt/benchmark/benchmark.c @@ -1846,9 +1846,8 @@ void bench_ed25519KeySign(void) return ( ns / CLOCK * 2.0); } -#elif defined(WOLFSSL_IAR_ARM_TIME) || defined (WOLFSSL_MDK_ARM) +#elif defined(WOLFSSL_IAR_ARM_TIME) || defined (WOLFSSL_MDK_ARM) || defined(WOLFSSL_USER_TIME) extern double current_time(int reset); - #elif defined FREERTOS diff --git a/wolfcrypt/src/hash.c b/wolfcrypt/src/hash.c new file mode 100644 index 000000000..7a6e51f3b --- /dev/null +++ b/wolfcrypt/src/hash.c @@ -0,0 +1,66 @@ +/* hash.c + * + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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. + * + * wolfSSL 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 + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#if !defined(NO_MD5) && !defined(WOLFSSL_TI_HASH) + +#include +void wc_Md5GetHash(Md5* md5, byte* hash) +{ + Md5 save = *md5 ; + wc_Md5Final(md5, hash) ; + *md5 = save ; +} +#endif + +#if !defined(NO_SHA) && !defined(WOLFSSL_TI_HASH) + +#include + +int wc_ShaGetHash(Sha* sha, byte* hash) +{ + int ret ; + Sha save = *sha ; + ret = wc_ShaFinal(sha, hash) ; + *sha = save ; + return ret ; +} +#endif + +#if !defined(NO_SHA256) && !defined(WOLFSSL_TI_HASH) + +#include + +int wc_Sha256GetHash(Sha256* sha256, byte* hash) +{ + int ret ; + Sha256 save = *sha256 ; + ret = wc_Sha256Final(sha256, hash) ; + *sha256 = save ; + return ret ; +} + +#endif diff --git a/wolfcrypt/src/md5.c b/wolfcrypt/src/md5.c index d5bb17b63..db1e21f87 100644 --- a/wolfcrypt/src/md5.c +++ b/wolfcrypt/src/md5.c @@ -392,10 +392,4 @@ int wc_Md5Hash(const byte* data, word32 len, byte* hash) return 0; } -void wc_Md5GetHash(Md5* md5, byte* hash) -{ - Md5 save = *md5 ; - wc_Md5Final(md5, hash) ; - *md5 = save ; -} #endif /* NO_MD5 */ diff --git a/wolfcrypt/src/sha.c b/wolfcrypt/src/sha.c index 78f2640f0..f67f88ddc 100644 --- a/wolfcrypt/src/sha.c +++ b/wolfcrypt/src/sha.c @@ -452,15 +452,6 @@ int wc_ShaHash(const byte* data, word32 len, byte* hash) } -int wc_ShaGetHash(Sha* sha, byte* hash) -{ - int ret ; - Sha save = *sha ; - ret = wc_ShaFinal(sha, hash) ; - *sha = save ; - return ret ; -} - #endif /* HAVE_FIPS */ #endif /* NO_SHA */ diff --git a/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c index a204637f4..7342d836f 100644 --- a/wolfcrypt/src/sha256.c +++ b/wolfcrypt/src/sha256.c @@ -576,15 +576,6 @@ int wc_Sha256Hash(const byte* data, word32 len, byte* hash) return ret; } -int wc_Sha256GetHash(Sha256* sha256, byte* hash) -{ - int ret ; - Sha256 save = *sha256 ; - ret = wc_Sha256Final(sha256, hash) ; - *sha256 = save ; - return ret ; -} - #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) #define _DigestToReg(S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7 )\ From 902799ef755270bb992aa645c7514cb35fae6e66 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Wed, 27 May 2015 19:34:11 +0900 Subject: [PATCH 100/350] adding ti hash/crypt to include.am --- src/include.am | 6 +++--- wolfcrypt/src/include.am | 8 ++++++++ wolfssl/wolfcrypt/include.am | 4 +++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/include.am b/src/include.am index f65331b4c..161a9cd91 100644 --- a/src/include.am +++ b/src/include.am @@ -49,7 +49,8 @@ endif src_libwolfssl_la_SOURCES += \ wolfcrypt/src/hmac.c \ wolfcrypt/src/random.c \ - wolfcrypt/src/sha256.c + wolfcrypt/src/sha256.c \ + wolfcrypt/src/hash.c if BUILD_RSA src_libwolfssl_la_SOURCES += wolfcrypt/src/rsa.c @@ -74,8 +75,7 @@ endif src_libwolfssl_la_SOURCES += \ wolfcrypt/src/logging.c \ wolfcrypt/src/wc_port.c \ - wolfcrypt/src/error.c\ - wolfcrypt/src/port/ti/ti-hash.c + wolfcrypt/src/error.c if BUILD_MEMORY src_libwolfssl_la_SOURCES += wolfcrypt/src/memory.c diff --git a/wolfcrypt/src/include.am b/wolfcrypt/src/include.am index a6e815427..299921579 100644 --- a/wolfcrypt/src/include.am +++ b/wolfcrypt/src/include.am @@ -38,3 +38,11 @@ EXTRA_DIST += \ wolfcrypt/src/fp_sqr_comba_8.i \ wolfcrypt/src/fp_sqr_comba_9.i \ wolfcrypt/src/fp_sqr_comba_small_set.i + +EXTRA_DIST += wolfcrypt/src/port/ti/ti-aes.c \ + wolfcrypt/src/port/ti/ti-des3.c \ + wolfcrypt/src/port/ti/ti-hash.c \ + wolfcrypt/src/port/ti/ti-ccm.c \ + wolfcrypt/src/port/pic32/pic32mz-hash.c + + diff --git a/wolfssl/wolfcrypt/include.am b/wolfssl/wolfcrypt/include.am index 2603f117c..26a7759b3 100644 --- a/wolfssl/wolfcrypt/include.am +++ b/wolfssl/wolfcrypt/include.am @@ -52,5 +52,7 @@ nobase_include_HEADERS+= \ wolfssl/wolfcrypt/mpi_superclass.h noinst_HEADERS+= \ - wolfssl/wolfcrypt/port/pic32/pic32mz-crypt.h + wolfssl/wolfcrypt/port/pic32/pic32mz-crypt.h \ + wolfssl/wolfcrypt/port/ti/ti-hash.h \ + wolfssl/wolfcrypt/port/ti/ti-ccm.h From d67168d53928e32f8c532e5b8986e01ce87fd093 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Thu, 28 May 2015 20:40:53 +0900 Subject: [PATCH 101/350] aes.c cleaned. ti-has.c, ti-aes.c, ti-des3.c are included in each respective algorithm source file. --- wolfcrypt/src/aes.c | 43 ++++++++++----------------------- wolfcrypt/src/des3.c | 9 ++++--- wolfcrypt/src/md5.c | 13 ++++++---- wolfcrypt/src/port/ti/ti-hash.c | 8 +++--- wolfcrypt/src/sha.c | 12 +++++---- wolfcrypt/src/sha256.c | 13 +++++++--- wolfcrypt/src/wc_port.c | 5 +++- wolfssl/internal.h | 2 ++ wolfssl/wolfcrypt/hash.h | 35 +++++++++++++++++++++++++++ wolfssl/wolfcrypt/md5.h | 6 ----- wolfssl/wolfcrypt/sha.h | 1 - wolfssl/wolfcrypt/sha256.h | 1 - 12 files changed, 88 insertions(+), 60 deletions(-) create mode 100644 wolfssl/wolfcrypt/hash.h diff --git a/wolfcrypt/src/aes.c b/wolfcrypt/src/aes.c index 9e80e9839..85f01a0d1 100644 --- a/wolfcrypt/src/aes.c +++ b/wolfcrypt/src/aes.c @@ -174,6 +174,11 @@ void wc_AesFreeCavium(Aes* aes) } #endif #else /* HAVE_FIPS */ + +#ifdef WOLFSSL_TI_CRYPT +#include +#else + #include #include #ifdef NO_INLINE @@ -230,10 +235,6 @@ void wc_AesFreeCavium(Aes* aes) word32 length); static int wc_AesCaviumCbcDecrypt(Aes* aes, byte* out, const byte* in, word32 length); -#elif defined(WOLFSSL_TI_CRYPT) - - /* defined in port/ti_aes.c */ - #else /* using CTaoCrypt software AES implementation */ #define NEED_AES_TABLES @@ -1509,11 +1510,6 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock) { return wc_AesSetKey(aes, userKey, keylen, iv, dir); } - -#elif defined(WOLFSSL_TI_CRYPT) - - /* defined in port/ti_md5.c */ - #else static int wc_AesSetKeyLocal(Aes* aes, const byte* userKey, word32 keylen, const byte* iv, int dir) @@ -1784,10 +1780,6 @@ int wc_AesCbcDecryptWithKey(byte* out, const byte* in, word32 inSz, #elif defined(WOLFSSL_PIC32MZ_CRYPT) #error "PIC32MZ doesn't yet support AES direct" - #elif defined(WOLFSSL_TI_CRYPT) - - /* defined in port/ti_aes.c */ - #else /* Allow direct access to one block encrypt */ void wc_AesEncryptDirect(Aes* aes, byte* out, const byte* in) @@ -2322,10 +2314,6 @@ int wc_AesCbcDecryptWithKey(byte* out, const byte* in, word32 inSz, return 0 ; } -#elif defined(WOLFSSL_TI_CRYPT) - - /* defined in port/ti_aes.c */ - #else int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) { @@ -2606,10 +2594,7 @@ int wc_AesCbcDecryptWithKey(byte* out, const byte* in, word32 inSz, #elif defined(FREESCALE_MMCAU) #error "Freescale mmCAU doesn't currently support AES-CTR mode" - - #elif defined(WOLFSSL_TI_CRYPT) - /* defined in port/ti/ti_aes.c */ - + #else /* Increment AES counter */ static INLINE void IncrementAesCounter(byte* inOutCtr) @@ -2691,7 +2676,7 @@ enum { CTR_SZ = 4 }; -#if !defined(WOLFSSL_TI_CRYPT) + static INLINE void InitGcmCounter(byte* inOutCtr) { inOutCtr[AES_BLOCK_SIZE - 4] = 0; @@ -2796,10 +2781,6 @@ int wc_AesGcmSetKey(Aes* aes, const byte* key, word32 len) if (ret == 0) { #ifdef FREESCALE_MMCAU cau_aes_encrypt(iv, rk, aes->rounds, aes->H); - - #elif defined(WOLFSSL_TI_CRYPT) - /* defined in port/ti/ti_aes.c */ - #else wc_AesEncrypt(aes, iv, aes->H); #endif @@ -3313,7 +3294,8 @@ static void GHASH(Aes* aes, const byte* a, word32 aSz, } #endif /* end GCM_WORD32 */ - + + int wc_AesGcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, const byte* iv, word32 ivSz, byte* authTag, word32 authTagSz, @@ -3468,7 +3450,8 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, } return 0; } -#endif + + WOLFSSL_API int wc_GmacSetKey(Gmac* gmac, const byte* key, word32 len) { @@ -3500,7 +3483,6 @@ WOLFSSL_API int wc_GmacUpdate(Gmac* gmac, const byte* iv, word32 ivSz, #endif -#if !defined(WOLFSSL_TI_CRYPT) void wc_AesCcmSetKey(Aes* aes, const byte* key, word32 keySz) { byte nonce[AES_BLOCK_SIZE]; @@ -3781,7 +3763,6 @@ int wc_AesCcmDecrypt(Aes* aes, byte* out, const byte* in, word32 inSz, return result; } -#endif /* WOLFCRYPT_TI_CRYPT */ #endif /* HAVE_AESCCM */ @@ -3909,6 +3890,8 @@ static int AesCaviumCbcDecrypt(Aes* aes, byte* out, const byte* in, #endif /* HAVE_CAVIUM */ +#endif /* WOLFSSL_TI_CRYPT */ + #endif /* HAVE_FIPS */ #endif /* NO_AES */ diff --git a/wolfcrypt/src/des3.c b/wolfcrypt/src/des3.c index 62e0ef12c..f886ecdc7 100644 --- a/wolfcrypt/src/des3.c +++ b/wolfcrypt/src/des3.c @@ -129,6 +129,11 @@ void wc_Des3_FreeCavium(Des3* des3) #endif /* HAVE_CAVIUM */ #else /* build without fips */ + +#if defined(WOLFSSL_TI_CRYPT) + #include +#else + #include #include @@ -943,9 +948,6 @@ int wc_Des3_SetIV(Des3* des, const byte* iv); PIC32_DECRYPTION, PIC32_ALGO_TDES, PIC32_CRYPTOALGO_TCBC); return 0; } - -#elif defined(WOLFSSL_TI_CRYPT) - /* defined in port/ti/ti-des3.c */ #else /* CTaoCrypt software implementation */ @@ -1671,5 +1673,6 @@ static int wc_Des3_CaviumCbcDecrypt(Des3* des3, byte* out, const byte* in, } #endif /* HAVE_CAVIUM */ +#endif /* WOLFSSL_TI_CRYPT */ #endif /* HAVE_FIPS */ #endif /* NO_DES3 */ diff --git a/wolfcrypt/src/md5.c b/wolfcrypt/src/md5.c index db1e21f87..02a24ec15 100644 --- a/wolfcrypt/src/md5.c +++ b/wolfcrypt/src/md5.c @@ -26,7 +26,12 @@ #include -#if !defined(NO_MD5) && !defined(WOLFSSL_TI_HASH) +#if !defined(NO_MD5) + +#if defined(WOLFSSL_TI_HASH) + #define WOLFSSL_TI_MD5 + #include +#else #ifdef WOLFSSL_PIC32MZ_HASH #define wc_InitMd5 wc_InitMd5_sw @@ -164,10 +169,6 @@ wc_InitMd5(md5); /* reset state */ } -#elif defined(WOLFSSL_IT_HASH) - - /* defined in port/ti_hash.c */ - #else /* CTaoCrypt software implementation */ #ifndef WOLFSSL_HAVE_MIN @@ -392,4 +393,6 @@ int wc_Md5Hash(const byte* data, word32 len, byte* hash) return 0; } +#endif /* WOLFSSL_TI_HASH */ + #endif /* NO_MD5 */ diff --git a/wolfcrypt/src/port/ti/ti-hash.c b/wolfcrypt/src/port/ti/ti-hash.c index 4b7f49a20..f2885298f 100644 --- a/wolfcrypt/src/port/ti/ti-hash.c +++ b/wolfcrypt/src/port/ti/ti-hash.c @@ -144,7 +144,7 @@ static int hashHash(const byte* data, word32 len, byte* hash, word32 algo, word3 return ret; } -#if !defined(NO_MD5) +#if !defined(NO_MD5) && defined(WOLFSSL_TI_MD5) WOLFSSL_API void wc_InitMd5(Md5* md5) { if (md5 == NULL) @@ -175,7 +175,7 @@ WOLFSSL_API int wc_Md5Hash(const byte*data, word32 len, byte*hash) #endif /* NO_MD5 */ -#if !defined(NO_SHA) +#if !defined(NO_SHA) && defined(WOLFSSL_TI_SHA) WOLFSSL_API int wc_InitSha(Sha* sha) { if (sha == NULL) @@ -206,7 +206,7 @@ WOLFSSL_API int wc_ShaHash(const byte*data, word32 len, byte*hash) #endif /* NO_SHA */ -#if defined(HAVE_SHA224) +#if defined(HAVE_SHA224) && defined(WOLFSSL_TI_SHA224) WOLFSSL_API int wc_InitSha224(Sha224* sha224) { if (sha224 == NULL) @@ -237,7 +237,7 @@ WOLFSSL_API int wc_Sha224Hash(const byte* data, word32 len, byte*hash) #endif /* HAVE_SHA224 */ -#if !defined(NO_SHA256) +#if !defined(NO_SHA256) && defined(WOLFSSL_TI_SHA256) WOLFSSL_API int wc_InitSha256(Sha256* sha256) { if (sha256 == NULL) diff --git a/wolfcrypt/src/sha.c b/wolfcrypt/src/sha.c index f67f88ddc..f710603cb 100644 --- a/wolfcrypt/src/sha.c +++ b/wolfcrypt/src/sha.c @@ -26,7 +26,7 @@ #include -#if !defined(NO_SHA) && !defined(WOLFSSL_TI_HASH) +#if !defined(NO_SHA) #include #include @@ -64,6 +64,11 @@ #else /* else build without fips */ +#if defined(WOLFSSL_TI_HASH) + #define WOLFSSL_TI_SHA + #include +#else + #ifdef WOLFSSL_PIC32MZ_HASH #define wc_InitSha wc_InitSha_sw #define wc_ShaUpdate wc_ShaUpdate_sw @@ -196,10 +201,6 @@ int wc_ShaFinal(Sha* sha, byte* hash) return wc_InitSha(sha); /* reset state */ } -#elif defined(WOLFSSL_TI_HASH) - - /* defined in port/ti/ti_hash.c */ - #else /* wc_ software implementation */ #ifndef WOLFSSL_HAVE_MIN @@ -453,5 +454,6 @@ int wc_ShaHash(const byte* data, word32 len, byte* hash) } #endif /* HAVE_FIPS */ +#endif /* WOLFSSL_TI_HASH */ #endif /* NO_SHA */ diff --git a/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c index 7342d836f..bc40798de 100644 --- a/wolfcrypt/src/sha256.c +++ b/wolfcrypt/src/sha256.c @@ -56,8 +56,13 @@ int wc_Sha256Hash(const byte* data, word32 len, byte* out) #else /* else build without fips */ -#if !defined(NO_SHA256) && !defined(WOLFSSL_TI_HASH) - /* defined in port/ti/ti_hash.c */ +#if !defined(NO_SHA256) && defined(WOLFSSL_TI_HASH) + #define WOLFSSL_TI_SHA256 + #ifdef HAVE_SHA224 + #define WOLFSSL_TI_SHA224 + #endif + #include +#else #if !defined (ALIGN32) #if defined (__GNUC__) @@ -1757,9 +1762,9 @@ static int Transform_AVX2(Sha256* sha256) #endif /* HAVE_INTEL_AVX2 */ -#endif /* WOLFSSL_TI_HAHS */ - #endif /* HAVE_FIPS */ +#endif /* WOLFSSL_TI_HAHS */ + #endif /* NO_SHA256 */ diff --git a/wolfcrypt/src/wc_port.c b/wolfcrypt/src/wc_port.c index 864ac2490..953a16be4 100644 --- a/wolfcrypt/src/wc_port.c +++ b/wolfcrypt/src/wc_port.c @@ -649,4 +649,7 @@ int UnLockMutex(wolfSSL_Mutex *m) #endif /* USE_WINDOWS_API */ #endif /* SINGLE_THREADED */ - + +#if defined(WOLFSSL_TI_CRYPT) || defined(WOLFSSL_TI_HASH) + #include /* initialize and Mutex for TI Crypt Engine */ +#endif diff --git a/wolfssl/internal.h b/wolfssl/internal.h index edba235dc..854ea57fb 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -88,6 +88,8 @@ #include #endif +#include + #ifdef WOLFSSL_CALLBACKS #include #include diff --git a/wolfssl/wolfcrypt/hash.h b/wolfssl/wolfcrypt/hash.h new file mode 100644 index 000000000..bbc2d8b95 --- /dev/null +++ b/wolfssl/wolfcrypt/hash.h @@ -0,0 +1,35 @@ +/* hash.h + * + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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. + * + * wolfSSL 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 + */ + +#ifndef WOLF_CRYPT_HASH_H +#define WOLF_CRYPT_HASH_H + +#ifndef NO_MD5 +WOLFSSL_API void wc_Md5GetHash(Md5*, byte*); +#endif +#ifndef NO_SHA +WOLFSSL_API int wc_ShaGetHash(Sha*, byte*); +#endif +#ifndef NO_SHA256 +WOLFSSL_API int wc_Sha256GetHash(Sha256*, byte*); +#endif + +#endif diff --git a/wolfssl/wolfcrypt/md5.h b/wolfssl/wolfcrypt/md5.h index b1f775c4c..d0b134b6a 100644 --- a/wolfssl/wolfcrypt/md5.h +++ b/wolfssl/wolfcrypt/md5.h @@ -52,11 +52,6 @@ enum { #include "port/pic32/pic32mz-crypt.h" #endif -#ifdef TI_HASH_TEST -#include "wolfssl/wolfcrypt/port/ti/ti-hash.h" -#endif - - #ifndef WOLFSSL_TI_HASH /* MD5 digest */ @@ -81,7 +76,6 @@ WOLFSSL_API void wc_InitMd5(Md5*); WOLFSSL_API void wc_Md5Update(Md5*, const byte*, word32); WOLFSSL_API void wc_Md5Final(Md5*, byte*); WOLFSSL_API int wc_Md5Hash(const byte*, word32, byte*); -WOLFSSL_API void wc_Md5GetHash(Md5*, byte*); #ifdef __cplusplus } /* extern "C" */ diff --git a/wolfssl/wolfcrypt/sha.h b/wolfssl/wolfcrypt/sha.h index b5ff4908d..80a2c9832 100644 --- a/wolfssl/wolfcrypt/sha.h +++ b/wolfssl/wolfcrypt/sha.h @@ -77,7 +77,6 @@ WOLFSSL_API int wc_InitSha(Sha*); WOLFSSL_API int wc_ShaUpdate(Sha*, const byte*, word32); WOLFSSL_API int wc_ShaFinal(Sha*, byte*); WOLFSSL_API int wc_ShaHash(const byte*, word32, byte*); -WOLFSSL_API int wc_ShaGetHash(Sha*, byte*); #ifdef __cplusplus } /* extern "C" */ diff --git a/wolfssl/wolfcrypt/sha256.h b/wolfssl/wolfcrypt/sha256.h index d022d3ac5..7cf6d8677 100644 --- a/wolfssl/wolfcrypt/sha256.h +++ b/wolfssl/wolfcrypt/sha256.h @@ -75,7 +75,6 @@ WOLFSSL_API int wc_InitSha256(Sha256*); WOLFSSL_API int wc_Sha256Update(Sha256*, const byte*, word32); WOLFSSL_API int wc_Sha256Final(Sha256*, byte*); WOLFSSL_API int wc_Sha256Hash(const byte*, word32, byte*); -WOLFSSL_API int wc_Sha256GetHash(Sha256*, byte*); #ifdef __cplusplus } /* extern "C" */ From e4580c34616dece28a56f442b086bd9ceec8561b Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Thu, 28 May 2015 20:50:22 +0900 Subject: [PATCH 102/350] adding hash.h to include.am --- wolfssl/wolfcrypt/include.am | 1 + 1 file changed, 1 insertion(+) diff --git a/wolfssl/wolfcrypt/include.am b/wolfssl/wolfcrypt/include.am index 26a7759b3..1f3a726b8 100644 --- a/wolfssl/wolfcrypt/include.am +++ b/wolfssl/wolfcrypt/include.am @@ -20,6 +20,7 @@ nobase_include_HEADERS+= \ wolfssl/wolfcrypt/ge_operations.h \ wolfssl/wolfcrypt/error-crypt.h \ wolfssl/wolfcrypt/fips_test.h \ + wolfssl/wolfcrypt/hash.h \ wolfssl/wolfcrypt/hc128.h \ wolfssl/wolfcrypt/hmac.h \ wolfssl/wolfcrypt/integer.h \ From 77fe4f3a2eb76dbe91a8d75a98ab01b73e33c90f Mon Sep 17 00:00:00 2001 From: John Safranek Date: Thu, 28 May 2015 10:25:41 -0700 Subject: [PATCH 103/350] Fixes #71. Disable SHA works with TLS, PWDBASED, testing. --- configure.ac | 2 - src/crl.c | 6 +- src/ssl.c | 29 +++++++--- wolfcrypt/src/asn.c | 116 ++++++++++++++++++++++---------------- wolfcrypt/src/pkcs7.c | 2 +- wolfcrypt/src/pwdbased.c | 8 +++ wolfcrypt/test/test.c | 43 ++++++++------ wolfssl/internal.h | 26 +++++---- wolfssl/wolfcrypt/asn.h | 27 +++++---- wolfssl/wolfcrypt/pkcs7.h | 2 +- 10 files changed, 156 insertions(+), 105 deletions(-) diff --git a/configure.ac b/configure.ac index e707f8657..4197c9304 100644 --- a/configure.ac +++ b/configure.ac @@ -1775,8 +1775,6 @@ AC_ARG_ENABLE([examples], AS_IF([test "x$ENABLED_FILESYSTEM" = "xno"], [ENABLED_EXAMPLES="no"]) AS_IF([test "x$ENABLED_INLINE" = "xno"], [ENABLED_EXAMPLES="no"]) -# certs still have sha signatures for now -AS_IF([test "x$ENABLED_SHA" = "xno" && test "x$ENABLED_PSK" = "xno"], [ENABLED_EXAMPLES="no"]) AM_CONDITIONAL([BUILD_EXAMPLES], [test "x$ENABLED_EXAMPLES" = "xyes"]) diff --git a/src/crl.c b/src/crl.c index 39bfa1284..0f47ee1a4 100644 --- a/src/crl.c +++ b/src/crl.c @@ -66,8 +66,8 @@ static int InitCRL_Entry(CRL_Entry* crle, DecodedCRL* dcrl) { WOLFSSL_ENTER("InitCRL_Entry"); - XMEMCPY(crle->issuerHash, dcrl->issuerHash, SHA_DIGEST_SIZE); - /* XMEMCPY(crle->crlHash, dcrl->crlHash, SHA_DIGEST_SIZE); + XMEMCPY(crle->issuerHash, dcrl->issuerHash, CRL_DIGEST_SIZE); + /* XMEMCPY(crle->crlHash, dcrl->crlHash, CRL_DIGEST_SIZE); * copy the hash here if needed for optimized comparisons */ XMEMCPY(crle->lastDate, dcrl->lastDate, MAX_DATE_SIZE); XMEMCPY(crle->nextDate, dcrl->nextDate, MAX_DATE_SIZE); @@ -152,7 +152,7 @@ int CheckCertCRL(WOLFSSL_CRL* crl, DecodedCert* cert) crle = crl->crlList; while (crle) { - if (XMEMCMP(crle->issuerHash, cert->issuerHash, SHA_DIGEST_SIZE) == 0) { + if (XMEMCMP(crle->issuerHash, cert->issuerHash, CRL_DIGEST_SIZE) == 0) { WOLFSSL_MSG("Found CRL Entry on list"); WOLFSSL_MSG("Checking next date validity"); diff --git a/src/ssl.c b/src/ssl.c index 7342e81a4..48ee6a54f 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -1797,7 +1797,7 @@ int AlreadySigner(WOLFSSL_CERT_MANAGER* cm, byte* hash) #else subjectHash = signers->subjectNameHash; #endif - if (XMEMCMP(hash, subjectHash, SHA_DIGEST_SIZE) == 0) { + if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) { ret = 1; break; } @@ -1831,7 +1831,7 @@ Signer* GetCA(void* vp, byte* hash) #else subjectHash = signers->subjectNameHash; #endif - if (XMEMCMP(hash, subjectHash, SHA_DIGEST_SIZE) == 0) { + if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) { ret = signers; break; } @@ -1861,7 +1861,8 @@ Signer* GetCAByName(void* vp, byte* hash) for (row = 0; row < CA_TABLE_SIZE && ret == NULL; row++) { signers = cm->caTable[row]; while (signers && ret == NULL) { - if (XMEMCMP(hash, signers->subjectNameHash, SHA_DIGEST_SIZE) == 0) { + if (XMEMCMP(hash, + signers->subjectNameHash, SIGNER_DIGEST_SIZE) == 0) { ret = signers; } signers = signers->next; @@ -1942,10 +1943,10 @@ int AddCA(WOLFSSL_CERT_MANAGER* cm, buffer der, int type, int verify) #endif #ifndef NO_SKID XMEMCPY(signer->subjectKeyIdHash, cert->extSubjKeyId, - SHA_DIGEST_SIZE); + SIGNER_DIGEST_SIZE); #endif XMEMCPY(signer->subjectNameHash, cert->subjectHash, - SHA_DIGEST_SIZE); + SIGNER_DIGEST_SIZE); signer->keyUsage = cert->extKeyUsageSet ? cert->extKeyUsage : 0xFFFF; signer->next = NULL; /* If Key Usage not set, all uses valid. */ @@ -7458,6 +7459,7 @@ int wolfSSL_set_compression(WOLFSSL* ssl) #endif /* NO_MD5 */ +#ifndef NO_SHA void wolfSSL_SHA_Init(WOLFSSL_SHA_CTX* sha) { typedef char sha_test[sizeof(SHA_CTX) >= sizeof(Sha) ? 1 : -1]; @@ -7503,6 +7505,7 @@ int wolfSSL_set_compression(WOLFSSL* ssl) WOLFSSL_ENTER("SHA1_Final"); SHA_Final(input, sha); } +#endif /* NO_SHA */ void wolfSSL_SHA256_Init(WOLFSSL_SHA256_CTX* sha256) @@ -7606,12 +7609,14 @@ int wolfSSL_set_compression(WOLFSSL* ssl) #endif /* NO_MD5 */ +#ifndef NO_SHA const WOLFSSL_EVP_MD* wolfSSL_EVP_sha1(void) { static const char* type = "SHA"; WOLFSSL_ENTER("EVP_sha1"); return type; } +#endif /* NO_SHA */ const WOLFSSL_EVP_MD* wolfSSL_EVP_sha256(void) @@ -8225,11 +8230,13 @@ int wolfSSL_set_compression(WOLFSSL* ssl) wolfSSL_MD5_Init((MD5_CTX*)&ctx->hash); } #endif + #ifndef NO_SHA /* has to be last since would pick or 256, 384, or 512 too */ else if (XSTRNCMP(type, "SHA", 3) == 0) { ctx->macType = SHA; wolfSSL_SHA_Init((SHA_CTX*)&ctx->hash); } + #endif /* NO_SHA */ else return BAD_FUNC_ARG; @@ -12386,12 +12393,14 @@ int wolfSSL_EVP_MD_size(const WOLFSSL_EVP_MD* type) return BAD_FUNC_ARG; } - if (XSTRNCMP(type, "MD5", 3) == 0) { - return MD5_DIGEST_SIZE; - } - else if (XSTRNCMP(type, "SHA256", 6) == 0) { + if (XSTRNCMP(type, "SHA256", 6) == 0) { return SHA256_DIGEST_SIZE; } +#ifndef NO_MD5 + else if (XSTRNCMP(type, "MD5", 3) == 0) { + return MD5_DIGEST_SIZE; + } +#endif #ifdef WOLFSSL_SHA384 else if (XSTRNCMP(type, "SHA384", 6) == 0) { return SHA384_DIGEST_SIZE; @@ -12402,10 +12411,12 @@ int wolfSSL_EVP_MD_size(const WOLFSSL_EVP_MD* type) return SHA512_DIGEST_SIZE; } #endif +#ifndef NO_SHA /* has to be last since would pick or 256, 384, or 512 too */ else if (XSTRNCMP(type, "SHA", 3) == 0) { return SHA_DIGEST_SIZE; } +#endif return BAD_FUNC_ARG; } diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 018e84fa2..e3d9ff44b 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -941,9 +941,11 @@ static int DecryptKey(const char* password, int passwordSz, byte* salt, if (version == PKCS5v2) ret = wc_PBKDF2(key, (byte*)password, passwordSz, salt, saltSz, iterations, derivedLen, typeH); +#ifndef NO_SHA else if (version == PKCS5) ret = wc_PBKDF1(key, (byte*)password, passwordSz, salt, saltSz, iterations, derivedLen, typeH); +#endif else if (version == PKCS12) { int i, idx = 0; byte unicodePasswd[MAX_UNICODE_SZ]; @@ -1447,9 +1449,9 @@ void InitDecodedCert(DecodedCert* cert, byte* source, word32 inSz, void* heap) cert->extAuthInfoSz = 0; cert->extCrlInfo = NULL; cert->extCrlInfoSz = 0; - XMEMSET(cert->extSubjKeyId, 0, SHA_SIZE); + XMEMSET(cert->extSubjKeyId, 0, KEYID_SIZE); cert->extSubjKeyIdSet = 0; - XMEMSET(cert->extAuthKeyId, 0, SHA_SIZE); + XMEMSET(cert->extAuthKeyId, 0, KEYID_SIZE); cert->extAuthKeyIdSet = 0; cert->extKeyUsageSet = 0; cert->extKeyUsage = 0; @@ -1852,11 +1854,11 @@ static int GetKey(DecodedCert* cert) /* process NAME, either issuer or subject */ static int GetName(DecodedCert* cert, int nameType) { - Sha sha; /* MUST have SHA-1 hash for cert names */ int length; /* length of all distinguished names */ int dummy; int ret; - char* full = (nameType == ISSUER) ? cert->issuer : cert->subject; + char* full; + byte* hash; word32 idx; #ifdef OPENSSL_EXTRA DecodedName* dName = @@ -1865,6 +1867,15 @@ static int GetName(DecodedCert* cert, int nameType) WOLFSSL_MSG("Getting Cert Name"); + if (nameType == ISSUER) { + full = cert->issuer; + hash = cert->issuerHash; + } + else { + full = cert->subject; + hash = cert->subjectHash; + } + if (cert->source[cert->srcIdx] == ASN_OBJECT_ID) { WOLFSSL_MSG("Trying optional prefix..."); @@ -1882,14 +1893,13 @@ static int GetName(DecodedCert* cert, int nameType) if (GetSequence(cert->source, &cert->srcIdx, &length, cert->maxIdx) < 0) return ASN_PARSE_E; - ret = wc_InitSha(&sha); +#ifdef NO_SHA + ret = wc_Sha256Hash(&cert->source[idx], length + cert->srcIdx - idx, hash); +#else + ret = wc_ShaHash(&cert->source[idx], length + cert->srcIdx - idx, hash); +#endif if (ret != 0) return ret; - wc_ShaUpdate(&sha, &cert->source[idx], length + cert->srcIdx - idx); - if (nameType == ISSUER) - wc_ShaFinal(&sha, cert->issuerHash); - else - wc_ShaFinal(&sha, cert->subjectHash); length += cert->srcIdx; idx = 0; @@ -3811,19 +3821,18 @@ static int DecodeAuthKeyId(byte* input, int sz, DecodedCert* cert) cert->extAuthKeyIdSz = length; #endif /* OPENSSL_EXTRA */ - if (length == SHA_SIZE) { + if (length == KEYID_SIZE) { XMEMCPY(cert->extAuthKeyId, input + idx, length); } else { - Sha sha; - ret = wc_InitSha(&sha); - if (ret != 0) - return ret; - wc_ShaUpdate(&sha, input + idx, length); - wc_ShaFinal(&sha, cert->extAuthKeyId); + #ifdef NO_SHA + ret = wc_Sha256Hash(input + idx, length, cert->extAuthKeyId); + #else + ret = wc_ShaHash(input + idx, length, cert->extAuthKeyId); + #endif } - return 0; + return ret; } @@ -3853,12 +3862,11 @@ static int DecodeSubjKeyId(byte* input, int sz, DecodedCert* cert) XMEMCPY(cert->extSubjKeyId, input + idx, length); } else { - Sha sha; - ret = wc_InitSha(&sha); - if (ret != 0) - return ret; - wc_ShaUpdate(&sha, input + idx, length); - wc_ShaFinal(&sha, cert->extSubjKeyId); + #ifdef NO_SHA + ret = wc_Sha256Hash(input + idx, length, cert->extSubjKeyId); + #else + ret = wc_ShaHash(input + idx, length, cert->extSubjKeyId); + #endif } return ret; @@ -4355,12 +4363,15 @@ int ParseCertRelative(DecodedCert* cert, int type, int verify, void* cm) #ifndef NO_SKID if (cert->extSubjKeyIdSet == 0 && cert->publicKey != NULL && cert->pubKeySize > 0) { - Sha sha; - ret = wc_InitSha(&sha); + #ifdef NO_SHA + ret = wc_Sha256Hash(cert->publicKey, cert->pubKeySize, + cert->extSubjKeyId); + #else + ret = wc_ShaHash(cert->publicKey, cert->pubKeySize, + cert->extSubjKeyId); + #endif if (ret != 0) return ret; - wc_ShaUpdate(&sha, cert->publicKey, cert->pubKeySize); - wc_ShaFinal(&sha, cert->extSubjKeyId); } #endif @@ -4379,14 +4390,15 @@ int ParseCertRelative(DecodedCert* cert, int type, int verify, void* cm) if (ca) { #ifdef HAVE_OCSP /* Need the ca's public key hash for OCSP */ - { - Sha sha; - ret = wc_InitSha(&sha); - if (ret != 0) - return ret; - wc_ShaUpdate(&sha, ca->publicKey, ca->pubKeySize); - wc_ShaFinal(&sha, cert->issuerKeyHash); - } + #ifdef NO_SHA + ret = wc_Sha256Hash(ca->publicKey, ca->pubKeySize, + cert->issuerKeyHash); + #else /* NO_SHA */ + ret = wc_ShaHash(ca->publicKey, ca->pubKeySize, + cert->issuerKeyHash); + #endif /* NO_SHA */ + if (ret != 0) + return ret; #endif /* HAVE_OCSP */ /* try to confirm/verify signature */ if (!ConfirmSignature(cert->source + cert->certBegin, @@ -7343,13 +7355,18 @@ int EncodeOcspRequest(OcspRequest* req) WOLFSSL_ENTER("EncodeOcspRequest"); +#ifdef NO_SHA + algoSz = SetAlgoID(SHA256h, algoArray, hashType, 0); +#else algoSz = SetAlgoID(SHAh, algoArray, hashType, 0); +#endif req->issuerHash = req->cert->issuerHash; - issuerSz = SetDigest(req->cert->issuerHash, SHA_SIZE, issuerArray); - + issuerSz = SetDigest(req->cert->issuerHash, KEYID_SIZE, issuerArray); + req->issuerKeyHash = req->cert->issuerKeyHash; - issuerKeySz = SetDigest(req->cert->issuerKeyHash, SHA_SIZE, issuerKeyArray); + issuerKeySz = SetDigest(req->cert->issuerKeyHash, + KEYID_SIZE, issuerKeyArray); req->serial = req->cert->serial; req->serialSz = req->cert->serialSz; @@ -7453,14 +7470,14 @@ int CompareOcspReqResp(OcspRequest* req, OcspResponse* resp) } } - cmp = XMEMCMP(req->issuerHash, resp->issuerHash, SHA_DIGEST_SIZE); + cmp = XMEMCMP(req->issuerHash, resp->issuerHash, KEYID_SIZE); if (cmp != 0) { WOLFSSL_MSG("\tissuerHash mismatch"); return cmp; } - cmp = XMEMCMP(req->issuerKeyHash, resp->issuerKeyHash, SHA_DIGEST_SIZE); + cmp = XMEMCMP(req->issuerKeyHash, resp->issuerKeyHash, KEYID_SIZE); if (cmp != 0) { WOLFSSL_MSG("\tissuerKeyHash mismatch"); @@ -7487,13 +7504,12 @@ int CompareOcspReqResp(OcspRequest* req, OcspResponse* resp) #endif -/* store SHA1 hash of NAME */ +/* store SHA hash of NAME */ WOLFSSL_LOCAL int GetNameHash(const byte* source, word32* idx, byte* hash, int maxIdx) { - Sha sha; int length; /* length of all distinguished names */ - int ret = 0; + int ret; word32 dummy; WOLFSSL_ENTER("GetNameHash"); @@ -7515,15 +7531,15 @@ WOLFSSL_LOCAL int GetNameHash(const byte* source, word32* idx, byte* hash, if (GetSequence(source, idx, &length, maxIdx) < 0) return ASN_PARSE_E; - ret = wc_InitSha(&sha); - if (ret != 0) - return ret; - wc_ShaUpdate(&sha, source + dummy, length + *idx - dummy); - wc_ShaFinal(&sha, hash); +#ifdef NO_SHA + ret = wc_Sha256Hash(source + dummy, length + *idx - dummy, hash); +#else + ret = wc_ShaHash(source + dummy, length + *idx - dummy, hash); +#endif *idx += length; - return 0; + return ret; } diff --git a/wolfcrypt/src/pkcs7.c b/wolfcrypt/src/pkcs7.c index 1e46ee608..2f66ea216 100644 --- a/wolfcrypt/src/pkcs7.c +++ b/wolfcrypt/src/pkcs7.c @@ -188,7 +188,7 @@ int wc_PKCS7_InitWithCert(PKCS7* pkcs7, byte* cert, word32 certSz) XMEMCPY(pkcs7->publicKey, dCert->publicKey, dCert->pubKeySize); pkcs7->publicKeySz = dCert->pubKeySize; - XMEMCPY(pkcs7->issuerHash, dCert->issuerHash, SHA_SIZE); + XMEMCPY(pkcs7->issuerHash, dCert->issuerHash, KEYID_SIZE); pkcs7->issuer = dCert->issuerRaw; pkcs7->issuerSz = dCert->issuerRawLen; XMEMCPY(pkcs7->issuerSn, dCert->serial, dCert->serialSz); diff --git a/wolfcrypt/src/pwdbased.c b/wolfcrypt/src/pwdbased.c index 745493982..b9764d8d0 100644 --- a/wolfcrypt/src/pwdbased.c +++ b/wolfcrypt/src/pwdbased.c @@ -68,6 +68,7 @@ #endif /* WOLFSSL_HAVE_MIN */ +#ifndef NO_SHA /* PBKDF1 needs at least SHA available */ int wc_PBKDF1(byte* output, const byte* passwd, int pLen, const byte* salt, int sLen, int iterations, int kLen, int hashType) @@ -130,6 +131,7 @@ int wc_PBKDF1(byte* output, const byte* passwd, int pLen, const byte* salt, return 0; } +#endif /* NO_SHA */ int GetDigestSize(int hashType) @@ -142,9 +144,11 @@ int GetDigestSize(int hashType) hLen = MD5_DIGEST_SIZE; break; #endif +#ifndef NO_SHA case SHA: hLen = SHA_DIGEST_SIZE; break; +#endif #ifndef NO_SHA256 case SHA256: hLen = SHA256_DIGEST_SIZE; @@ -264,10 +268,12 @@ int GetPKCS12HashSizes(int hashType, word32* v, word32* u) *u = MD5_DIGEST_SIZE; break; #endif +#ifndef NO_SHA case SHA: *v = SHA_BLOCK_SIZE; *u = SHA_DIGEST_SIZE; break; +#endif #ifndef NO_SHA256 case SHA256: *v = SHA256_BLOCK_SIZE; @@ -313,6 +319,7 @@ int DoPKCS12Hash(int hashType, byte* buffer, word32 totalLen, } break; #endif /* NO_MD5 */ +#ifndef NO_SHA case SHA: { Sha sha; @@ -328,6 +335,7 @@ int DoPKCS12Hash(int hashType, byte* buffer, word32 totalLen, } } break; +#endif /* NO_SHA */ #ifndef NO_SHA256 case SHA256: { diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 8dac3b8ea..6620a5fda 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -4409,9 +4409,10 @@ int openssl_test(void) { EVP_MD_CTX md_ctx; testVector a, b, c, d, e, f; - byte hash[SHA_DIGEST_SIZE*4]; /* max size */ + byte hash[SHA256_DIGEST_SIZE*2]; /* max size */ (void)a; + (void)b; (void)c; (void)e; (void)f; @@ -4436,6 +4437,8 @@ int openssl_test(void) #endif /* NO_MD5 */ +#ifndef NO_SHA + b.input = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaa"; @@ -4453,6 +4456,8 @@ int openssl_test(void) if (memcmp(hash, b.output, SHA_DIGEST_SIZE) != 0) return -72; +#endif /* NO_SHA */ + d.input = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; d.output = "\x24\x8D\x6A\x61\xD2\x06\x38\xB8\xE5\xC0\x26\x93\x0C\x3E\x60" @@ -4656,22 +4661,22 @@ int pkcs12_test(void) byte derived[64]; const byte verify[] = { - 0x8A, 0xAA, 0xE6, 0x29, 0x7B, 0x6C, 0xB0, 0x46, - 0x42, 0xAB, 0x5B, 0x07, 0x78, 0x51, 0x28, 0x4E, - 0xB7, 0x12, 0x8F, 0x1A, 0x2A, 0x7F, 0xBC, 0xA3 + 0x27, 0xE9, 0x0D, 0x7E, 0xD5, 0xA1, 0xC4, 0x11, + 0xBA, 0x87, 0x8B, 0xC0, 0x90, 0xF5, 0xCE, 0xBE, + 0x5E, 0x9D, 0x5F, 0xE3, 0xD6, 0x2B, 0x73, 0xAA }; const byte verify2[] = { - 0x48, 0x3D, 0xD6, 0xE9, 0x19, 0xD7, 0xDE, 0x2E, - 0x8E, 0x64, 0x8B, 0xA8, 0xF8, 0x62, 0xF3, 0xFB, - 0xFB, 0xDC, 0x2B, 0xCB, 0x2C, 0x02, 0x95, 0x7F + 0x90, 0x1B, 0x49, 0x70, 0xF0, 0x94, 0xF0, 0xF8, + 0x45, 0xC0, 0xF3, 0xF3, 0x13, 0x59, 0x18, 0x6A, + 0x35, 0xE3, 0x67, 0xFE, 0xD3, 0x21, 0xFD, 0x7C }; int id = 1; int kLen = 24; int iterations = 1; - int ret = wc_PKCS12_PBKDF(derived, passwd, sizeof(passwd), salt, 8, iterations, - kLen, SHA, id); + int ret = wc_PKCS12_PBKDF(derived, passwd, sizeof(passwd), salt, 8, + iterations, kLen, SHA256, id); if (ret < 0) return -103; @@ -4680,8 +4685,8 @@ int pkcs12_test(void) return -104; iterations = 1000; - ret = wc_PKCS12_PBKDF(derived, passwd2, sizeof(passwd2), salt2, 8, iterations, - kLen, SHA, id); + ret = wc_PKCS12_PBKDF(derived, passwd2, sizeof(passwd2), salt2, 8, + iterations, kLen, SHA256, id); if (ret < 0) return -105; @@ -4701,12 +4706,12 @@ int pbkdf2_test(void) byte derived[64]; const byte verify[] = { - 0xba, 0x9b, 0x3b, 0x95, 0x04, 0x4d, 0x78, 0x11, 0xec, 0xa1, 0xff, 0x3f, - 0xea, 0x3a, 0xdb, 0x55, 0x3e, 0x54, 0x0b, 0xa0, 0x9f, 0xad, 0xe6, 0x81 + 0x43, 0x6d, 0xb5, 0xe8, 0xd0, 0xfb, 0x3f, 0x35, 0x42, 0x48, 0x39, 0xbc, + 0x2d, 0xd4, 0xf9, 0x37, 0xd4, 0x95, 0x16, 0xa7, 0x2a, 0x9a, 0x21, 0xd1 }; int ret = wc_PBKDF2(derived, (byte*)passwd, (int)strlen(passwd), salt, 8, - iterations, kLen, SHA); + iterations, kLen, SHA256); if (ret != 0) return ret; @@ -4717,6 +4722,7 @@ int pbkdf2_test(void) } +#ifndef NO_SHA int pbkdf1_test(void) { char passwd[] = "password"; @@ -4738,11 +4744,15 @@ int pbkdf1_test(void) return 0; } +#endif int pwdbased_test(void) { - int ret = pbkdf1_test(); + int ret = 0; +#ifndef NO_SHA + ret += pbkdf1_test(); +#endif ret += pbkdf2_test(); return ret + pkcs12_test(); @@ -4968,7 +4978,8 @@ int ecc_test(void) if (ret != 0) return -1017; -#if (defined(HAVE_ECC192) && defined(HAVE_ECC224)) || defined(HAVE_ALL_CURVES) +#if !defined(NO_SHA) && \ + ((defined(HAVE_ECC192) && defined(HAVE_ECC224)) || defined(HAVE_ALL_CURVES)) { /* test raw ECC key import */ Sha sha; diff --git a/wolfssl/internal.h b/wolfssl/internal.h index d4dc91247..7434841dd 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -433,13 +433,15 @@ typedef byte word24[3]; #endif #endif #if !defined(NO_DES3) - #if !defined(NO_RSA) - #define BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - #define BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA - #endif + #ifndef NO_SHA + #if !defined(NO_RSA) + #define BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA + #define BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA + #endif - #define BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA - #define BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA + #define BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA + #define BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA + #endif /* NO_SHA */ #endif #endif @@ -1152,10 +1154,10 @@ struct WOLFSSL_CIPHER { typedef struct OCSP_Entry OCSP_Entry; -#ifdef SHA_DIGEST_SIZE - #define OCSP_DIGEST_SIZE SHA_DIGEST_SIZE +#ifdef NO_SHA + #define OCSP_DIGEST_SIZE SHA256_DIGEST_SIZE #else - #define OCSP_DIGEST_SIZE 160 + #define OCSP_DIGEST_SIZE SHA_DIGEST_SIZE #endif #ifdef NO_ASN @@ -1189,10 +1191,10 @@ struct WOLFSSL_OCSP { typedef struct CRL_Entry CRL_Entry; -#ifdef SHA_DIGEST_SIZE - #define CRL_DIGEST_SIZE SHA_DIGEST_SIZE +#ifdef NO_SHA + #define CRL_DIGEST_SIZE SHA256_DIGEST_SIZE #else - #define CRL_DIGEST_SIZE 160 + #define CRL_DIGEST_SIZE SHA_DIGEST_SIZE #endif #ifdef NO_ASN diff --git a/wolfssl/wolfcrypt/asn.h b/wolfssl/wolfcrypt/asn.h index 7511cdfc4..10d0943bb 100644 --- a/wolfssl/wolfcrypt/asn.h +++ b/wolfssl/wolfcrypt/asn.h @@ -48,6 +48,7 @@ #ifndef NO_MD5 #include #endif +#include #include /* public interface */ #ifdef HAVE_ECC #include @@ -138,7 +139,11 @@ enum Misc_ASN { ASN_BOOL_SIZE = 2, /* including type */ ASN_ECC_HEADER_SZ = 2, /* String type + 1 byte len */ ASN_ECC_CONTEXT_SZ = 2, /* Content specific type + 1 byte len */ - SHA_SIZE = 20, +#ifdef NO_SHA + KEYID_SIZE = SHA256_DIGEST_SIZE, +#else + KEYID_SIZE = SHA_DIGEST_SIZE, +#endif RSA_INTS = 8, /* RSA ints in private key */ MIN_DATE_SIZE = 13, MAX_DATE_SIZE = 32, @@ -353,10 +358,10 @@ struct DecodedCert { Base_entry* permittedNames; /* Permitted name bases */ Base_entry* excludedNames; /* Excluded name bases */ #endif /* IGNORE_NAME_CONSTRAINTS */ - byte subjectHash[SHA_SIZE]; /* hash of all Names */ - byte issuerHash[SHA_SIZE]; /* hash of all Names */ + byte subjectHash[KEYID_SIZE]; /* hash of all Names */ + byte issuerHash[KEYID_SIZE]; /* hash of all Names */ #ifdef HAVE_OCSP - byte issuerKeyHash[SHA_SIZE]; /* hash of the public Key */ + byte issuerKeyHash[KEYID_SIZE]; /* hash of the public Key */ #endif /* HAVE_OCSP */ byte* signature; /* not owned, points into raw cert */ char* subjectCN; /* CommonName */ @@ -379,9 +384,9 @@ struct DecodedCert { int extAuthInfoSz; /* length of the URI */ byte* extCrlInfo; /* CRL Distribution Points */ int extCrlInfoSz; /* length of the URI */ - byte extSubjKeyId[SHA_SIZE]; /* Subject Key ID */ + byte extSubjKeyId[KEYID_SIZE]; /* Subject Key ID */ byte extSubjKeyIdSet; /* Set when the SKID was read from cert */ - byte extAuthKeyId[SHA_SIZE]; /* Authority Key ID */ + byte extAuthKeyId[KEYID_SIZE]; /* Authority Key ID */ byte extAuthKeyIdSet; /* Set when the AKID was read from cert */ #ifndef IGNORE_NAME_CONSTRAINTS byte extNameConstraintSet; @@ -471,10 +476,10 @@ struct DecodedCert { }; -#ifdef SHA_DIGEST_SIZE - #define SIGNER_DIGEST_SIZE SHA_DIGEST_SIZE +#ifdef NO_SHA + #define SIGNER_DIGEST_SIZE SHA256_DIGEST_SIZE #else - #define SIGNER_DIGEST_SIZE 20 + #define SIGNER_DIGEST_SIZE SHA_DIGEST_SIZE #endif /* CA Signers */ @@ -710,8 +715,8 @@ struct DecodedCRL { word32 sigLength; /* length of signature */ word32 signatureOID; /* sum of algorithm object id */ byte* signature; /* pointer into raw source, not owned */ - byte issuerHash[SHA_DIGEST_SIZE]; /* issuer hash */ - byte crlHash[SHA_DIGEST_SIZE]; /* raw crl data hash */ + byte issuerHash[SIGNER_DIGEST_SIZE]; /* issuer hash */ + byte crlHash[SIGNER_DIGEST_SIZE]; /* raw crl data hash */ byte lastDate[MAX_DATE_SIZE]; /* last date updated */ byte nextDate[MAX_DATE_SIZE]; /* next update date */ byte lastDateFormat; /* format of last date */ diff --git a/wolfssl/wolfcrypt/pkcs7.h b/wolfssl/wolfcrypt/pkcs7.h index c748f4514..e39a12b9d 100644 --- a/wolfssl/wolfcrypt/pkcs7.h +++ b/wolfssl/wolfcrypt/pkcs7.h @@ -80,7 +80,7 @@ typedef struct PKCS7 { byte* singleCert; /* recipient cert, DER, not owner */ word32 singleCertSz; /* size of recipient cert buffer, bytes */ - byte issuerHash[SHA_SIZE]; /* hash of all alt Names */ + byte issuerHash[KEYID_SIZE]; /* hash of all alt Names */ byte* issuer; /* issuer name of singleCert */ word32 issuerSz; /* length of issuer name */ byte issuerSn[MAX_SN_SZ]; /* singleCert's serial number */ From a7a00a4bd5092124dc94620c75a695caf1479a58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moise=CC=81s=20Guimara=CC=83es?= Date: Thu, 28 May 2015 17:04:15 -0300 Subject: [PATCH 104/350] remove trailing spaces. --- wolfcrypt/src/integer.c | 278 ++++++++++++++++++++-------------------- 1 file changed, 139 insertions(+), 139 deletions(-) diff --git a/wolfcrypt/src/integer.c b/wolfcrypt/src/integer.c index eaf538283..ecf117c43 100644 --- a/wolfcrypt/src/integer.c +++ b/wolfcrypt/src/integer.c @@ -33,7 +33,7 @@ /* in case user set USE_FAST_MATH there */ #include -#ifndef NO_BIG_INT +#ifndef NO_BIG_INT #ifndef USE_FAST_MATH @@ -168,7 +168,7 @@ mp_count_bits (mp_int * a) /* get number of digits and add that */ r = (a->used - 1) * DIGIT_BIT; - + /* take the last digit and count the bits in it */ q = a->dp[a->used - 1]; while (q > ((mp_digit) 0)) { @@ -416,7 +416,7 @@ void mp_zero (mp_int * a) } -/* trim unused digits +/* trim unused digits * * This is used to ensure that leading zero digits are * trimed and the leading "used" digit will be non-zero @@ -440,7 +440,7 @@ mp_clamp (mp_int * a) } -/* swap the elements of two integers, for cases where you can't simply swap the +/* swap the elements of two integers, for cases where you can't simply swap the * mp_int pointers around */ void @@ -513,8 +513,8 @@ void mp_rshd (mp_int * a, int b) /* top [offset into digits] */ top = a->dp + b; - /* this is implemented as a sliding window where - * the window is b-digits long and digits from + /* this is implemented as a sliding window where + * the window is b-digits long and digits from * the top of the window are copied to the bottom * * e.g. @@ -532,7 +532,7 @@ void mp_rshd (mp_int * a, int b) *bottom++ = 0; } } - + /* remove excess digits */ a->used -= b; } @@ -662,7 +662,7 @@ int mp_mul_2d (mp_int * a, int b, mp_int * c) /* set the carry to the carry bits of the current word */ r = rr; } - + /* set final carry */ if (r != 0) { c->dp[(c->used)++] = r; @@ -765,7 +765,7 @@ int mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) mp_clear(&tmpG); mp_clear(&tmpX); return err; -#else +#else /* no invmod */ return MP_VAL; #endif @@ -793,7 +793,7 @@ int mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) dr = mp_reduce_is_2k(P) << 1; } #endif - + /* if the modulus is odd or dr != 0 use the montgomery method */ #ifdef BN_MP_EXPTMOD_FAST_C if (mp_isodd (P) == 1 || dr != 0) { @@ -813,7 +813,7 @@ int mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) } -/* b = |a| +/* b = |a| * * Simple function copies the input and fixes the sign to positive */ @@ -857,10 +857,10 @@ int mp_invmod (mp_int * a, mp_int * b, mp_int * c) } -/* computes the modular inverse via binary extended euclidean algorithm, - * that is c = 1/a mod b +/* computes the modular inverse via binary extended euclidean algorithm, + * that is c = 1/a mod b * - * Based on slow invmod except this is optimized for the case where b is + * Based on slow invmod except this is optimized for the case where b is * odd as per HAC Note 14.64 on pp. 610 */ int fast_mp_invmod (mp_int * a, mp_int * b, mp_int * c) @@ -1006,7 +1006,7 @@ int mp_invmod_slow (mp_int * a, mp_int * b, mp_int * c) } /* init temps */ - if ((res = mp_init_multi(&x, &y, &u, &v, + if ((res = mp_init_multi(&x, &y, &u, &v, &A, &B)) != MP_OKAY) { return res; } @@ -1138,14 +1138,14 @@ top: goto LBL_ERR; } } - + /* too big */ while (mp_cmp_mag(&C, b) != MP_LT) { if ((res = mp_sub(&C, b, &C)) != MP_OKAY) { goto LBL_ERR; } } - + /* C is now the inverse */ mp_exch (&C, c); res = MP_OKAY; @@ -1171,7 +1171,7 @@ int mp_cmp_mag (mp_int * a, mp_int * b) if (a->used > b->used) { return MP_GT; } - + if (a->used < b->used) { return MP_LT; } @@ -1208,7 +1208,7 @@ mp_cmp (mp_int * a, mp_int * b) return MP_GT; } } - + /* compare digits */ if (a->sign == MP_NEG) { /* if negative compare opposite direction */ @@ -1303,7 +1303,7 @@ int mp_div(mp_int * a, mp_int * b, mp_int * c, mp_int * d) } return res; } - + /* init our temps */ if ((res = mp_init_multi(&ta, &tb, &tq, &q, 0, 0)) != MP_OKAY) { return res; @@ -1313,7 +1313,7 @@ int mp_div(mp_int * a, mp_int * b, mp_int * c, mp_int * d) mp_set(&tq, 1); n = mp_count_bits(a) - mp_count_bits(b); if (((res = mp_abs(a, &ta)) != MP_OKAY) || - ((res = mp_abs(b, &tb)) != MP_OKAY) || + ((res = mp_abs(b, &tb)) != MP_OKAY) || ((res = mp_mul_2d(&tb, n, &tb)) != MP_OKAY) || ((res = mp_mul_2d(&tq, n, &tq)) != MP_OKAY)) { goto LBL_ERR; @@ -1491,8 +1491,8 @@ s_mp_add (mp_int * a, mp_int * b, mp_int * c) *tmpc++ &= MP_MASK; } - /* now copy higher words if any, that is in A+B - * if A or B has more digits add those in + /* now copy higher words if any, that is in A+B + * if A or B has more digits add those in */ if (min != max) { for (; i < max; i++) { @@ -1631,7 +1631,7 @@ mp_sub (mp_int * a, mp_int * b, mp_int * c) int mp_reduce_is_2k_l(mp_int *a) { int ix, iy; - + if (a->used == 0) { return MP_NO; } else if (a->used == 1) { @@ -1644,7 +1644,7 @@ int mp_reduce_is_2k_l(mp_int *a) } } return (iy >= (a->used/2)) ? MP_YES : MP_NO; - + } return MP_NO; } @@ -1655,7 +1655,7 @@ int mp_reduce_is_2k(mp_int *a) { int ix, iy, iw; mp_digit iz; - + if (a->used == 0) { return MP_NO; } else if (a->used == 1) { @@ -1664,7 +1664,7 @@ int mp_reduce_is_2k(mp_int *a) iy = mp_count_bits(a); iz = 1; iw = 1; - + /* Test every bit from the second digit up, must be 1 */ for (ix = DIGIT_BIT; ix < iy; ix++) { if ((a->dp[iw] & iz) == 0) { @@ -1774,7 +1774,7 @@ int mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, /* determine and setup reduction code */ if (redmode == 0) { -#ifdef BN_MP_MONTGOMERY_SETUP_C +#ifdef BN_MP_MONTGOMERY_SETUP_C /* now setup montgomery */ if ((err = mp_montgomery_setup (P, &mp)) != MP_OKAY) { goto LBL_M; @@ -1790,7 +1790,7 @@ int mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, if (((P->used * 2 + 1) < MP_WARRAY) && P->used < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { redux = fast_mp_montgomery_reduce; - } else + } else #endif { #ifdef BN_MP_MONTGOMERY_REDUCE_C @@ -1841,7 +1841,7 @@ int mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, if ((err = mp_montgomery_calc_normalization (&res, P)) != MP_OKAY) { goto LBL_RES; } -#else +#else err = MP_VAL; goto LBL_RES; #endif @@ -2075,7 +2075,7 @@ int fast_mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho) #ifdef WOLFSSL_SMALL_STACK W = (mp_word*)XMALLOC(sizeof(mp_word) * MP_WARRAY, 0, DYNAMIC_TYPE_BIGINT); - if (W == NULL) + if (W == NULL) return MP_MEM; #endif @@ -2316,7 +2316,7 @@ void mp_dr_setup(mp_int *a, mp_digit *d) /* the casts are required if DIGIT_BIT is one less than * the number of bits in a mp_digit [e.g. DIGIT_BIT==31] */ - *d = (mp_digit)((((mp_word)1) << ((mp_word)DIGIT_BIT)) - + *d = (mp_digit)((((mp_word)1) << ((mp_word)DIGIT_BIT)) - ((mp_word)a->dp[0])); } @@ -2400,35 +2400,35 @@ int mp_reduce_2k(mp_int *a, mp_int *n, mp_digit d) { mp_int q; int p, res; - + if ((res = mp_init(&q)) != MP_OKAY) { return res; } - - p = mp_count_bits(n); + + p = mp_count_bits(n); top: /* q = a/2**p, a = a mod 2**p */ if ((res = mp_div_2d(a, p, &q, a)) != MP_OKAY) { goto ERR; } - + if (d != 1) { /* q = q * d */ - if ((res = mp_mul_d(&q, d, &q)) != MP_OKAY) { + if ((res = mp_mul_d(&q, d, &q)) != MP_OKAY) { goto ERR; } } - + /* a = a + q */ if ((res = s_mp_add(a, &q, a)) != MP_OKAY) { goto ERR; } - + if (mp_cmp_mag(a, n) != MP_LT) { s_mp_sub(a, n, a); goto top; } - + ERR: mp_clear(&q); return res; @@ -2440,29 +2440,29 @@ int mp_reduce_2k_setup(mp_int *a, mp_digit *d) { int res, p; mp_int tmp; - + if ((res = mp_init(&tmp)) != MP_OKAY) { return res; } - + p = mp_count_bits(a); if ((res = mp_2expt(&tmp, p)) != MP_OKAY) { mp_clear(&tmp); return res; } - + if ((res = s_mp_sub(&tmp, a, &tmp)) != MP_OKAY) { mp_clear(&tmp); return res; } - + *d = tmp.dp[0]; mp_clear(&tmp); return MP_OKAY; } -/* computes a = 2**b +/* computes a = 2**b * * Simple algorithm which zeroes the int, grows it then just sets one bit * as required. @@ -2578,8 +2578,8 @@ mp_sqr (mp_int * a, mp_int * b) { #ifdef BN_FAST_S_MP_SQR_C /* can we use the fast comba multiplier? */ - if ((a->used * 2 + 1) < MP_WARRAY && - a->used < + if ((a->used * 2 + 1) < MP_WARRAY && + a->used < (1 << (sizeof(mp_word) * CHAR_BIT - 2*DIGIT_BIT - 1))) { res = fast_s_mp_sqr (a, b); } else @@ -2604,18 +2604,18 @@ int mp_mul (mp_int * a, mp_int * b, mp_int * c) { /* can we use the fast multiplier? * - * The fast multiplier can be used if the output will - * have less than MP_WARRAY digits and the number of + * The fast multiplier can be used if the output will + * have less than MP_WARRAY digits and the number of * digits won't affect carry propagation */ int digs = a->used + b->used + 1; #ifdef BN_FAST_S_MP_MUL_DIGS_C if ((digs < MP_WARRAY) && - MIN(a->used, b->used) <= + MIN(a->used, b->used) <= (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { res = fast_s_mp_mul_digs (a, b, c, digs); - } else + } else #endif #ifdef BN_S_MP_MUL_DIGS_C res = s_mp_mul (a, b, c); /* uses s_mp_mul_digs */ @@ -2649,24 +2649,24 @@ int mp_mul_2(mp_int * a, mp_int * b) /* alias for source */ tmpa = a->dp; - + /* alias for dest */ tmpb = b->dp; /* carry */ r = 0; for (x = 0; x < a->used; x++) { - - /* get what will be the *next* carry bit from the - * MSB of the current digit + + /* get what will be the *next* carry bit from the + * MSB of the current digit */ rr = *tmpa >> ((mp_digit)(DIGIT_BIT - 1)); - + /* now shift up this digit, add in the carry [from the previous] */ *tmpb++ = ((*tmpa++ << ((mp_digit)1)) | r) & MP_MASK; - - /* copy the carry that would be from the source - * digit into the next iteration + + /* copy the carry that would be from the source + * digit into the next iteration */ r = rr; } @@ -2678,8 +2678,8 @@ int mp_mul_2(mp_int * a, mp_int * b) ++(b->used); } - /* now zero any excess digits on the destination - * that we didn't write to + /* now zero any excess digits on the destination + * that we didn't write to */ tmpb = b->dp + b->used; for (x = b->used; x < oldused; x++) { @@ -2699,14 +2699,14 @@ mp_div_3 (mp_int * a, mp_int *c, mp_digit * d) mp_word w, t; mp_digit b; int res, ix; - + /* b = 2**DIGIT_BIT / 3 */ b = (mp_digit) ( (((mp_word)1) << ((mp_word)DIGIT_BIT)) / ((mp_word)3) ); if ((res = mp_init_size(&q, a->used)) != MP_OKAY) { return res; } - + q.used = a->used; q.sign = a->sign; w = 0; @@ -2744,7 +2744,7 @@ mp_div_3 (mp_int * a, mp_int *c, mp_digit * d) mp_exch(&q, c); } mp_clear(&q); - + return res; } @@ -2755,8 +2755,8 @@ int mp_init_size (mp_int * a, int size) int x; /* pad size so there are always extra digits */ - size += (MP_PREC * 2) - (size % MP_PREC); - + size += (MP_PREC * 2) - (size % MP_PREC); + /* alloc mem */ a->dp = OPT_CAST(mp_digit) XMALLOC (sizeof (mp_digit) * size, 0, DYNAMIC_TYPE_BIGINT); @@ -2779,10 +2779,10 @@ int mp_init_size (mp_int * a, int size) /* the jist of squaring... - * you do like mult except the offset of the tmpx [one that - * starts closer to zero] can't equal the offset of tmpy. + * you do like mult except the offset of the tmpx [one that + * starts closer to zero] can't equal the offset of tmpy. * So basically you set up iy like before then you min it with - * (ty-tx) so that it never happens. You double all those + * (ty-tx) so that it never happens. You double all those * you add in the inner loop After that loop you do the squares and add them in. @@ -2812,13 +2812,13 @@ int fast_s_mp_sqr (mp_int * a, mp_int * b) #ifdef WOLFSSL_SMALL_STACK W = (mp_digit*)XMALLOC(sizeof(mp_digit) * MP_WARRAY, 0, DYNAMIC_TYPE_BIGINT); - if (W == NULL) + if (W == NULL) return MP_MEM; #endif /* number of output digits to produce */ W1 = 0; - for (ix = 0; ix < pa; ix++) { + for (ix = 0; ix < pa; ix++) { int tx, ty, iy; mp_word _W; mp_digit *tmpy; @@ -2839,7 +2839,7 @@ int fast_s_mp_sqr (mp_int * a, mp_int * b) */ iy = MIN(a->used-tx, ty+1); - /* now for squaring tx can never equal ty + /* now for squaring tx can never equal ty * we halve the distance since they approach at a rate of 2x * and we have to round because odd cases need to be executed */ @@ -2893,15 +2893,15 @@ int fast_s_mp_sqr (mp_int * a, mp_int * b) /* Fast (comba) multiplier * - * This is the fast column-array [comba] multiplier. It is - * designed to compute the columns of the product first - * then handle the carries afterwards. This has the effect + * This is the fast column-array [comba] multiplier. It is + * designed to compute the columns of the product first + * then handle the carries afterwards. This has the effect * of making the nested loops that compute the columns very * simple and schedulable on super-scalar processors. * - * This has been modified to produce a variable number of - * digits of output so if say only a half-product is required - * you don't have to compute the upper half (a feature + * This has been modified to produce a variable number of + * digits of output so if say only a half-product is required + * you don't have to compute the upper half (a feature * required for fast Barrett reduction). * * Based on Algorithm 14.12 on pp.595 of HAC. @@ -2931,13 +2931,13 @@ int fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) #ifdef WOLFSSL_SMALL_STACK W = (mp_digit*)XMALLOC(sizeof(mp_digit) * MP_WARRAY, 0, DYNAMIC_TYPE_BIGINT); - if (W == NULL) + if (W == NULL) return MP_MEM; #endif /* clear the carry */ _W = 0; - for (ix = 0; ix < pa; ix++) { + for (ix = 0; ix < pa; ix++) { int tx, ty; int iy; mp_digit *tmpx, *tmpy; @@ -2950,7 +2950,7 @@ int fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) tmpx = a->dp + tx; tmpy = b->dp + ty; - /* this is the number of times the loop will iterrate, essentially + /* this is the number of times the loop will iterrate, essentially while (tx++ < a->used && ty-- >= 0) { ... } */ iy = MIN(a->used-tx, ty+1); @@ -3028,7 +3028,7 @@ int s_mp_sqr (mp_int * a, mp_int * b) /* alias for where to store the results */ tmpt = t.dp + (2*ix + 1); - + for (iy = ix + 1; iy < pa; iy++) { /* first calculate the product */ r = ((mp_word)tmpx) * ((mp_word)a->dp[iy]); @@ -3060,7 +3060,7 @@ int s_mp_sqr (mp_int * a, mp_int * b) /* multiplies |a| * |b| and only computes upto digs digits of result - * HAC pp. 595, Algorithm 14.12 Modified so you can control how + * HAC pp. 595, Algorithm 14.12 Modified so you can control how * many digits of output are created. */ int s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) @@ -3073,7 +3073,7 @@ int s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) /* can we use the fast multiplier? */ if (((digs) < MP_WARRAY) && - MIN (a->used, b->used) < + MIN (a->used, b->used) < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { return fast_s_mp_mul_digs (a, b, c, digs); } @@ -3095,10 +3095,10 @@ int s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) /* setup some aliases */ /* copy of the digit from a used within the nested loop */ tmpx = a->dp[ix]; - + /* an alias for the destination shifted ix places */ tmpt = t.dp + ix; - + /* an alias for the digits of b */ tmpy = b->dp; @@ -3208,7 +3208,7 @@ int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) /* init M array */ /* init first cell */ if ((err = mp_init(&M[1])) != MP_OKAY) { - return err; + return err; } /* now init the second half of the array */ @@ -3226,7 +3226,7 @@ int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) if ((err = mp_init (&mu)) != MP_OKAY) { goto LBL_M; } - + if (redmode == 0) { if ((err = mp_reduce_setup (&mu, P)) != MP_OKAY) { goto LBL_MU; @@ -3237,22 +3237,22 @@ int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) goto LBL_MU; } redux = mp_reduce_2k_l; - } + } /* create M table * - * The M table contains powers of the base, + * The M table contains powers of the base, * e.g. M[x] = G**x mod P * - * The first half of the table is not + * The first half of the table is not * computed though accept for M[0] and M[1] */ if ((err = mp_mod (G, P, &M[1])) != MP_OKAY) { goto LBL_MU; } - /* compute the value at M[1<<(winsize-1)] by squaring - * M[1] (winsize-1) times + /* compute the value at M[1<<(winsize-1)] by squaring + * M[1] (winsize-1) times */ if ((err = mp_copy (&M[1], &M[(mp_digit)(1 << (winsize - 1))])) != MP_OKAY) { goto LBL_MU; @@ -3260,7 +3260,7 @@ int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) for (x = 0; x < (winsize - 1); x++) { /* square it */ - if ((err = mp_sqr (&M[(mp_digit)(1 << (winsize - 1))], + if ((err = mp_sqr (&M[(mp_digit)(1 << (winsize - 1))], &M[(mp_digit)(1 << (winsize - 1))])) != MP_OKAY) { goto LBL_MU; } @@ -3407,7 +3407,7 @@ LBL_M: int mp_reduce_setup (mp_int * a, mp_int * b) { int res; - + if ((res = mp_2expt (a, b->used * 2 * DIGIT_BIT)) != MP_OKAY) { return res; } @@ -3415,7 +3415,7 @@ int mp_reduce_setup (mp_int * a, mp_int * b) } -/* reduces x mod m, assumes 0 < x < m**2, mu is +/* reduces x mod m, assumes 0 < x < m**2, mu is * precomputed via mp_reduce_setup. * From HAC pp.604 Algorithm 14.42 */ @@ -3430,7 +3430,7 @@ int mp_reduce (mp_int * x, mp_int * m, mp_int * mu) } /* q1 = x / b**(k-1) */ - mp_rshd (&q, um - 1); + mp_rshd (&q, um - 1); /* according to HAC this optimization is ok */ if (((mp_word) um) > (((mp_digit)1) << (DIGIT_BIT - 1))) { @@ -3446,8 +3446,8 @@ int mp_reduce (mp_int * x, mp_int * m, mp_int * mu) if ((res = fast_s_mp_mul_high_digs (&q, mu, &q, um)) != MP_OKAY) { goto CLEANUP; } -#else - { +#else + { res = MP_VAL; goto CLEANUP; } @@ -3455,7 +3455,7 @@ int mp_reduce (mp_int * x, mp_int * m, mp_int * mu) } /* q3 = q2 / b**(k+1) */ - mp_rshd (&q, um + 1); + mp_rshd (&q, um + 1); /* x = x mod b**(k+1), quick (no division) */ if ((res = mp_mod_2d (x, DIGIT_BIT * (um + 1), x)) != MP_OKAY) { @@ -3487,7 +3487,7 @@ int mp_reduce (mp_int * x, mp_int * m, mp_int * mu) goto CLEANUP; } } - + CLEANUP: mp_clear (&q); @@ -3495,7 +3495,7 @@ CLEANUP: } -/* reduces a modulo n where n is of the form 2**p - d +/* reduces a modulo n where n is of the form 2**p - d This differs from reduce_2k since "d" can be larger than a single digit. */ @@ -3503,33 +3503,33 @@ int mp_reduce_2k_l(mp_int *a, mp_int *n, mp_int *d) { mp_int q; int p, res; - + if ((res = mp_init(&q)) != MP_OKAY) { return res; } - - p = mp_count_bits(n); + + p = mp_count_bits(n); top: /* q = a/2**p, a = a mod 2**p */ if ((res = mp_div_2d(a, p, &q, a)) != MP_OKAY) { goto ERR; } - + /* q = q * d */ - if ((res = mp_mul(&q, d, &q)) != MP_OKAY) { + if ((res = mp_mul(&q, d, &q)) != MP_OKAY) { goto ERR; } - + /* a = a + q */ if ((res = s_mp_add(a, &q, a)) != MP_OKAY) { goto ERR; } - + if (mp_cmp_mag(a, n) != MP_LT) { s_mp_sub(a, n, a); goto top; } - + ERR: mp_clear(&q); return res; @@ -3541,19 +3541,19 @@ int mp_reduce_2k_setup_l(mp_int *a, mp_int *d) { int res; mp_int tmp; - + if ((res = mp_init(&tmp)) != MP_OKAY) { return res; } - + if ((res = mp_2expt(&tmp, mp_count_bits(a))) != MP_OKAY) { goto ERR; } - + if ((res = s_mp_sub(&tmp, a, d)) != MP_OKAY) { goto ERR; } - + ERR: mp_clear(&tmp); return res; @@ -3650,17 +3650,17 @@ int fast_s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) if (pa > MP_WARRAY) return MP_RANGE; /* TAO range check */ - + #ifdef WOLFSSL_SMALL_STACK W = (mp_digit*)XMALLOC(sizeof(mp_digit) * MP_WARRAY, 0, DYNAMIC_TYPE_BIGINT); - if (W == NULL) + if (W == NULL) return MP_MEM; #endif /* number of output digits to produce */ pa = a->used + b->used; _W = 0; - for (ix = digs; ix < pa; ix++) { + for (ix = digs; ix < pa; ix++) { int tx, ty, iy; mp_digit *tmpx, *tmpy; @@ -3672,7 +3672,7 @@ int fast_s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) tmpx = a->dp + tx; tmpy = b->dp + ty; - /* this is the number of times the loop will iterrate, essentially its + /* this is the number of times the loop will iterrate, essentially its while (tx++ < a->used && ty-- >= 0) { ... } */ iy = MIN(a->used-tx, ty+1); @@ -3688,7 +3688,7 @@ int fast_s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) /* make next carry */ _W = _W >> ((mp_word)DIGIT_BIT); } - + /* setup dest */ olduse = c->used; c->used = pa; @@ -3723,7 +3723,7 @@ int mp_set_int (mp_int * a, unsigned long b) int x, res; mp_zero (a); - + /* set four bits at a time */ for (x = 0; x < 8; x++) { /* shift the number up four bits */ @@ -4036,13 +4036,13 @@ static int mp_div_d (mp_int * a, mp_digit b, mp_int * c, mp_digit * d) if ((res = mp_init_size(&q, a->used)) != MP_OKAY) { return res; } - + q.used = a->used; q.sign = a->sign; w = 0; for (ix = a->used - 1; ix >= 0; ix--) { w = (w << ((mp_word)DIGIT_BIT)) | ((mp_word)a->dp[ix]); - + if (w >= b) { t = (mp_digit)(w / b); w -= ((mp_word)t) * ((mp_word)b); @@ -4051,17 +4051,17 @@ static int mp_div_d (mp_int * a, mp_digit b, mp_int * c, mp_digit * d) } q.dp[ix] = (mp_digit)t; } - + if (d != NULL) { *d = (mp_digit)w; } - + if (c != NULL) { mp_clamp(&q); mp_exch(&q, c); } mp_clear(&q); - + return res; } @@ -4117,11 +4117,11 @@ const mp_digit ltm_prime_tab[] = { }; -/* Miller-Rabin test of "a" to the base of "b" as described in +/* Miller-Rabin test of "a" to the base of "b" as described in * HAC pp. 139 Algorithm 4.24 * * Sets result to 0 if definitely composite or 1 if probably prime. - * Randomly the chance of error is no more than 1/4 and often + * Randomly the chance of error is no more than 1/4 and often * very much lower. */ static int mp_prime_miller_rabin (mp_int * a, mp_int * b, int *result) @@ -4135,7 +4135,7 @@ static int mp_prime_miller_rabin (mp_int * a, mp_int * b, int *result) /* ensure b > 1 */ if (mp_cmp_d(b, 1) != MP_GT) { return MP_VAL; - } + } /* get n1 = a - 1 */ if ((err = mp_init_copy (&n1, a)) != MP_OKAY) { @@ -4200,7 +4200,7 @@ LBL_N1:mp_clear (&n1); } -/* determines if an integers is divisible by one +/* determines if an integers is divisible by one * of the first PRIME_SIZE primes or not * * sets result to 0 if not, 1 if yes @@ -4392,17 +4392,17 @@ int mp_gcd (mp_int * a, mp_int * b, mp_int * c) /* swap u and v to make sure v is >= u */ mp_exch(&u, &v); } - + /* subtract smallest from largest */ if ((res = s_mp_sub(&v, &u, &v)) != MP_OKAY) { goto LBL_V; } - + /* Divide out all factors of two */ if ((res = mp_div_2d(&v, mp_cnt_lsb(&v), &v, NULL)) != MP_OKAY) { goto LBL_V; - } - } + } + } /* multiply by 2**k which we divided out at the beginning */ if ((res = mp_mul_2d (&u, k, c)) != MP_OKAY) { @@ -4439,8 +4439,8 @@ int mp_read_radix (mp_int * a, const char *str, int radix) return MP_VAL; } - /* if the leading digit is a - * minus set the sign to negative. + /* if the leading digit is a + * minus set the sign to negative. */ if (*str == '-') { ++str; @@ -4451,7 +4451,7 @@ int mp_read_radix (mp_int * a, const char *str, int radix) /* set the integer to the default of zero */ mp_zero (a); - + /* process each digit of the string */ while (*str) { /* if the radix < 36 the conversion is case insensitive @@ -4465,9 +4465,9 @@ int mp_read_radix (mp_int * a, const char *str, int radix) } } - /* if the char was found in the map + /* if the char was found in the map * and is less than the given radix add it - * to the number, otherwise exit the loop. + * to the number, otherwise exit the loop. */ if (y < radix) { if ((res = mp_mul_d (a, (mp_digit) radix, a)) != MP_OKAY) { @@ -4481,7 +4481,7 @@ int mp_read_radix (mp_int * a, const char *str, int radix) } ++str; } - + /* set the sign only if a != 0 */ if (mp_iszero(a) != 1) { a->sign = neg; From ed655653906fd955be02599d7bb83a219eacbdc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moise=CC=81s=20Guimara=CC=83es?= Date: Thu, 28 May 2015 17:11:29 -0300 Subject: [PATCH 105/350] integer.c: refactoring mp_exptmod_fast to reduce stack usage: --- variable M moved to the heap (512 bytes saved) --- wolfcrypt/src/integer.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/wolfcrypt/src/integer.c b/wolfcrypt/src/integer.c index ecf117c43..b3ce4203e 100644 --- a/wolfcrypt/src/integer.c +++ b/wolfcrypt/src/integer.c @@ -1721,16 +1721,27 @@ int mp_dr_is_modulus(mp_int *a) int mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) { - mp_int M[TAB_SIZE], res; + mp_int res; mp_digit buf, mp; int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; - +#ifdef WOLFSSL_SMALL_STACK + mp_int* M = NULL; +#else + mp_int M[TAB_SIZE]; +#endif /* use a pointer to the reduction algorithm. This allows us to use * one of many reduction algorithms without modding the guts of * the code with if statements everywhere. */ int (*redux)(mp_int*,mp_int*,mp_digit); +#ifdef WOLFSSL_SMALL_STACK + M = (mp_int*) XMALLOC(sizeof(mp_int) * TAB_SIZE, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (M == NULL) + return MP_MEM; +#endif + /* find window size */ x = mp_count_bits (X); if (x <= 7) { @@ -1758,6 +1769,10 @@ int mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, /* init M array */ /* init first cell */ if ((err = mp_init(&M[1])) != MP_OKAY) { +#ifdef WOLFSSL_SMALL_STACK + XFREE(M, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return err; } @@ -1768,6 +1783,11 @@ int mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, mp_clear (&M[y]); } mp_clear(&M[1]); + +#ifdef WOLFSSL_SMALL_STACK + XFREE(M, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return err; } } @@ -2002,6 +2022,11 @@ LBL_M: for (x = 1<<(winsize-1); x < (1 << winsize); x++) { mp_clear (&M[x]); } + +#ifdef WOLFSSL_SMALL_STACK + XFREE(M, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return err; } From 3d41595ed490b305ee3c2c99dbadf4aae1c88bc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moise=CC=81s=20Guimara=CC=83es?= Date: Fri, 29 May 2015 12:02:06 -0300 Subject: [PATCH 106/350] internal.c: refactoring TimingPadVerify to reduce stack usage: --- variable dummy replaced with ssl object (~250 bytes saved) internal.c: refactoring VerifyMac to reduce stack usage: --- variable dummy replaced with ssl object (~250 bytes saved) --- src/internal.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/internal.c b/src/internal.c index d69cc114b..d31ba9fcf 100644 --- a/src/internal.c +++ b/src/internal.c @@ -6062,11 +6062,10 @@ static int TimingPadVerify(WOLFSSL* ssl, const byte* input, int padLen, int t, int pLen, int content) { byte verify[MAX_DIGEST_SIZE]; - byte dummy[MAX_PAD_SIZE]; + byte dmy[sizeof(WOLFSSL) >= MAX_PAD_SIZE ? 1 : MAX_PAD_SIZE] = {0}; + byte* dummy = sizeof(dmy) < MAX_PAD_SIZE ? (byte*) ssl : dmy; int ret = 0; - XMEMSET(dummy, 1, sizeof(dummy)); - if ( (t + padLen + 1) > pLen) { WOLFSSL_MSG("Plain Len not long enough for pad/mac"); PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE); @@ -6300,9 +6299,8 @@ static INLINE int VerifyMac(WOLFSSL* ssl, const byte* input, word32 msgSz, else { /* sslv3, some implementations have bad padding, but don't * allow bad read */ int badPadLen = 0; - byte dummy[MAX_PAD_SIZE]; - - XMEMSET(dummy, 1, sizeof(dummy)); + byte dmy[sizeof(WOLFSSL) >= MAX_PAD_SIZE ? 1 : MAX_PAD_SIZE] = {0}; + byte* dummy = sizeof(dmy) < MAX_PAD_SIZE ? (byte*) ssl : dmy; if (pad > (msgSz - digestSz - 1)) { WOLFSSL_MSG("Plain Len not long enough for pad/mac"); From 644f7a4cdbe671968ffd5073cf883b67e89e7327 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Mon, 1 Jun 2015 14:32:36 +0900 Subject: [PATCH 107/350] ti-hash.c included in wc_port.c --- wolfcrypt/src/md5.c | 3 +-- wolfcrypt/src/port/ti/ti-hash.c | 8 ++++---- wolfcrypt/src/sha.c | 3 +-- wolfcrypt/src/sha256.c | 6 +----- wolfcrypt/src/wc_port.c | 3 ++- 5 files changed, 9 insertions(+), 14 deletions(-) diff --git a/wolfcrypt/src/md5.c b/wolfcrypt/src/md5.c index 02a24ec15..fbf732add 100644 --- a/wolfcrypt/src/md5.c +++ b/wolfcrypt/src/md5.c @@ -29,8 +29,7 @@ #if !defined(NO_MD5) #if defined(WOLFSSL_TI_HASH) - #define WOLFSSL_TI_MD5 - #include + /* #include included by wc_port.c */ #else #ifdef WOLFSSL_PIC32MZ_HASH diff --git a/wolfcrypt/src/port/ti/ti-hash.c b/wolfcrypt/src/port/ti/ti-hash.c index f2885298f..4b7f49a20 100644 --- a/wolfcrypt/src/port/ti/ti-hash.c +++ b/wolfcrypt/src/port/ti/ti-hash.c @@ -144,7 +144,7 @@ static int hashHash(const byte* data, word32 len, byte* hash, word32 algo, word3 return ret; } -#if !defined(NO_MD5) && defined(WOLFSSL_TI_MD5) +#if !defined(NO_MD5) WOLFSSL_API void wc_InitMd5(Md5* md5) { if (md5 == NULL) @@ -175,7 +175,7 @@ WOLFSSL_API int wc_Md5Hash(const byte*data, word32 len, byte*hash) #endif /* NO_MD5 */ -#if !defined(NO_SHA) && defined(WOLFSSL_TI_SHA) +#if !defined(NO_SHA) WOLFSSL_API int wc_InitSha(Sha* sha) { if (sha == NULL) @@ -206,7 +206,7 @@ WOLFSSL_API int wc_ShaHash(const byte*data, word32 len, byte*hash) #endif /* NO_SHA */ -#if defined(HAVE_SHA224) && defined(WOLFSSL_TI_SHA224) +#if defined(HAVE_SHA224) WOLFSSL_API int wc_InitSha224(Sha224* sha224) { if (sha224 == NULL) @@ -237,7 +237,7 @@ WOLFSSL_API int wc_Sha224Hash(const byte* data, word32 len, byte*hash) #endif /* HAVE_SHA224 */ -#if !defined(NO_SHA256) && defined(WOLFSSL_TI_SHA256) +#if !defined(NO_SHA256) WOLFSSL_API int wc_InitSha256(Sha256* sha256) { if (sha256 == NULL) diff --git a/wolfcrypt/src/sha.c b/wolfcrypt/src/sha.c index f710603cb..be8cf17af 100644 --- a/wolfcrypt/src/sha.c +++ b/wolfcrypt/src/sha.c @@ -65,8 +65,7 @@ #else /* else build without fips */ #if defined(WOLFSSL_TI_HASH) - #define WOLFSSL_TI_SHA - #include + /* #include included by wc_port.c */ #else #ifdef WOLFSSL_PIC32MZ_HASH diff --git a/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c index bc40798de..f9f02b003 100644 --- a/wolfcrypt/src/sha256.c +++ b/wolfcrypt/src/sha256.c @@ -57,11 +57,7 @@ int wc_Sha256Hash(const byte* data, word32 len, byte* out) #else /* else build without fips */ #if !defined(NO_SHA256) && defined(WOLFSSL_TI_HASH) - #define WOLFSSL_TI_SHA256 - #ifdef HAVE_SHA224 - #define WOLFSSL_TI_SHA224 - #endif - #include + /* #include included by wc_port.c */ #else #if !defined (ALIGN32) diff --git a/wolfcrypt/src/wc_port.c b/wolfcrypt/src/wc_port.c index 953a16be4..419033751 100644 --- a/wolfcrypt/src/wc_port.c +++ b/wolfcrypt/src/wc_port.c @@ -651,5 +651,6 @@ int UnLockMutex(wolfSSL_Mutex *m) #endif /* SINGLE_THREADED */ #if defined(WOLFSSL_TI_CRYPT) || defined(WOLFSSL_TI_HASH) - #include /* initialize and Mutex for TI Crypt Engine */ + #include /* initialize and Mutex for TI Crypt Engine */ + #include /* md5, sha1, sha224, sha256 */ #endif From fe3253e618e86cb5a87f5fc4dc86cc39bb3e126d Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Mon, 1 Jun 2015 20:02:20 +0900 Subject: [PATCH 108/350] IAR/EWARM wolfSSL name change --- .../Projects/CyaSSL-Lib/CyaSSL-Lib.eww | 16 - .../CyaSSL-Lib/wolfCrypt-benchmark.ewp | 1877 ----------------- .../CyaSSL-Lib/wolfCrypt-benchmark.icf | 32 - .../Projects/CyaSSL-Lib/wolfCrypt-test.ewp | 1877 ----------------- .../Projects/CyaSSL-Lib/wolfCrypt-test.icf | 31 - .../benchmark-main.c | 8 +- .../Projects/benchmark/current_time.c | 66 + .../wolfCrypt-benchmark.ewd | 1457 +------------ .../benchmark/wolfCrypt-benchmark.ewp | 981 +++++++++ .../Projects/common/minimum-startup.c | 52 + IDE/IAR-EWARM/Projects/common/wolfssl.icf | 11 + .../wolfSSL-Lib.ewd} | 200 +- .../CyaSSL-Lib.ewp => lib/wolfSSL-Lib.ewp} | 314 +-- .../Projects/{CyaSSL-Lib => test}/test-main.c | 5 +- .../Projects/test/wolfCrypt-test.ewd | 1374 ++++++++++++ .../Projects/test/wolfCrypt-test.ewp | 978 +++++++++ IDE/IAR-EWARM/Projects/user_settings.h | 14 + IDE/IAR-EWARM/Projects/wolfssl.eww | 224 ++ IDE/IAR-EWARM/README | 28 +- wolfcrypt/benchmark/benchmark.c | 2 +- wolfssl/wolfcrypt/settings.h | 11 - 21 files changed, 4171 insertions(+), 5387 deletions(-) delete mode 100644 IDE/IAR-EWARM/Projects/CyaSSL-Lib/CyaSSL-Lib.eww delete mode 100644 IDE/IAR-EWARM/Projects/CyaSSL-Lib/wolfCrypt-benchmark.ewp delete mode 100644 IDE/IAR-EWARM/Projects/CyaSSL-Lib/wolfCrypt-benchmark.icf delete mode 100644 IDE/IAR-EWARM/Projects/CyaSSL-Lib/wolfCrypt-test.ewp delete mode 100644 IDE/IAR-EWARM/Projects/CyaSSL-Lib/wolfCrypt-test.icf rename IDE/IAR-EWARM/Projects/{CyaSSL-Lib => benchmark}/benchmark-main.c (88%) create mode 100644 IDE/IAR-EWARM/Projects/benchmark/current_time.c rename IDE/IAR-EWARM/Projects/{CyaSSL-Lib => benchmark}/wolfCrypt-benchmark.ewd (50%) create mode 100644 IDE/IAR-EWARM/Projects/benchmark/wolfCrypt-benchmark.ewp create mode 100644 IDE/IAR-EWARM/Projects/common/minimum-startup.c create mode 100644 IDE/IAR-EWARM/Projects/common/wolfssl.icf rename IDE/IAR-EWARM/Projects/{CyaSSL-Lib/wolfCrypt-test.ewd => lib/wolfSSL-Lib.ewd} (94%) rename IDE/IAR-EWARM/Projects/{CyaSSL-Lib/CyaSSL-Lib.ewp => lib/wolfSSL-Lib.ewp} (91%) rename IDE/IAR-EWARM/Projects/{CyaSSL-Lib => test}/test-main.c (93%) create mode 100644 IDE/IAR-EWARM/Projects/test/wolfCrypt-test.ewd create mode 100644 IDE/IAR-EWARM/Projects/test/wolfCrypt-test.ewp create mode 100644 IDE/IAR-EWARM/Projects/user_settings.h create mode 100644 IDE/IAR-EWARM/Projects/wolfssl.eww diff --git a/IDE/IAR-EWARM/Projects/CyaSSL-Lib/CyaSSL-Lib.eww b/IDE/IAR-EWARM/Projects/CyaSSL-Lib/CyaSSL-Lib.eww deleted file mode 100644 index 9702cae02..000000000 --- a/IDE/IAR-EWARM/Projects/CyaSSL-Lib/CyaSSL-Lib.eww +++ /dev/null @@ -1,16 +0,0 @@ - - - - - $WS_DIR$\CyaSSL-Lib.ewp - - - $WS_DIR$\wolfCrypt-benchmark.ewp - - - $WS_DIR$\wolfCrypt-test.ewp - - - - - diff --git a/IDE/IAR-EWARM/Projects/CyaSSL-Lib/wolfCrypt-benchmark.ewp b/IDE/IAR-EWARM/Projects/CyaSSL-Lib/wolfCrypt-benchmark.ewp deleted file mode 100644 index d61e0a0e9..000000000 --- a/IDE/IAR-EWARM/Projects/CyaSSL-Lib/wolfCrypt-benchmark.ewp +++ /dev/null @@ -1,1877 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - General - 3 - - 22 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 29 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - BILINK - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 22 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 29 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - BILINK - 0 - - - - - $PROJ_DIR$\benchmark-main.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\benchmark\benchmark.c - - - - diff --git a/IDE/IAR-EWARM/Projects/CyaSSL-Lib/wolfCrypt-benchmark.icf b/IDE/IAR-EWARM/Projects/CyaSSL-Lib/wolfCrypt-benchmark.icf deleted file mode 100644 index a4ab009ee..000000000 --- a/IDE/IAR-EWARM/Projects/CyaSSL-Lib/wolfCrypt-benchmark.icf +++ /dev/null @@ -1,32 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0007FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x2000FFFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x2000; -define symbol __ICFEDIT_size_heap__ = 0x2000; -/**** End of ICF editor section. ###ICF###*/ - - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -//initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -place in ROM_region { readonly }; -place in RAM_region { readwrite, - block CSTACK, block HEAP }; \ No newline at end of file diff --git a/IDE/IAR-EWARM/Projects/CyaSSL-Lib/wolfCrypt-test.ewp b/IDE/IAR-EWARM/Projects/CyaSSL-Lib/wolfCrypt-test.ewp deleted file mode 100644 index 60e146e43..000000000 --- a/IDE/IAR-EWARM/Projects/CyaSSL-Lib/wolfCrypt-test.ewp +++ /dev/null @@ -1,1877 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - General - 3 - - 22 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 29 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 9 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 16 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - BILINK - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 22 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 29 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 9 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 16 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - BILINK - 0 - - - - - $PROJ_DIR$\test-main.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\test\test.c - - - - diff --git a/IDE/IAR-EWARM/Projects/CyaSSL-Lib/wolfCrypt-test.icf b/IDE/IAR-EWARM/Projects/CyaSSL-Lib/wolfCrypt-test.icf deleted file mode 100644 index 211d253d4..000000000 --- a/IDE/IAR-EWARM/Projects/CyaSSL-Lib/wolfCrypt-test.icf +++ /dev/null @@ -1,31 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x0; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x0; -define symbol __ICFEDIT_region_ROM_end__ = 0x000FFFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x1FFF0000; -define symbol __ICFEDIT_region_RAM_end__ = 0x2000FFFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x2000; -define symbol __ICFEDIT_size_heap__ = 0x3000; -/**** End of ICF editor section. ###ICF###*/ - - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; - -place in ROM_region { readonly }; -place in RAM_region { readwrite, - block CSTACK, block HEAP }; \ No newline at end of file diff --git a/IDE/IAR-EWARM/Projects/CyaSSL-Lib/benchmark-main.c b/IDE/IAR-EWARM/Projects/benchmark/benchmark-main.c similarity index 88% rename from IDE/IAR-EWARM/Projects/CyaSSL-Lib/benchmark-main.c rename to IDE/IAR-EWARM/Projects/benchmark/benchmark-main.c index 113fc4d23..d8f559d4c 100644 --- a/IDE/IAR-EWARM/Projects/CyaSSL-Lib/benchmark-main.c +++ b/IDE/IAR-EWARM/Projects/benchmark/benchmark-main.c @@ -19,7 +19,11 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ -#include "stdio.h" +#ifdef HAVE_CONFIG_H + #include +#endif + +#include typedef struct func_args { int argc; @@ -29,6 +33,7 @@ typedef struct func_args { func_args args = { 0 } ; +extern double current_time(int reset) ; extern int benchmark_test(void *args) ; main(void) { @@ -37,4 +42,3 @@ main(void) { } - diff --git a/IDE/IAR-EWARM/Projects/benchmark/current_time.c b/IDE/IAR-EWARM/Projects/benchmark/current_time.c new file mode 100644 index 000000000..7d42cfc02 --- /dev/null +++ b/IDE/IAR-EWARM/Projects/benchmark/current_time.c @@ -0,0 +1,66 @@ +/* current-time.c + * + * Copyright (C) 2006-2015 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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. + * + * wolfSSL 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 + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#ifdef WOLFSSL_TI_CURRTIME +#include +#include +#include + +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_timer.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/timer.h" + +void InitTimer(void) { + uint32_t ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | + SYSCTL_OSC_MAIN | + SYSCTL_USE_PLL | + SYSCTL_CFG_VCO_480), 120000000); + + printf("Clock=%dMHz\n", ui32SysClock/1000000) ; + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); + ROM_TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC); + ROM_TimerLoadSet(TIMER0_BASE, TIMER_A, -1); + ROM_TimerEnable(TIMER0_BASE, TIMER_A); +} + +static int initFlag = false ; +double current_time(int reset) +{ + if(!initFlag)InitTimer() ; + initFlag = true ; + if(reset)ROM_TimerLoadSet(TIMER0_BASE, TIMER_A, -1); + return (double)(-(int)ROM_TimerValueGet(TIMER0_BASE, TIMER_A ))/120000000.0 ; +} + +#else + +double current_time(int reset) { return 0.0 ; } + +#endif \ No newline at end of file diff --git a/IDE/IAR-EWARM/Projects/CyaSSL-Lib/wolfCrypt-benchmark.ewd b/IDE/IAR-EWARM/Projects/benchmark/wolfCrypt-benchmark.ewd similarity index 50% rename from IDE/IAR-EWARM/Projects/CyaSSL-Lib/wolfCrypt-benchmark.ewd rename to IDE/IAR-EWARM/Projects/benchmark/wolfCrypt-benchmark.ewd index 0bf90e8eb..3f908a2d3 100644 --- a/IDE/IAR-EWARM/Projects/CyaSSL-Lib/wolfCrypt-benchmark.ewd +++ b/IDE/IAR-EWARM/Projects/benchmark/wolfCrypt-benchmark.ewd @@ -12,7 +12,7 @@ C-SPY 2 - 25 + 26 1 1 + + + + + + @@ -245,7 +269,7 @@ @@ -421,7 +469,7 @@ - - - - IARROM_ID - 2 - - 1 - 1 - 1 - - - - - - - - - IJET_ID - 2 - - 2 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - JLINK_ID - 2 - - 15 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LMIFTDI_ID - 2 - - 2 - 1 - 1 - - - - - - - - - - MACRAIGOR_ID - 2 - - 3 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - PEMICRO_ID - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - RDI_ID - 2 - - 2 - 1 - 1 - - - - - - - - - - - - - - - - STLINK_ID - 2 - - 2 - 1 - 1 - - - - - - - - - - - THIRDPARTY_ID - 2 - - 0 - 1 - 1 - - - - - - - - XDS100_ID - 2 - - 2 - 1 - 1 - - - - - - - - - - - - - $TOOLKIT_DIR$\plugins\middleware\HCCWare\HCCWare.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\AVIX\AVIX.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\MQX\MQXRtosPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\Quadros\Quadros_EWB6_Plugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin - 0 - - - $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin - 0 - - - $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin - 1 - - - $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin - 0 - - - $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin - 1 - - - $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin - 0 - - - - - Release - - ARM - - 0 - - C-SPY - 2 - - 25 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARMSIM_ID - 2 - - 1 - 1 - 0 - - - - - - - - ANGEL_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - - CMSISDAP_ID - 2 - - 0 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GDBSERVER_ID - 2 - - 0 - 1 - 0 - - - - - - - @@ -1740,14 +491,14 @@ 1 1 - 0 + 1 @@ -1971,7 +744,7 @@ 15 1 - 0 + 1 @@ -257,7 +281,7 @@ CMSISDAP_ID 2 - 0 + 2 1 1 + + + + + + @@ -472,7 +520,7 @@ IJET_ID 2 - 2 + 3 1 1 + @@ -677,7 +729,7 @@ 1 @@ -1554,7 +1626,7 @@ CMSISDAP_ID 2 - 0 + 2 1 0 + + + + + + @@ -1769,7 +1865,7 @@ IJET_ID 2 - 2 + 3 1 0 + @@ -1974,7 +2074,7 @@ 0 @@ -602,6 +612,7 @@ + 0 @@ -924,7 +935,7 @@ @@ -961,7 +972,7 @@ - CyaSSL + Config + + $PROJ_DIR$\..\..\..\..\wolfssl\wolfcrypt\settings.h + + + $PROJ_DIR$\..\user_settings.h + + + + wolfCrypt + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\aes.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\arc4.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\asm.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\asn.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\blake2b.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\camellia.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\chacha.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\chacha20_poly1305.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\coding.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\compress.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\curve25519.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\des3.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\dh.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\dsa.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\ecc.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\ecc_fp.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\ed25519.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\error.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\fe_operations.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\ge_operations.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\hc128.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\hmac.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\integer.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\logging.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\md2.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\md4.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\md5.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\memory.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\misc.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\pkcs7.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\poly1305.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\pwdbased.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\rabbit.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\random.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\ripemd.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\rsa.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\sha.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\sha256.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\sha512.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\tfm.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\src\wc_port.c + + + + wolfSSL $PROJ_DIR$\..\..\..\..\src\crl.c @@ -1893,108 +2049,6 @@ $PROJ_DIR$\..\..\..\..\src\tls.c - - wolfCrypt - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\aes.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\arc4.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\asm.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\asn.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\blake2b.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\camellia.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\coding.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\compress.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\des3.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\dh.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\dsa.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\ecc.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\ecc_fp.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\error.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\hc128.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\hmac.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\integer.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\logging.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\md2.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\md4.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\md5.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\memory.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\misc.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\wc_port.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\pwdbased.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\rabbit.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\random.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\ripemd.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\rsa.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\sha.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\sha256.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\sha512.c - - - $PROJ_DIR$\..\..\..\..\ctaocrypt\src\tfm.c - - diff --git a/IDE/IAR-EWARM/Projects/CyaSSL-Lib/test-main.c b/IDE/IAR-EWARM/Projects/test/test-main.c similarity index 93% rename from IDE/IAR-EWARM/Projects/CyaSSL-Lib/test-main.c rename to IDE/IAR-EWARM/Projects/test/test-main.c index 5ebfe3219..ad78746d5 100644 --- a/IDE/IAR-EWARM/Projects/CyaSSL-Lib/test-main.c +++ b/IDE/IAR-EWARM/Projects/test/test-main.c @@ -28,9 +28,10 @@ typedef struct func_args { func_args args = { 0 } ; -extern int ctaocrypt_test(void *args) ; +extern int wolfcrypt_test(void *args) ; main(void) { - ctaocrypt_test(&args) ; + wolfcrypt_test(&args) ; return 0; } + diff --git a/IDE/IAR-EWARM/Projects/test/wolfCrypt-test.ewd b/IDE/IAR-EWARM/Projects/test/wolfCrypt-test.ewd new file mode 100644 index 000000000..3f908a2d3 --- /dev/null +++ b/IDE/IAR-EWARM/Projects/test/wolfCrypt-test.ewd @@ -0,0 +1,1374 @@ + + + + 2 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 26 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + CMSISDAP_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 1 + 1 + 1 + + + + + + + + + IJET_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + MACRAIGOR_ID + 2 + + 3 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + PEMICRO_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + STLINK_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + XDS100_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\middleware\HCCWare\HCCWare.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\AVIX\AVIX.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\MQX\MQXRtosPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Quadros\Quadros_EWB7_Plugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + + diff --git a/IDE/IAR-EWARM/Projects/test/wolfCrypt-test.ewp b/IDE/IAR-EWARM/Projects/test/wolfCrypt-test.ewp new file mode 100644 index 000000000..ec45ce948 --- /dev/null +++ b/IDE/IAR-EWARM/Projects/test/wolfCrypt-test.ewp @@ -0,0 +1,978 @@ + + + + 2 + + Debug + + ARM + + 1 + + General + 3 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Config + + $PROJ_DIR$\..\user_settings.h + + + + Lib + + $PROJ_DIR$\..\lib\ewarm\Exe\wolfSSL-Lib.a + + + + Source + + $PROJ_DIR$\..\common\minimum-startup.c + + + $PROJ_DIR$\test-main.c + + + $PROJ_DIR$\..\..\..\..\wolfcrypt\test\test.c + + + + + diff --git a/IDE/IAR-EWARM/Projects/user_settings.h b/IDE/IAR-EWARM/Projects/user_settings.h new file mode 100644 index 000000000..5e4f36e9a --- /dev/null +++ b/IDE/IAR-EWARM/Projects/user_settings.h @@ -0,0 +1,14 @@ + +#define NO_MAIN_DRIVER +#define BENCH_EMBEDDED +#define SINGLE_THREADED +#define NO_FILESYSTEM +#define NO_WRITEV +#define WOLFSSL_USER_IO +#define NO_DEV_RANDOM +#define USE_CERT_BUFFERS_2048 +#define WOLFSSL_USER_CURRTIME + +#define CUSTOM_RAND_GENERATE custom_rand_generate +/* warning "write a real random seed!!!!, just for testing now" */ +static int custom_rand_generate(void) { return 0 ; } \ No newline at end of file diff --git a/IDE/IAR-EWARM/Projects/wolfssl.eww b/IDE/IAR-EWARM/Projects/wolfssl.eww new file mode 100644 index 000000000..b080e4115 --- /dev/null +++ b/IDE/IAR-EWARM/Projects/wolfssl.eww @@ -0,0 +1,224 @@ + + + + + $WS_DIR$\benchmark\wolfCrypt-benchmark.ewp + + + $WS_DIR$\test\wolfCrypt-test.ewp + + + $WS_DIR$\lib\wolfSSL-Lib.ewp + + + + All Examples + + driverlib + Debug + + + grlib + Debug + + + usblib + Debug + + + aes128_cbc_decrypt + Debug + + + aes128_cbc_encrypt + Debug + + + aes128_ccm_decrypt + Debug + + + aes128_ccm_encrypt + Debug + + + aes128_cmac + Debug + + + aes128_ecb_decrypt + Debug + + + aes128_ecb_encrypt + Debug + + + aes128_gcm_decrypt + Debug + + + aes128_gcm_encrypt + Debug + + + bitband + Debug + + + blinky + Debug + + + boot_demo_uart + Debug + + + boot_demo_usb + Debug + + + calibrate + Debug + + + crc32 + Debug + + + enet_io + Debug + + + enet_lwip + Debug + + + enet_uip + Debug + + + fontview + Debug + + + gpio_jtag + Debug + + + grlib_demo + Debug + + + hello + Debug + + + hello_widget + Debug + + + hibernate + Debug + + + interrupts + Debug + + + lang_demo + Debug + + + mpu_fault + Debug + + + qs_weather + Debug + + + scribble + Debug + + + sd_card + Debug + + + sha1_hash + Debug + + + sha1_hmac + Debug + + + synth + Debug + + + tamper + Debug + + + tdes_cbc_decrypt + Debug + + + tdes_cbc_encrypt + Debug + + + timers + Debug + + + uart_echo + Debug + + + udma_demo + Debug + + + usb_dev_bulk + Debug + + + usb_dev_keyboard + Debug + + + usb_dev_msc + Debug + + + usb_host_hub + Debug + + + usb_host_msc + Debug + + + usb_otg_mouse + Debug + + + usb_stick_demo + Debug + + + usb_stick_update + Debug + + + watchdog + Debug + + + + + + diff --git a/IDE/IAR-EWARM/README b/IDE/IAR-EWARM/README index f393cae30..2731104ea 100644 --- a/IDE/IAR-EWARM/README +++ b/IDE/IAR-EWARM/README @@ -7,38 +7,38 @@ In order to generate project for specific target MPU, take following steps. Included Project Files ----------------------- -1. Workspace: CyaSSL-Lib.eww - The workspace includes CyaSSL-Lib library and wolfCrypt-test, wolfCrypt-benchmark - executable projects. The library project generates full set library of wolfCrypt - and CyaSSL functions. +1. Workspace: wolfssl.eww + The workspace includes wolfSSL-Lib library and wolfCrypt-test, wolfCrypt-benchmark + executable projects. -2. Test suites Project: wolfCrypt-test.ewp +2. wolfSSL-Lib Project: lib/wolfSSL-lib.ewp + generates full set library of wolfCrypt and wolfSSL functions. + +3. Test suites Project: test/wolfCrypt-test.ewp generates test.out test suites executable -3. Benchmark Project: wolfCrypt-benchmark.ewp +4. Benchmark Project: benchmark/wolfCrypt-benchmark.ewp generates benchmark.out benchmark executable Set Up Steps ------------ 0. Default Setting Default Target of the projects are set to Cortex-M3 Simulator. - For check the projects, you can build and download to the simulator. + user_settings.h includes default options for the projects. + You can build and download the to the simulator. Open Terminal I/O window, by "view"->"Terminal I/O", and start execution. 1. Project option settings For each project,... General Options: Choose appropriate "Target" options - For executable projects,... +2. For executable projects,... Add "SystemInit" and "startup" for your MPU Debugger: Choose your debug "Driver" -2. For benchmark project,... - Write your own "current_time" benchmark timer under "defined(CYASSL_IAR_ARM)" in benchmark.c - -3. settings.h - Uncomment the "CYASSL_IAR_ARM" define located in: - /cyassl/ctaocrypt/settings. +3. For benchmark project,... + Choose option for current_time function. + Or write own "current_time" benchmark timer with WOLFSSL_USER_CURRTIME option. 4. Build and download Go to "Project->Make" and "Download and Debug" in Menu bar for EWARM build and download. diff --git a/wolfcrypt/benchmark/benchmark.c b/wolfcrypt/benchmark/benchmark.c index 838a80e34..f284774f3 100644 --- a/wolfcrypt/benchmark/benchmark.c +++ b/wolfcrypt/benchmark/benchmark.c @@ -1846,7 +1846,7 @@ void bench_ed25519KeySign(void) return ( ns / CLOCK * 2.0); } -#elif defined(WOLFSSL_IAR_ARM_TIME) || defined (WOLFSSL_MDK_ARM) || defined(WOLFSSL_USER_TIME) +#elif defined(WOLFSSL_IAR_ARM_TIME) || defined (WOLFSSL_MDK_ARM) || defined(WOLFSSL_USER_CURRTIME) extern double current_time(int reset); #elif defined FREERTOS diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index 8148c40a2..f59ef5180 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -153,17 +153,6 @@ #define NO_FILESYSTEM #endif -#if defined(WOLFSSL_IAR_ARM) - #define NO_MAIN_DRIVER - #define SINGLE_THREADED - #define USE_CERT_BUFFERS_1024 - #define BENCH_EMBEDDED - #define NO_FILESYSTEM - #define NO_WRITEV - #define WOLFSSL_USER_IO - #define BENCH_EMBEDDED -#endif - #ifdef MICROCHIP_PIC32 /* #define WOLFSSL_MICROCHIP_PIC32MZ */ #define SIZEOF_LONG_LONG 8 From defd1f9f9426cf9df9a8e77332442605e15a6d84 Mon Sep 17 00:00:00 2001 From: Chris Conlon Date: Tue, 2 Jun 2015 21:58:23 -0600 Subject: [PATCH 109/350] add configure option for wolfSSL JNI, --enable-jni --- configure.ac | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/configure.ac b/configure.ac index 4197c9304..f15b552c5 100644 --- a/configure.ac +++ b/configure.ac @@ -1878,6 +1878,75 @@ fi AM_CONDITIONAL([BUILD_MCAPI], [test "x$ENABLED_MCAPI" = "xyes"]) +# wolfSSL JNI +AC_ARG_ENABLE([jni], + [ --enable-jni Enable wolfSSL JNI (default: disabled)], + [ ENABLED_JNI=$enableval ], + [ ENABLED_JNI=no ] + ) +if test "$ENABLED_JNI" = "yes" +then + # Enable prereqs if not already enabled + if test "x$ENABLED_DTLS" = "xno" + then + ENABLED_DTLS="yes" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_DTLS" + fi + if test "x$ENABLED_OPENSSLEXTRA" = "xno" + then + ENABLED_OPENSSLEXTRA="yes" + AM_CFLAGS="$AM_CFLAGS -DOPENSSL_EXTRA" + fi + if test "x$ENABLED_CRL" = "xno" + then + ENABLED_CRL="yes" + AM_CFLAGS="$AM_CFLAGS -DHAVE_CRL" + AM_CONDITIONAL([BUILD_CRL], [test "x$ENABLED_CRL" = "xyes"]) + fi + if test "x$ENABLED_OCSP" = "xno" + then + ENABLED_OCSP="yes" + AM_CFLAGS="$AM_CFLAGS -DHAVE_OCSP" + AM_CONDITIONAL([BUILD_OCSP], [test "x$ENABLED_OCSP" = "xyes"]) + fi + if test "x$ENABLED_CRL_MONITOR" = "xno" + then + ENABLED_CRL_MONITOR="yes" + AM_CFLAGS="$AM_CFLAGS -DHAVE_CRL_MONITOR" + fi + if test "x$ENABLED_SAVESESSION" = "xno" + then + ENABLED_SAVESESSION="yes" + AM_CFLAGS="$AM_CFLAGS -DPERSIST_SESSION_CACHE" + fi + if test "x$ENABLED_SAVECERT" = "xno" + then + ENABLED_SAVECERT="yes" + AM_CFLAGS="$AM_CFLAGS -DPERSIST_CERT_CACHE" + fi + if test "x$ENABLED_ATOMICUSER" = "xno" + then + ENABLED_ATOMICUSER="yes" + AM_CFLAGS="$AM_CFLAGS -DATOMIC_USER" + fi + if test "x$ENABLED_ECC" = "xno" + then + ENABLED_ECC="yes" + AM_CFLAGS="$AM_CFLAGS -DHAVE_ECC" + fi + if test "x$ENABLED_PKCALLBACKS" = "xno" + then + ENABLED_PKCALLBACKS="yes" + AM_CFLAGS="$AM_CFLAGS -DHAVE_PK_CALLBACKS" + fi + if test "x$ENABLED_DH" = "xno" + then + ENABLED_DH="yes" + AM_CFLAGS="$AM_CFLAGS -DHAVE_DH" + fi +fi + + # Check for build-type conflicts AS_IF([test "x$ENABLED_MAXSTRENGTH" = "xyes" && \ test "x$ENABLED_LEANPSK" = "xyes"], From 7584af3d368cddba89d07a94104db3e5c70884f0 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Fri, 5 Jun 2015 13:23:54 +0900 Subject: [PATCH 110/350] Adding hash.c --- .../Projects/benchmark/ewarm/Exe/benchmark.sim | Bin 0 -> 79551 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 IDE/IAR-EWARM/Projects/benchmark/ewarm/Exe/benchmark.sim diff --git a/IDE/IAR-EWARM/Projects/benchmark/ewarm/Exe/benchmark.sim b/IDE/IAR-EWARM/Projects/benchmark/ewarm/Exe/benchmark.sim new file mode 100644 index 0000000000000000000000000000000000000000..3a85061fd416d84ce7acffca068ebd00cb380361 GIT binary patch literal 79551 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 literal 0 HcmV?d00001 From 7433dcb95cbe59a4ae3a1a057ac418580f37f04c Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Fri, 5 Jun 2015 13:26:32 +0900 Subject: [PATCH 111/350] Adding hash.c --- .../Projects/benchmark/ewarm/Exe/benchmark.sim | Bin 79551 -> 0 bytes IDE/IAR-EWARM/Projects/lib/wolfSSL-Lib.ewp | 7 +++++++ 2 files changed, 7 insertions(+) delete mode 100644 IDE/IAR-EWARM/Projects/benchmark/ewarm/Exe/benchmark.sim diff --git a/IDE/IAR-EWARM/Projects/benchmark/ewarm/Exe/benchmark.sim b/IDE/IAR-EWARM/Projects/benchmark/ewarm/Exe/benchmark.sim deleted file mode 100644 index 3a85061fd416d84ce7acffca068ebd00cb380361..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79551 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 diff --git a/IDE/IAR-EWARM/Projects/lib/wolfSSL-Lib.ewp b/IDE/IAR-EWARM/Projects/lib/wolfSSL-Lib.ewp index 04c1d6840..3888c46f6 100644 --- a/IDE/IAR-EWARM/Projects/lib/wolfSSL-Lib.ewp +++ b/IDE/IAR-EWARM/Projects/lib/wolfSSL-Lib.ewp @@ -169,6 +169,9 @@