mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 12:32:27 +01:00
Import from yaSSL
Fixes for HPUX etc. Don't define exceptions operator new on hpux as the linker will look for the function extra/yassl/examples/echoserver/echoserver.cpp: Import patch yassl.diff extra/yassl/include/openssl/ssl.h: Import patch yassl.diff extra/yassl/include/socket_wrapper.hpp: Import patch yassl.diff extra/yassl/src/handshake.cpp: Import patch yassl.diff extra/yassl/src/socket_wrapper.cpp: Import patch yassl.diff extra/yassl/src/ssl.cpp: Import patch yassl.diff extra/yassl/src/template_instnt.cpp: Import patch yassl.diff extra/yassl/src/timer.cpp: Import patch yassl.diff extra/yassl/src/yassl_error.cpp: Import patch yassl.diff extra/yassl/src/yassl_int.cpp: Import patch yassl.diff extra/yassl/taocrypt/include/block.hpp: Import patch yassl.diff extra/yassl/taocrypt/include/md4.hpp: Import patch yassl.diff extra/yassl/taocrypt/include/runtime.hpp: Import patch yassl.diff extra/yassl/taocrypt/src/md4.cpp: Import patch yassl.diff extra/yassl/taocrypt/src/template_instnt.cpp: Import patch yassl.diff extra/yassl/taocrypt/taocrypt.dsp: Import patch yassl.diff extra/yassl/taocrypt/test/test.cpp: Import patch yassl.diff extra/yassl/testsuite/test.hpp: Import patch yassl.diff extra/yassl/mySTL/stdexcept.hpp: Don't define exceptions operator new on hpux as the linker will look for the function extra/yassl/taocrypt/src/Makefile.am: Add md4.cpp to Makefile.am
This commit is contained in:
parent
07188950ae
commit
b959d36bce
20 changed files with 362 additions and 34 deletions
|
@ -65,7 +65,8 @@ THREAD_RETURN YASSL_API echoserver_test(void* args)
|
||||||
while (!shutdown) {
|
while (!shutdown) {
|
||||||
sockaddr_in client;
|
sockaddr_in client;
|
||||||
socklen_t client_len = sizeof(client);
|
socklen_t client_len = sizeof(client);
|
||||||
int clientfd = accept(sockfd, (sockaddr*)&client, &client_len);
|
int clientfd = accept(sockfd, (sockaddr*)&client,
|
||||||
|
(ACCEPT_THIRD_T)&client_len);
|
||||||
if (clientfd == -1) err_sys("tcp accept failed");
|
if (clientfd == -1) err_sys("tcp accept failed");
|
||||||
|
|
||||||
SSL* ssl = SSL_new(ctx);
|
SSL* ssl = SSL_new(ctx);
|
||||||
|
|
|
@ -273,6 +273,7 @@ int SSL_pending(SSL*);
|
||||||
|
|
||||||
|
|
||||||
enum { /* ssl Constants */
|
enum { /* ssl Constants */
|
||||||
|
SSL_WOULD_BLOCK = -8,
|
||||||
SSL_BAD_STAT = -7,
|
SSL_BAD_STAT = -7,
|
||||||
SSL_BAD_PATH = -6,
|
SSL_BAD_PATH = -6,
|
||||||
SSL_BAD_FILETYPE = -5,
|
SSL_BAD_FILETYPE = -5,
|
||||||
|
@ -494,7 +495,7 @@ ASN1_TIME* X509_get_notAfter(X509* x);
|
||||||
|
|
||||||
|
|
||||||
typedef struct MD4_CTX {
|
typedef struct MD4_CTX {
|
||||||
void* ptr;
|
int buffer[32]; /* big enough to hold, check size in Init */
|
||||||
} MD4_CTX;
|
} MD4_CTX;
|
||||||
|
|
||||||
void MD4_Init(MD4_CTX*);
|
void MD4_Init(MD4_CTX*);
|
||||||
|
|
|
@ -66,6 +66,7 @@ typedef unsigned char byte;
|
||||||
// Wraps Windows Sockets and BSD Sockets
|
// Wraps Windows Sockets and BSD Sockets
|
||||||
class Socket {
|
class Socket {
|
||||||
socket_t socket_; // underlying socket descriptor
|
socket_t socket_; // underlying socket descriptor
|
||||||
|
bool wouldBlock_; // for non-blocking data
|
||||||
public:
|
public:
|
||||||
explicit Socket(socket_t s = INVALID_SOCKET);
|
explicit Socket(socket_t s = INVALID_SOCKET);
|
||||||
~Socket();
|
~Socket();
|
||||||
|
@ -75,9 +76,10 @@ public:
|
||||||
socket_t get_fd() const;
|
socket_t get_fd() const;
|
||||||
|
|
||||||
uint send(const byte* buf, unsigned int len, int flags = 0) const;
|
uint send(const byte* buf, unsigned int len, int flags = 0) const;
|
||||||
uint receive(byte* buf, unsigned int len, int flags = 0) const;
|
uint receive(byte* buf, unsigned int len, int flags = 0);
|
||||||
|
|
||||||
bool wait() const;
|
bool wait();
|
||||||
|
bool WouldBlock() const;
|
||||||
|
|
||||||
void closeSocket();
|
void closeSocket();
|
||||||
void shutDown(int how = SD_SEND);
|
void shutDown(int how = SD_SEND);
|
||||||
|
|
|
@ -46,8 +46,10 @@ public:
|
||||||
// for compiler generated call, never used
|
// for compiler generated call, never used
|
||||||
static void operator delete(void*) { assert(0); }
|
static void operator delete(void*) { assert(0); }
|
||||||
private:
|
private:
|
||||||
|
#if defined(__hpux)
|
||||||
// don't allow dynamic creation of exceptions
|
// don't allow dynamic creation of exceptions
|
||||||
static void* operator new(size_t);
|
static void* operator new(size_t);
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -656,7 +656,7 @@ mySTL::auto_ptr<input_buffer>
|
||||||
DoProcessReply(SSL& ssl, mySTL::auto_ptr<input_buffer> buffered)
|
DoProcessReply(SSL& ssl, mySTL::auto_ptr<input_buffer> buffered)
|
||||||
{
|
{
|
||||||
// wait for input if blocking
|
// wait for input if blocking
|
||||||
if (!ssl.getSocket().wait()) {
|
if (!ssl.useSocket().wait()) {
|
||||||
ssl.SetError(receive_error);
|
ssl.SetError(receive_error);
|
||||||
buffered.reset(0);
|
buffered.reset(0);
|
||||||
return buffered;
|
return buffered;
|
||||||
|
@ -673,7 +673,7 @@ DoProcessReply(SSL& ssl, mySTL::auto_ptr<input_buffer> buffered)
|
||||||
}
|
}
|
||||||
|
|
||||||
// add new data
|
// add new data
|
||||||
uint read = ssl.getSocket().receive(buffer.get_buffer() + buffSz, ready);
|
uint read = ssl.useSocket().receive(buffer.get_buffer() + buffSz, ready);
|
||||||
buffer.add_size(read);
|
buffer.add_size(read);
|
||||||
uint offset = 0;
|
uint offset = 0;
|
||||||
const MessageFactory& mf = ssl.getFactory().getMessage();
|
const MessageFactory& mf = ssl.getFactory().getMessage();
|
||||||
|
@ -858,6 +858,9 @@ void sendFinished(SSL& ssl, ConnectionEnd side, BufferOutput buffer)
|
||||||
// send data
|
// send data
|
||||||
int sendData(SSL& ssl, const void* buffer, int sz)
|
int sendData(SSL& ssl, const void* buffer, int sz)
|
||||||
{
|
{
|
||||||
|
if (ssl.GetError() == YasslError(SSL_ERROR_WANT_READ))
|
||||||
|
ssl.SetError(no_error);
|
||||||
|
|
||||||
ssl.verfiyHandShakeComplete();
|
ssl.verfiyHandShakeComplete();
|
||||||
if (ssl.GetError()) return 0;
|
if (ssl.GetError()) return 0;
|
||||||
int sent = 0;
|
int sent = 0;
|
||||||
|
@ -893,6 +896,9 @@ int sendAlert(SSL& ssl, const Alert& alert)
|
||||||
// process input data
|
// process input data
|
||||||
int receiveData(SSL& ssl, Data& data)
|
int receiveData(SSL& ssl, Data& data)
|
||||||
{
|
{
|
||||||
|
if (ssl.GetError() == YasslError(SSL_ERROR_WANT_READ))
|
||||||
|
ssl.SetError(no_error);
|
||||||
|
|
||||||
ssl.verfiyHandShakeComplete();
|
ssl.verfiyHandShakeComplete();
|
||||||
if (ssl.GetError()) return 0;
|
if (ssl.GetError()) return 0;
|
||||||
|
|
||||||
|
@ -902,6 +908,11 @@ int receiveData(SSL& ssl, Data& data)
|
||||||
ssl.useLog().ShowData(data.get_length());
|
ssl.useLog().ShowData(data.get_length());
|
||||||
|
|
||||||
if (ssl.GetError()) return 0;
|
if (ssl.GetError()) return 0;
|
||||||
|
|
||||||
|
if (data.get_length() == 0 && ssl.getSocket().WouldBlock()) {
|
||||||
|
ssl.SetError(YasslError(SSL_ERROR_WANT_READ));
|
||||||
|
return SSL_WOULD_BLOCK;
|
||||||
|
}
|
||||||
return data.get_length();
|
return data.get_length();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@ namespace yaSSL {
|
||||||
|
|
||||||
|
|
||||||
Socket::Socket(socket_t s)
|
Socket::Socket(socket_t s)
|
||||||
: socket_(s)
|
: socket_(s), wouldBlock_(false)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
@ -123,17 +123,21 @@ uint Socket::send(const byte* buf, unsigned int sz, int flags) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint Socket::receive(byte* buf, unsigned int sz, int flags) const
|
uint Socket::receive(byte* buf, unsigned int sz, int flags)
|
||||||
{
|
{
|
||||||
assert(socket_ != INVALID_SOCKET);
|
assert(socket_ != INVALID_SOCKET);
|
||||||
|
wouldBlock_ = false;
|
||||||
|
|
||||||
int recvd = ::recv(socket_, reinterpret_cast<char *>(buf), sz, flags);
|
int recvd = ::recv(socket_, reinterpret_cast<char *>(buf), sz, flags);
|
||||||
|
|
||||||
// idea to seperate error from would block by arnetheduck@gmail.com
|
// idea to seperate error from would block by arnetheduck@gmail.com
|
||||||
if (recvd == -1) {
|
if (recvd == -1) {
|
||||||
if (get_lastError() == SOCKET_EWOULDBLOCK ||
|
if (get_lastError() == SOCKET_EWOULDBLOCK ||
|
||||||
get_lastError() == SOCKET_EAGAIN)
|
get_lastError() == SOCKET_EAGAIN) {
|
||||||
|
wouldBlock_ = true;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else if (recvd == 0)
|
else if (recvd == 0)
|
||||||
return static_cast<uint>(-1);
|
return static_cast<uint>(-1);
|
||||||
|
|
||||||
|
@ -142,7 +146,7 @@ uint Socket::receive(byte* buf, unsigned int sz, int flags) const
|
||||||
|
|
||||||
|
|
||||||
// wait if blocking for input, return false for error
|
// wait if blocking for input, return false for error
|
||||||
bool Socket::wait() const
|
bool Socket::wait()
|
||||||
{
|
{
|
||||||
byte b;
|
byte b;
|
||||||
return receive(&b, 1, MSG_PEEK) != static_cast<uint>(-1);
|
return receive(&b, 1, MSG_PEEK) != static_cast<uint>(-1);
|
||||||
|
@ -166,6 +170,12 @@ int Socket::get_lastError()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Socket::WouldBlock() const
|
||||||
|
{
|
||||||
|
return wouldBlock_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Socket::set_lastError(int errorCode)
|
void Socket::set_lastError(int errorCode)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include "handshake.hpp"
|
#include "handshake.hpp"
|
||||||
#include "yassl_int.hpp"
|
#include "yassl_int.hpp"
|
||||||
#include "md5.hpp" // for TaoCrypt MD5 size assert
|
#include "md5.hpp" // for TaoCrypt MD5 size assert
|
||||||
|
#include "md4.hpp" // for TaoCrypt MD4 size assert
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
@ -1131,17 +1132,26 @@ void* X509_get_ext_d2i(X509* x, int nid, int* crit, int* idx)
|
||||||
|
|
||||||
void MD4_Init(MD4_CTX* md4)
|
void MD4_Init(MD4_CTX* md4)
|
||||||
{
|
{
|
||||||
assert(0); // not yet supported, build compat. only
|
// make sure we have a big enough buffer
|
||||||
|
typedef char ok[sizeof(md4->buffer) >= sizeof(TaoCrypt::MD4) ? 1 : -1];
|
||||||
|
(void) sizeof(ok);
|
||||||
|
|
||||||
|
// using TaoCrypt since no dynamic memory allocated
|
||||||
|
// and no destructor will be called
|
||||||
|
new (reinterpret_cast<yassl_pointer>(md4->buffer)) TaoCrypt::MD4();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void MD4_Update(MD4_CTX* md4, const void* data, unsigned long sz)
|
void MD4_Update(MD4_CTX* md4, const void* data, unsigned long sz)
|
||||||
{
|
{
|
||||||
|
reinterpret_cast<TaoCrypt::MD4*>(md4->buffer)->Update(
|
||||||
|
static_cast<const byte*>(data), static_cast<unsigned int>(sz));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void MD4_Final(unsigned char* hash, MD4_CTX* md4)
|
void MD4_Final(unsigned char* hash, MD4_CTX* md4)
|
||||||
{
|
{
|
||||||
|
reinterpret_cast<TaoCrypt::MD4*>(md4->buffer)->Final(hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include "hmac.hpp"
|
#include "hmac.hpp"
|
||||||
#include "md5.hpp"
|
#include "md5.hpp"
|
||||||
#include "sha.hpp"
|
#include "sha.hpp"
|
||||||
|
#include "ripemd.hpp"
|
||||||
#include "openssl/ssl.h"
|
#include "openssl/ssl.h"
|
||||||
|
|
||||||
#ifdef HAVE_EXPLICIT_TEMPLATE_INSTANTIATION
|
#ifdef HAVE_EXPLICIT_TEMPLATE_INSTANTIATION
|
||||||
|
|
|
@ -26,13 +26,17 @@
|
||||||
#include "runtime.hpp"
|
#include "runtime.hpp"
|
||||||
#include "timer.hpp"
|
#include "timer.hpp"
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#include <windows.h>
|
||||||
|
#else
|
||||||
|
#include <sys/time.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace yaSSL {
|
namespace yaSSL {
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
timer_d timer()
|
timer_d timer()
|
||||||
{
|
{
|
||||||
static bool init(false);
|
static bool init(false);
|
||||||
|
@ -57,8 +61,6 @@ namespace yaSSL {
|
||||||
|
|
||||||
#else // _WIN32
|
#else // _WIN32
|
||||||
|
|
||||||
#include <sys/time.h>
|
|
||||||
|
|
||||||
timer_d timer()
|
timer_d timer()
|
||||||
{
|
{
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include "runtime.hpp"
|
#include "runtime.hpp"
|
||||||
#include "yassl_error.hpp"
|
#include "yassl_error.hpp"
|
||||||
#include "error.hpp" // TaoCrypt error numbers
|
#include "error.hpp" // TaoCrypt error numbers
|
||||||
|
#include "openssl/ssl.h" // SSL_ERROR_WANT_READ
|
||||||
|
|
||||||
namespace yaSSL {
|
namespace yaSSL {
|
||||||
|
|
||||||
|
@ -117,6 +118,11 @@ void SetErrorString(YasslError error, char* buffer)
|
||||||
strncpy(buffer, "unable to proccess cerificate", max);
|
strncpy(buffer, "unable to proccess cerificate", max);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// openssl errors
|
||||||
|
case SSL_ERROR_WANT_READ :
|
||||||
|
strncpy(buffer, "the read operation would block", max);
|
||||||
|
break;
|
||||||
|
|
||||||
// TaoCrypt errors
|
// TaoCrypt errors
|
||||||
case NO_ERROR :
|
case NO_ERROR :
|
||||||
strncpy(buffer, "not in error state", max);
|
strncpy(buffer, "not in error state", max);
|
||||||
|
|
|
@ -1415,15 +1415,6 @@ BulkCipher* CryptProvider::NewDesEde()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
extern "C" void yaSSL_CleanUp()
|
|
||||||
{
|
|
||||||
TaoCrypt::CleanUp();
|
|
||||||
ysDelete(cryptProviderInstance);
|
|
||||||
ysDelete(sslFactoryInstance);
|
|
||||||
ysDelete(sessionsInstance);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
typedef Mutex::Lock Lock;
|
typedef Mutex::Lock Lock;
|
||||||
|
|
||||||
|
|
||||||
|
@ -2109,9 +2100,18 @@ ASN1_STRING* StringHolder::GetString()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" void yaSSL_CleanUp()
|
||||||
|
{
|
||||||
|
TaoCrypt::CleanUp();
|
||||||
|
ysDelete(yaSSL::cryptProviderInstance);
|
||||||
|
ysDelete(yaSSL::sslFactoryInstance);
|
||||||
|
ysDelete(yaSSL::sessionsInstance);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_EXPLICIT_TEMPLATE_INSTANTIATION
|
#ifdef HAVE_EXPLICIT_TEMPLATE_INSTANTIATION
|
||||||
namespace mySTL {
|
namespace mySTL {
|
||||||
template yaSSL::yassl_int_cpp_local1::SumData for_each<mySTL::list<yaSSL::input_buffer*>::iterator, yaSSL::yassl_int_cpp_local1::SumData>(mySTL::list<yaSSL::input_buffer*>::iterator, mySTL::list<yaSSL::input_buffer*>::iterator, yaSSL::yassl_int_cpp_local1::SumData);
|
template yaSSL::yassl_int_cpp_local1::SumData for_each<mySTL::list<yaSSL::input_buffer*>::iterator, yaSSL::yassl_int_cpp_local1::SumData>(mySTL::list<yaSSL::input_buffer*>::iterator, mySTL::list<yaSSL::input_buffer*>::iterator, yaSSL::yassl_int_cpp_local1::SumData);
|
||||||
|
|
|
@ -96,7 +96,7 @@ public:
|
||||||
|
|
||||||
pointer allocate(size_type n, const void* = 0)
|
pointer allocate(size_type n, const void* = 0)
|
||||||
{
|
{
|
||||||
CheckSize(n);
|
this->CheckSize(n);
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
return 0;
|
return 0;
|
||||||
return NEW_TC T[n];
|
return NEW_TC T[n];
|
||||||
|
|
65
extra/yassl/taocrypt/include/md4.hpp
Normal file
65
extra/yassl/taocrypt/include/md4.hpp
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
/* md4.hpp
|
||||||
|
*
|
||||||
|
* Copyright (C) 2003 Sawtooth Consulting Ltd.
|
||||||
|
*
|
||||||
|
* This file is part of yaSSL.
|
||||||
|
*
|
||||||
|
* yaSSL 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.
|
||||||
|
*
|
||||||
|
* yaSSL 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* md4.hpp provides MD4 digest support
|
||||||
|
* WANRING: MD4 is considered insecure, only use if you have to, e.g., yaSSL
|
||||||
|
* libcurl supports needs this for NTLM authentication
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TAO_CRYPT_MD4_HPP
|
||||||
|
#define TAO_CRYPT_MD4_HPP
|
||||||
|
|
||||||
|
#include "hash.hpp"
|
||||||
|
|
||||||
|
namespace TaoCrypt {
|
||||||
|
|
||||||
|
|
||||||
|
// MD4 digest
|
||||||
|
class MD4 : public HASHwithTransform {
|
||||||
|
public:
|
||||||
|
enum { BLOCK_SIZE = 64, DIGEST_SIZE = 16, PAD_SIZE = 56,
|
||||||
|
TAO_BYTE_ORDER = LittleEndianOrder }; // in Bytes
|
||||||
|
MD4() : HASHwithTransform(DIGEST_SIZE / sizeof(word32), BLOCK_SIZE)
|
||||||
|
{ Init(); }
|
||||||
|
ByteOrder getByteOrder() const { return ByteOrder(TAO_BYTE_ORDER); }
|
||||||
|
word32 getBlockSize() const { return BLOCK_SIZE; }
|
||||||
|
word32 getDigestSize() const { return DIGEST_SIZE; }
|
||||||
|
word32 getPadSize() const { return PAD_SIZE; }
|
||||||
|
|
||||||
|
MD4(const MD4&);
|
||||||
|
MD4& operator= (const MD4&);
|
||||||
|
|
||||||
|
void Init();
|
||||||
|
void Swap(MD4&);
|
||||||
|
private:
|
||||||
|
void Transform();
|
||||||
|
};
|
||||||
|
|
||||||
|
inline void swap(MD4& a, MD4& b)
|
||||||
|
{
|
||||||
|
a.Swap(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
#endif // TAO_CRYPT_MD4_HPP
|
||||||
|
|
|
@ -28,10 +28,6 @@
|
||||||
#ifndef yaSSL_NEW_HPP
|
#ifndef yaSSL_NEW_HPP
|
||||||
#define yaSSL_NEW_HPP
|
#define yaSSL_NEW_HPP
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __sun
|
#ifdef __sun
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ noinst_LTLIBRARIES = libtaocrypt.la
|
||||||
|
|
||||||
libtaocrypt_la_SOURCES = aes.cpp aestables.cpp algebra.cpp arc4.cpp \
|
libtaocrypt_la_SOURCES = aes.cpp aestables.cpp algebra.cpp arc4.cpp \
|
||||||
asn.cpp bftables.cpp blowfish.cpp coding.cpp des.cpp dh.cpp \
|
asn.cpp bftables.cpp blowfish.cpp coding.cpp des.cpp dh.cpp \
|
||||||
dsa.cpp file.cpp hash.cpp integer.cpp md2.cpp md5.cpp misc.cpp \
|
dsa.cpp file.cpp hash.cpp integer.cpp md2.cpp md4.cpp md5.cpp misc.cpp \
|
||||||
random.cpp ripemd.cpp rsa.cpp sha.cpp template_instnt.cpp \
|
random.cpp ripemd.cpp rsa.cpp sha.cpp template_instnt.cpp \
|
||||||
tftables.cpp twofish.cpp
|
tftables.cpp twofish.cpp
|
||||||
|
|
||||||
|
|
154
extra/yassl/taocrypt/src/md4.cpp
Normal file
154
extra/yassl/taocrypt/src/md4.cpp
Normal file
|
@ -0,0 +1,154 @@
|
||||||
|
/* md4.cpp
|
||||||
|
*
|
||||||
|
* Copyright (C) 2003 Sawtooth Consulting Ltd.
|
||||||
|
*
|
||||||
|
* This file is part of yaSSL.
|
||||||
|
*
|
||||||
|
* yaSSL 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.
|
||||||
|
*
|
||||||
|
* yaSSL 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* based on Wei Dai's md4.cpp from CryptoPP */
|
||||||
|
|
||||||
|
#include "runtime.hpp"
|
||||||
|
#include "md4.hpp"
|
||||||
|
#include "algorithm.hpp" // mySTL::swap
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace TaoCrypt {
|
||||||
|
|
||||||
|
void MD4::Init()
|
||||||
|
{
|
||||||
|
digest_[0] = 0x67452301L;
|
||||||
|
digest_[1] = 0xefcdab89L;
|
||||||
|
digest_[2] = 0x98badcfeL;
|
||||||
|
digest_[3] = 0x10325476L;
|
||||||
|
|
||||||
|
buffLen_ = 0;
|
||||||
|
loLen_ = 0;
|
||||||
|
hiLen_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MD4::MD4(const MD4& that) : HASHwithTransform(DIGEST_SIZE / sizeof(word32),
|
||||||
|
BLOCK_SIZE)
|
||||||
|
{
|
||||||
|
buffLen_ = that.buffLen_;
|
||||||
|
loLen_ = that.loLen_;
|
||||||
|
hiLen_ = that.hiLen_;
|
||||||
|
|
||||||
|
memcpy(digest_, that.digest_, DIGEST_SIZE);
|
||||||
|
memcpy(buffer_, that.buffer_, BLOCK_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
MD4& MD4::operator= (const MD4& that)
|
||||||
|
{
|
||||||
|
MD4 tmp(that);
|
||||||
|
Swap(tmp);
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MD4::Swap(MD4& other)
|
||||||
|
{
|
||||||
|
mySTL::swap(loLen_, other.loLen_);
|
||||||
|
mySTL::swap(hiLen_, other.hiLen_);
|
||||||
|
mySTL::swap(buffLen_, other.buffLen_);
|
||||||
|
|
||||||
|
memcpy(digest_, other.digest_, DIGEST_SIZE);
|
||||||
|
memcpy(buffer_, other.buffer_, BLOCK_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MD4::Transform()
|
||||||
|
{
|
||||||
|
#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
|
||||||
|
#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
|
||||||
|
#define H(x, y, z) ((x) ^ (y) ^ (z))
|
||||||
|
|
||||||
|
word32 A, B, C, D;
|
||||||
|
|
||||||
|
A = digest_[0];
|
||||||
|
B = digest_[1];
|
||||||
|
C = digest_[2];
|
||||||
|
D = digest_[3];
|
||||||
|
|
||||||
|
#define function(a,b,c,d,k,s) a=rotlFixed(a+F(b,c,d)+buffer_[k],s);
|
||||||
|
function(A,B,C,D, 0, 3);
|
||||||
|
function(D,A,B,C, 1, 7);
|
||||||
|
function(C,D,A,B, 2,11);
|
||||||
|
function(B,C,D,A, 3,19);
|
||||||
|
function(A,B,C,D, 4, 3);
|
||||||
|
function(D,A,B,C, 5, 7);
|
||||||
|
function(C,D,A,B, 6,11);
|
||||||
|
function(B,C,D,A, 7,19);
|
||||||
|
function(A,B,C,D, 8, 3);
|
||||||
|
function(D,A,B,C, 9, 7);
|
||||||
|
function(C,D,A,B,10,11);
|
||||||
|
function(B,C,D,A,11,19);
|
||||||
|
function(A,B,C,D,12, 3);
|
||||||
|
function(D,A,B,C,13, 7);
|
||||||
|
function(C,D,A,B,14,11);
|
||||||
|
function(B,C,D,A,15,19);
|
||||||
|
|
||||||
|
#undef function
|
||||||
|
#define function(a,b,c,d,k,s) a=rotlFixed(a+G(b,c,d)+buffer_[k]+0x5a827999,s);
|
||||||
|
function(A,B,C,D, 0, 3);
|
||||||
|
function(D,A,B,C, 4, 5);
|
||||||
|
function(C,D,A,B, 8, 9);
|
||||||
|
function(B,C,D,A,12,13);
|
||||||
|
function(A,B,C,D, 1, 3);
|
||||||
|
function(D,A,B,C, 5, 5);
|
||||||
|
function(C,D,A,B, 9, 9);
|
||||||
|
function(B,C,D,A,13,13);
|
||||||
|
function(A,B,C,D, 2, 3);
|
||||||
|
function(D,A,B,C, 6, 5);
|
||||||
|
function(C,D,A,B,10, 9);
|
||||||
|
function(B,C,D,A,14,13);
|
||||||
|
function(A,B,C,D, 3, 3);
|
||||||
|
function(D,A,B,C, 7, 5);
|
||||||
|
function(C,D,A,B,11, 9);
|
||||||
|
function(B,C,D,A,15,13);
|
||||||
|
|
||||||
|
#undef function
|
||||||
|
#define function(a,b,c,d,k,s) a=rotlFixed(a+H(b,c,d)+buffer_[k]+0x6ed9eba1,s);
|
||||||
|
function(A,B,C,D, 0, 3);
|
||||||
|
function(D,A,B,C, 8, 9);
|
||||||
|
function(C,D,A,B, 4,11);
|
||||||
|
function(B,C,D,A,12,15);
|
||||||
|
function(A,B,C,D, 2, 3);
|
||||||
|
function(D,A,B,C,10, 9);
|
||||||
|
function(C,D,A,B, 6,11);
|
||||||
|
function(B,C,D,A,14,15);
|
||||||
|
function(A,B,C,D, 1, 3);
|
||||||
|
function(D,A,B,C, 9, 9);
|
||||||
|
function(C,D,A,B, 5,11);
|
||||||
|
function(B,C,D,A,13,15);
|
||||||
|
function(A,B,C,D, 3, 3);
|
||||||
|
function(D,A,B,C,11, 9);
|
||||||
|
function(C,D,A,B, 7,11);
|
||||||
|
function(B,C,D,A,15,15);
|
||||||
|
|
||||||
|
digest_[0] += A;
|
||||||
|
digest_[1] += B;
|
||||||
|
digest_[2] += C;
|
||||||
|
digest_[3] += D;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
|
@ -30,11 +30,11 @@
|
||||||
#include "sha.hpp"
|
#include "sha.hpp"
|
||||||
#include "md5.hpp"
|
#include "md5.hpp"
|
||||||
#include "hmac.hpp"
|
#include "hmac.hpp"
|
||||||
|
#include "ripemd.hpp"
|
||||||
#include "pwdbased.hpp"
|
#include "pwdbased.hpp"
|
||||||
#include "algebra.hpp"
|
#include "algebra.hpp"
|
||||||
#include "vector.hpp"
|
#include "vector.hpp"
|
||||||
#include "hash.hpp"
|
#include "hash.hpp"
|
||||||
#include "ripemd.hpp"
|
|
||||||
|
|
||||||
#ifdef HAVE_EXPLICIT_TEMPLATE_INSTANTIATION
|
#ifdef HAVE_EXPLICIT_TEMPLATE_INSTANTIATION
|
||||||
namespace TaoCrypt {
|
namespace TaoCrypt {
|
||||||
|
|
|
@ -146,6 +146,10 @@ SOURCE=.\src\md2.cpp
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\src\md4.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\src\md5.cpp
|
SOURCE=.\src\md5.cpp
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
@ -246,6 +250,10 @@ SOURCE=.\include\md2.hpp
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\include\md4.hpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\include\md5.hpp
|
SOURCE=.\include\md5.hpp
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include "sha.hpp"
|
#include "sha.hpp"
|
||||||
#include "md5.hpp"
|
#include "md5.hpp"
|
||||||
#include "md2.hpp"
|
#include "md2.hpp"
|
||||||
|
#include "md4.hpp"
|
||||||
#include "ripemd.hpp"
|
#include "ripemd.hpp"
|
||||||
#include "hmac.hpp"
|
#include "hmac.hpp"
|
||||||
#include "arc4.hpp"
|
#include "arc4.hpp"
|
||||||
|
@ -30,6 +31,7 @@ using TaoCrypt::word32;
|
||||||
using TaoCrypt::SHA;
|
using TaoCrypt::SHA;
|
||||||
using TaoCrypt::MD5;
|
using TaoCrypt::MD5;
|
||||||
using TaoCrypt::MD2;
|
using TaoCrypt::MD2;
|
||||||
|
using TaoCrypt::MD4;
|
||||||
using TaoCrypt::RIPEMD160;
|
using TaoCrypt::RIPEMD160;
|
||||||
using TaoCrypt::HMAC;
|
using TaoCrypt::HMAC;
|
||||||
using TaoCrypt::ARC4;
|
using TaoCrypt::ARC4;
|
||||||
|
@ -89,6 +91,7 @@ void file_test(int, char**);
|
||||||
int sha_test();
|
int sha_test();
|
||||||
int md5_test();
|
int md5_test();
|
||||||
int md2_test();
|
int md2_test();
|
||||||
|
int md4_test();
|
||||||
int ripemd_test();
|
int ripemd_test();
|
||||||
int hmac_test();
|
int hmac_test();
|
||||||
int arc4_test();
|
int arc4_test();
|
||||||
|
@ -165,6 +168,11 @@ void taocrypt_test(void* args)
|
||||||
else
|
else
|
||||||
printf( "MD2 test passed!\n");
|
printf( "MD2 test passed!\n");
|
||||||
|
|
||||||
|
if ( (ret = md4_test()) )
|
||||||
|
err_sys("MD4 test failed!\n", ret);
|
||||||
|
else
|
||||||
|
printf( "MD4 test passed!\n");
|
||||||
|
|
||||||
if ( (ret = ripemd_test()) )
|
if ( (ret = ripemd_test()) )
|
||||||
err_sys("RIPEMD test failed!\n", ret);
|
err_sys("RIPEMD test failed!\n", ret);
|
||||||
else
|
else
|
||||||
|
@ -348,6 +356,51 @@ int md5_test()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int md4_test()
|
||||||
|
{
|
||||||
|
MD4 md4;
|
||||||
|
byte hash[MD4::DIGEST_SIZE];
|
||||||
|
|
||||||
|
testVector test_md4[] =
|
||||||
|
{
|
||||||
|
testVector("",
|
||||||
|
"\x31\xd6\xcf\xe0\xd1\x6a\xe9\x31\xb7\x3c\x59\xd7\xe0\xc0\x89"
|
||||||
|
"\xc0"),
|
||||||
|
testVector("a",
|
||||||
|
"\xbd\xe5\x2c\xb3\x1d\xe3\x3e\x46\x24\x5e\x05\xfb\xdb\xd6\xfb"
|
||||||
|
"\x24"),
|
||||||
|
testVector("abc",
|
||||||
|
"\xa4\x48\x01\x7a\xaf\x21\xd8\x52\x5f\xc1\x0a\xe8\x7a\xa6\x72"
|
||||||
|
"\x9d"),
|
||||||
|
testVector("message digest",
|
||||||
|
"\xd9\x13\x0a\x81\x64\x54\x9f\xe8\x18\x87\x48\x06\xe1\xc7\x01"
|
||||||
|
"\x4b"),
|
||||||
|
testVector("abcdefghijklmnopqrstuvwxyz",
|
||||||
|
"\xd7\x9e\x1c\x30\x8a\xa5\xbb\xcd\xee\xa8\xed\x63\xdf\x41\x2d"
|
||||||
|
"\xa9"),
|
||||||
|
testVector("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345"
|
||||||
|
"6789",
|
||||||
|
"\x04\x3f\x85\x82\xf2\x41\xdb\x35\x1c\xe6\x27\xe1\x53\xe7\xf0"
|
||||||
|
"\xe4"),
|
||||||
|
testVector("1234567890123456789012345678901234567890123456789012345678"
|
||||||
|
"9012345678901234567890",
|
||||||
|
"\xe3\x3b\x4d\xdc\x9c\x38\xf2\x19\x9c\x3e\x7b\x16\x4f\xcc\x05"
|
||||||
|
"\x36")
|
||||||
|
};
|
||||||
|
|
||||||
|
int times( sizeof(test_md4) / sizeof(testVector) );
|
||||||
|
for (int i = 0; i < times; ++i) {
|
||||||
|
md4.Update(test_md4[i].input_, test_md4[i].inLen_);
|
||||||
|
md4.Final(hash);
|
||||||
|
|
||||||
|
if (memcmp(hash, test_md4[i].output_, MD4::DIGEST_SIZE) != 0)
|
||||||
|
return -5 - i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int md2_test()
|
int md2_test()
|
||||||
{
|
{
|
||||||
MD2 md5;
|
MD2 md5;
|
||||||
|
|
|
@ -33,10 +33,16 @@
|
||||||
|
|
||||||
|
|
||||||
// HPUX doesn't use socklent_t for third parameter to accept
|
// HPUX doesn't use socklent_t for third parameter to accept
|
||||||
#if !defined(__hpux__)
|
#if !defined(__hpux)
|
||||||
typedef socklen_t* ACCEPT_THIRD_T;
|
typedef socklen_t* ACCEPT_THIRD_T;
|
||||||
#else
|
#else
|
||||||
typedef int* ACCEPT_THIRD_T;
|
typedef int* ACCEPT_THIRD_T;
|
||||||
|
|
||||||
|
// HPUX does not define _POSIX_THREADS as it's not _fully_ implemented
|
||||||
|
#ifndef _POSIX_THREADS
|
||||||
|
#define _POSIX_THREADS
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue