20 #ifndef lime_crypto_primitives_hpp 21 #define lime_crypto_primitives_hpp 42 struct sBuffer :
public std::array<uint8_t, T> {
55 template <
typename Curve, lime::Xtype dataType>
56 class X :
public sBuffer<static_cast<size_t>(Curve::Xsize(dataType))>{
59 constexpr
static size_t ssize(
void) {
return Curve::Xsize(dataType);};
61 X(std::vector<uint8_t>::const_iterator buffer) {std::copy_n(buffer, Curve::Xsize(dataType), this->begin());}
64 void assign(std::vector<uint8_t>::const_iterator buffer) {std::copy_n(buffer, Curve::Xsize(dataType), this->begin());}
70 template <
typename Curve>
82 Xpair() :m_pubKey{},m_privKey{}{};
96 template <
typename Curve, lime::DSAtype dataType>
97 class DSA :
public sBuffer<static_cast<size_t>(Curve::DSAsize(dataType))>{
100 constexpr
static size_t ssize(
void) {
return Curve::DSAsize(dataType);};
102 DSA(std::vector<uint8_t>::const_iterator buffer) {std::copy_n(buffer, Curve::DSAsize(dataType), this->begin());}
105 void assign(std::vector<uint8_t>::const_iterator buffer) {std::copy_n(buffer, Curve::DSAsize(dataType), this->begin());}
111 template <
typename Curve>
158 virtual uint32_t randomize() = 0;
165 virtual void randomize(uint8_t *buffer,
const size_t size) = 0;
167 virtual ~
RNG() =
default;
176 template <
typename Curve>
217 virtual void createKeyPair(std::shared_ptr<lime::RNG> rng) = 0;
222 virtual void deriveSelfPublic(
void) = 0;
227 virtual void computeSharedSecret(
void) = 0;
236 template <
typename Curve>
255 virtual void createKeyPair(std::shared_ptr<lime::RNG> rng) = 0;
260 virtual void derivePublic(
void) = 0;
306 template <
typename hashAlgo>
307 void HMAC(
const uint8_t *
const key,
const size_t keySize,
const uint8_t *
const input,
const size_t inputSize, uint8_t *hash,
size_t hashSize);
309 template <>
void HMAC<SHA512>(
const uint8_t *
const key,
const size_t keySize,
const uint8_t *
const input,
const size_t inputSize, uint8_t *hash,
size_t hashSize);
339 template <
typename hashAlgo,
typename infoType>
340 void HMAC_KDF(
const std::vector<uint8_t> &salt,
const std::vector<uint8_t> &ikm,
const infoType &info, uint8_t *okm,
size_t okmSize);
345 template <
typename hashAlgo,
typename infoType>
346 void HMAC_KDF(
const uint8_t *
const salt,
const size_t saltSize,
const uint8_t *
const ikm,
const size_t ikmSize,
const infoType &info, uint8_t *output,
size_t outputSize);
366 template <
typename AEADAlgo>
367 void AEAD_encrypt(
const uint8_t *
const key,
const size_t keySize,
const uint8_t *
const IV,
const size_t IVSize,
368 const uint8_t *
const plain,
const size_t plainSize,
const uint8_t *
const AD,
const size_t ADSize,
369 uint8_t *tag,
const size_t tagSize, uint8_t *cipher);
388 template <
typename AEADAlgo>
389 bool AEAD_decrypt(
const uint8_t *
const key,
const size_t keySize,
const uint8_t *
const IV,
const size_t IVSize,
390 const uint8_t *
const cipher,
const size_t cipherSize,
const uint8_t *
const AD,
const size_t ADSize,
391 const uint8_t *
const tag,
const size_t tagSize, uint8_t *plain);
394 template <>
void AEAD_encrypt<AES256GCM>(
const uint8_t *
const key,
const size_t keySize,
const uint8_t *
const IV,
const size_t IVSize,
395 const uint8_t *
const plain,
const size_t plainSize,
const uint8_t *
const AD,
const size_t ADSize,
396 uint8_t *tag,
const size_t tagSize, uint8_t *cipher);
398 template <>
bool AEAD_decrypt<AES256GCM>(
const uint8_t *
const key,
const size_t keySize,
const uint8_t *
const IV,
const size_t IVSize,
399 const uint8_t *
const cipher,
const size_t cipherSize,
const uint8_t *
const AD,
const size_t ADSize,
400 const uint8_t *
const tag,
const size_t tagSize, uint8_t *plain);
409 template <
typename Curve>
412 template <
typename Curve>
419 extern template void HMAC_KDF<SHA512, std::vector<uint8_t>>(
const std::vector<uint8_t> &salt,
const std::vector<uint8_t> &ikm,
const std::vector<uint8_t> &info, uint8_t *output,
size_t outputSize);
420 extern template void HMAC_KDF<SHA512, std::string>(
const std::vector<uint8_t> &salt,
const std::vector<uint8_t> &ikm,
const std::string &info, uint8_t *output,
size_t outputSize);
421 extern template void HMAC_KDF<SHA512, std::vector<uint8_t>>(
const uint8_t *
const salt,
const size_t saltSize,
const uint8_t *
const ikm,
const size_t ikmSize,
const std::vector<uint8_t> &info, uint8_t *output,
size_t outputSize);
422 extern template void HMAC_KDF<SHA512, std::string>(
const uint8_t *
const salt,
const size_t saltSize,
const uint8_t *
const ikm,
const size_t ikmSize,
const std::string &info, uint8_t *output,
size_t outputSize);
424 #ifdef EC25519_ENABLED 426 extern template std::shared_ptr<Signature<C255>>
make_Signature();
435 #endif // EC25519_ENABLED 439 extern template std::shared_ptr<Signature<C448>>
make_Signature();
448 #endif // EC448_ENABLED 452 #endif //lime_crypto_primitives_hpp
static constexpr size_t ssize(void)
provide a static size function to be able to call the function not on an object
Definition: lime_crypto_primitives.hpp:59
X()
Definition: lime_crypto_primitives.hpp:62
DSApair(DSA< Curve, lime::DSAtype::publicKey > &pub, DSA< Curve, lime::DSAtype::privateKey > &priv)
copy construct a key pair from public and private keys (no verification on validity of keys is perfor...
Definition: lime_crypto_primitives.hpp:122
X< Curve, lime::Xtype::privateKey > & privateKey(void)
access the private key
Definition: lime_crypto_primitives.hpp:77
DSA(std::vector< uint8_t >::const_iterator buffer)
contruct from a std::vector<uint8_t>
Definition: lime_crypto_primitives.hpp:102
DSA()
Definition: lime_crypto_primitives.hpp:103
Digital Signature interface.
Definition: lime_crypto_primitives.hpp:237
bool AEAD_decrypt(const uint8_t *const key, const size_t keySize, const uint8_t *const IV, const size_t IVSize, const uint8_t *const cipher, const size_t cipherSize, const uint8_t *const AD, const size_t ADSize, const uint8_t *const tag, const size_t tagSize, uint8_t *plain)
Authenticate and Decrypt using scheme given as template parameter.
Definition: lime_crypto_primitives.cpp:415
std::shared_ptr< RNG > make_RNG()
Definition: lime_crypto_primitives.cpp:76
bool operator==(Xpair< Curve > b) const
== operator assert that public and private keys are the same
Definition: lime_crypto_primitives.hpp:84
Base buffer definition for DSA data structure.
Definition: lime_crypto_primitives.hpp:97
Key pair structure for DSA algorithm.
Definition: lime_crypto_primitives.hpp:112
Key pair structure for key exchange algorithm.
Definition: lime_crypto_primitives.hpp:71
void cleanBuffer(uint8_t *buffer, size_t size)
force a buffer values to zero in a way that shall prevent the compiler from optimizing it out ...
Definition: lime_crypto_primitives.cpp:479
void AEAD_encrypt(const uint8_t *const key, const size_t keySize, const uint8_t *const IV, const size_t IVSize, const uint8_t *const plain, const size_t plainSize, const uint8_t *const AD, const size_t ADSize, uint8_t *tag, const size_t tagSize, uint8_t *cipher)
Encrypt and tag using scheme given as template parameter.
Definition: lime_crypto_primitives.cpp:407
bool operator==(DSApair< Curve > b) const
== operator assert that public and private keys are the same
Definition: lime_crypto_primitives.hpp:125
void HMAC_KDF(const uint8_t *const salt, const size_t saltSize, const uint8_t *const ikm, const size_t ikmSize, const infoType &info, uint8_t *output, size_t outputSize)
Definition: lime_crypto_primitives.cpp:372
std::shared_ptr< keyExchange< Curve > > make_keyExchange()
Definition: lime_crypto_primitives.cpp:348
X(std::vector< uint8_t >::const_iterator buffer)
construct from a std::vector<uint8_t>
Definition: lime_crypto_primitives.hpp:61
void assign(std::vector< uint8_t >::const_iterator buffer)
copy from a std::vector<uint8_t>
Definition: lime_crypto_primitives.hpp:105
void AEAD_encrypt< AES256GCM >(const uint8_t *const key, const size_t keySize, const uint8_t *const IV, const size_t IVSize, const uint8_t *const plain, const size_t plainSize, const uint8_t *const AD, const size_t ADSize, uint8_t *tag, const size_t tagSize, uint8_t *cipher)
Definition: lime_crypto_primitives.cpp:424
std::shared_ptr< Signature< Curve > > make_Signature()
Definition: lime_crypto_primitives.cpp:353
DSA< Curve, lime::DSAtype::publicKey > & publicKey(void)
access the public key
Definition: lime_crypto_primitives.hpp:120
static constexpr size_t ssize(void)
provide a static size function to be able to call the function not on an object
Definition: lime_crypto_primitives.hpp:100
void HMAC< SHA512 >(const uint8_t *const key, const size_t keySize, const uint8_t *const input, const size_t inputSize, uint8_t *hash, size_t hashSize)
Definition: lime_crypto_primitives.cpp:366
void HMAC(const uint8_t *const key, const size_t keySize, const uint8_t *const input, const size_t inputSize, uint8_t *hash, size_t hashSize)
templated HMAC
Definition: lime_crypto_primitives.cpp:360
DSApair()
Definition: lime_crypto_primitives.hpp:123
X< Curve, lime::Xtype::publicKey > & publicKey(void)
access the public key
Definition: lime_crypto_primitives.hpp:79
void assign(std::vector< uint8_t >::const_iterator buffer)
copy from a std::vector<uint8_t>
Definition: lime_crypto_primitives.hpp:64
DSA< Curve, lime::DSAtype::privateKey > & privateKey(void)
access the private key
Definition: lime_crypto_primitives.hpp:118
Xpair()
Definition: lime_crypto_primitives.hpp:82
auto clean fixed size buffer(std::array based)
Definition: lime_crypto_primitives.hpp:42
bool AEAD_decrypt< AES256GCM >(const uint8_t *const key, const size_t keySize, const uint8_t *const IV, const size_t IVSize, const uint8_t *const cipher, const size_t cipherSize, const uint8_t *const AD, const size_t ADSize, const uint8_t *const tag, const size_t tagSize, uint8_t *plain)
Definition: lime_crypto_primitives.cpp:437
Base buffer definition for Key Exchange data structure.
Definition: lime_crypto_primitives.hpp:56
~sBuffer()
zeroise all buffer when done
Definition: lime_crypto_primitives.hpp:44
Xpair(X< Curve, lime::Xtype::publicKey > &pub, X< Curve, lime::Xtype::privateKey > &priv)
copy construct a key pair from public and private keys (no verification on validity of keys is perfor...
Definition: lime_crypto_primitives.hpp:81
Random number generator interface.
Definition: lime_crypto_primitives.hpp:142
Key exchange interface.
Definition: lime_crypto_primitives.hpp:177