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>
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;
236 template <
typename Curve>
255 virtual void createKeyPair(std::shared_ptr<lime::RNG> rng) = 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
virtual const X< Curve, lime::Xtype::publicKey > get_peerPublic(void)=0
get Peer Public key
virtual uint32_t randomize()=0
Generate a 32 bits unsigned integer(used to generate keys Id) The MSbit is forced to 0 to avoid deali...
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
virtual const X< Curve, lime::Xtype::sharedSecret > get_sharedSecret(void)=0
get shared secret when exchange is completed
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
Definition: lime_crypto_primitives.hpp:102
DSA()
Definition: lime_crypto_primitives.hpp:103
virtual void set_selfPublic(const X< Curve, lime::Xtype::publicKey > &selfPublic)=0
set Self Public key
virtual void set_secret(const X< Curve, lime::Xtype::privateKey > &secret)=0
set Secret key
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
Base buffer definition for DSA data structure.
Definition: lime_crypto_primitives.hpp:97
virtual const DSA< Curve, lime::DSAtype::privateKey > get_secret(void)=0
Secret key.
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
virtual void set_secret(const DSA< Curve, lime::DSAtype::privateKey > &secretKey)=0
Secret key.
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
virtual void derivePublic(void)=0
Compute the public key using the secret already set in context.
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
virtual ~keyExchange()=default
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
Definition: lime_crypto_primitives.hpp:61
virtual void set_peerPublic(const X< Curve, lime::Xtype::publicKey > &peerPublic)=0
set Peer Public key
virtual ~Signature()=default
void assign(std::vector< uint8_t >::const_iterator buffer)
copy from a std::vector
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
virtual void sign(const std::vector< uint8_t > &message, DSA< Curve, lime::DSAtype::signature > &signature)=0
Sign a message using the key pair previously set in the object.
bool operator==(Xpair< Curve > b) const
== operator assert that public and private keys are the same
Definition: lime_crypto_primitives.hpp:84
virtual const X< Curve, lime::Xtype::privateKey > get_secret(void)=0
get Secret key
std::shared_ptr< Signature< Curve > > make_Signature()
Definition: lime_crypto_primitives.cpp:353
virtual const DSA< Curve, lime::DSAtype::publicKey > get_public(void)=0
Public key.
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
virtual bool verify(const std::vector< uint8_t > &message, const DSA< Curve, lime::DSAtype::signature > &signature)=0
Verify a message signature using the public key previously set in the object.
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
virtual void set_public(const DSA< Curve, lime::DSAtype::publicKey > &publicKey)=0
Public key.
DSApair()
Definition: lime_crypto_primitives.hpp:123
bool operator==(DSApair< Curve > b) const
== operator assert that public and private keys are the same
Definition: lime_crypto_primitives.hpp:125
X< Curve, lime::Xtype::publicKey > & publicKey(void)
access the public key
Definition: lime_crypto_primitives.hpp:79
virtual void computeSharedSecret(void)=0
Perform the shared secret computation, it is then available in the object via get_sharedSecret.
void assign(std::vector< uint8_t >::const_iterator buffer)
copy from a std::vector
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
virtual void deriveSelfPublic(void)=0
Compute the self public key using the secret already set in context.
~sBuffer()
zeroise all buffer when done
Definition: lime_crypto_primitives.hpp:44
virtual const X< Curve, lime::Xtype::publicKey > get_selfPublic(void)=0
get Self Public key
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
virtual void createKeyPair(std::shared_ptr< lime::RNG > rng)=0
generate a new random key pair
Random number generator interface.
Definition: lime_crypto_primitives.hpp:142
Key exchange interface.
Definition: lime_crypto_primitives.hpp:177
virtual void createKeyPair(std::shared_ptr< lime::RNG > rng)=0
generate a new random EdDSA key pair