AuroraRuntime/Source/Crypto/ECC/PrivateECCImpl.cpp

166 lines
4.3 KiB
C++
Raw Normal View History

2021-09-21 01:54:47 +00:00
/***
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
File: PrivateECCImpl.cpp
2021-09-21 01:54:47 +00:00
File: ECCGeneric.cpp
Date: 2021-9-17
File: KCryptoECC.cpp
Date: 2021-1-15
2021-09-21 01:54:47 +00:00
Author: Reece
***/
2021-09-30 14:57:41 +00:00
#include <Source/RuntimeInternal.hpp>
2021-09-21 01:54:47 +00:00
#include "ECC.hpp"
#include "ECCGeneric.hpp"
#include "ECCCurves.hpp"
#include "PrivateECCImpl.hpp"
#include "PublicECCImpl.hpp"
namespace Aurora::Crypto::ECC
{
[+] Network + Protocol + TLS - Initial Commit ============================================================================= Network ]==================================================================== ============================================================================= [+] Added (very) early Aurora::IO::Net implementation [+] AuNet::EHostnameType [+] AuNet::EIPProtocol [+] AuNet::ENetworkError [+] AuNet::ETransportProtocol [+] AuNet::INetInterface [+] AuNet::INetSrvDatagram [+] AuNet::INetSrvResolve [+] AuNet::INetSrvSockets [+] AuNet::INetSrvWorkers [+] AuNet::INetWorker [+] AuNet::IPAddress [+] AuNet::IResolver [+] AuNet::ISocket [+] AuNet::IResolver [+] AuNet::ISocketBase [+] AuNet::ISocketChannel [+] AuNet::ISocketDriver [+] AuNet::ISocketDriverFactory [+] AuNet::ISocketServer [+] AuNet::ISocketServerDriver [+] AuNet::NetEndpoint [+] AuNet::NetError [+] AuNet::NetHostname (+implementation) ============================================================================= Protocol ]=================================================================== ============================================================================= [+] IProtocolInterceptor [+] IProtocolInterceptorEx [+] IProtocolStack (+implementation) ============================================================================= TLS ]======================================================================== ============================================================================= [+] ITLSContext [+] TLSProtocolRecv [+] TLSProtocolSend (+implementation) ============================================================================= IO Bug Fixes ]=============================================================== ============================================================================= [*] IOProcessor::SubmitIOWorkItem should signal the CvEvent, forcing at least once future tick (wont optimize with if in tick & not yet dispatched work items) [*] Split IOPipeWork in into IOPipeProcessor header [+] IOPipeWork::GetBuffer (internal reallocation) [*] Harden against IAsyncTransactions without a loop source [*] Missing null `if (processor->listener)` in IOProcessor [*] Solved some soft-lock conditions under Linux's LoopQueue (added deferred commits) [*] Quick hack: IOProcessor::HasItems() should OR the early can-tick check function. ============================================================================= Other ]====================================================================== ============================================================================= [+] Linux: LSSignalCatcher [+] `static void AuResetMember(Aurora::Memory::ByteBuffer &ref)` for AuROXTL [*] Attempt to enforce a normalization and don't overwrite-readptr-under-istreamwriters policy in ByteBuffer_ReadWrite (circular buffers) [*] Bad ECC ctors ============================================================================= Known issues ]=============================================================== ============================================================================= > Linux net is nowhere near done > UDP socket emulation layer isn't implemented > Ciphersuite API is a stub > Private key API is a stub > ...therefore no TLS servers > Missing thread safety precautions under net > Net implementation is still beri early
2022-08-28 19:02:06 +00:00
PrivateECCImpl::PrivateECCImpl(EECCCurve type, ecc_key &key) : _key(key), _type(type)
2021-09-21 01:54:47 +00:00
{
}
PrivateECCImpl::~PrivateECCImpl()
{
ecc_free(&this->_key);
2021-09-21 01:54:47 +00:00
}
EECCCurve PrivateECCImpl::GetType()
{
return this->_type;
2021-09-21 01:54:47 +00:00
}
2022-01-20 16:37:22 +00:00
bool PrivateECCImpl::Sign(const AuMemoryViewRead &plainText,
AuHashing::EHashType method,
2022-01-20 16:37:22 +00:00
AuByteBuffer &out)
2021-09-21 01:54:47 +00:00
{
const int salt = 0;
if (!plainText.HasMemory())
{
SysPushErrorParam();
return {};
}
int hash = ::Crypto::HashMethodToId(method);
2021-09-21 01:54:47 +00:00
if (hash == 0xFF)
{
SysPushErrorCrypt("invalid hash {}", AuUInt(method));
2021-09-21 01:54:47 +00:00
return false;
}
if (!AuTryResize(out, 1024))
{
SysPushErrorMem();
return false;
}
2022-01-20 16:37:22 +00:00
AuByteBuffer hashVec;
2021-09-21 01:54:47 +00:00
if (!AuTryResize(hashVec, 128))
{
SysPushErrorMem();
return false;
}
unsigned long hashSize = hashVec.size();
auto ret = ::hash_memory(hash,
AuReinterpretCast<const unsigned char *>(plainText.ptr), plainText.length,
AuReinterpretCast<unsigned char *>(hashVec.data()), &hashSize);
2021-09-21 01:54:47 +00:00
if (ret != CRYPT_OK)
{
SysPushErrorCrypt("{}", ret);
return false;
}
return Sign(hashVec, out);
}
2022-01-20 16:37:22 +00:00
bool PrivateECCImpl::Sign(const AuMemoryViewRead &hash,
AuByteBuffer &out)
2021-09-21 01:54:47 +00:00
{
int iRet;
2021-09-21 01:54:47 +00:00
prng_state yarrow_prng;
if (!hash.HasMemory())
{
SysPushErrorParam();
return {};
}
if (!out.GetOrAllocateLinearWriteable(1024))
2021-09-21 01:54:47 +00:00
{
SysPushErrorMem();
return {};
2021-09-21 01:54:47 +00:00
}
iRet = yarrow_start(&yarrow_prng);
if (iRet != CRYPT_OK)
{
SysPushErrorCrypt("{}", iRet);
return false;
}
unsigned long len = 1024;
iRet = ::ecc_sign_hash_ex(AuReinterpretCast<const unsigned char *>(hash.ptr), hash.length,
out.writePtr, &len,
&yarrow_prng,
::Crypto::gPrngYarrow,
LTC_ECCSIG_ETH27,
nullptr,
&this->_key);
if (iRet != CRYPT_OK)
2021-09-21 01:54:47 +00:00
{
SysPushErrorCrypt("{}", iRet);
2021-09-21 01:54:47 +00:00
return false;
}
out.writePtr += len;
2021-09-21 01:54:47 +00:00
return true;
}
bool PrivateECCImpl::ECDH(const AuSPtr<IECCPublic> &partnerPublic,
2022-01-20 16:37:22 +00:00
AuByteBuffer &sharedKey)
2021-09-21 01:54:47 +00:00
{
auto writeView = sharedKey.GetOrAllocateLinearWriteable(128);
if (!writeView)
2021-09-21 01:54:47 +00:00
{
SysPushErrorMem();
return {};
2021-09-21 01:54:47 +00:00
}
if (partnerPublic->GetType() != this->GetType())
2021-09-21 01:54:47 +00:00
{
SysPushErrorCrypto("Can not EDCH with incompatible curve type (noting ed25519 requires translation to x25519)");
2021-09-21 01:54:47 +00:00
return false;
}
unsigned long actualSize = 128;
auto ret = ::ecc_shared_secret(&this->_key,
&(AuReinterpretCast<PublicECCImpl>(partnerPublic)->GetKey()),
sharedKey.writePtr,
&actualSize);
2021-09-21 01:54:47 +00:00
if (ret != CRYPT_OK)
{
SysPushErrorCrypt("{}", ret);
return false;
}
sharedKey.writePtr += actualSize;
2021-09-21 01:54:47 +00:00
return true;
}
2022-01-20 16:37:22 +00:00
bool PrivateECCImpl::AsPublicECC(AuByteBuffer &out)
2021-09-21 01:54:47 +00:00
{
return ExportECCKey(this->_key, true, out);
2021-09-21 01:54:47 +00:00
}
2022-01-20 16:37:22 +00:00
bool PrivateECCImpl::AsPrivateECC(AuByteBuffer &out)
2021-09-21 01:54:47 +00:00
{
return ExportECCKey(this->_key, false, out);
2021-09-21 01:54:47 +00:00
}
}