PostQuantum.h
1 /* 2 * Copyright (c) 2025, The PurpleI2P Project 3 * 4 * This file is part of Purple i2pd project and licensed under BSD3 5 * 6 * See full license text in LICENSE file at top of project tree 7 */ 8 9 #ifndef POST_QUANTUM_H__ 10 #define POST_QUANTUM_H__ 11 12 #include <memory> 13 #include <string_view> 14 #include <array> 15 #include <tuple> 16 #include "Crypto.h" 17 #include "Identity.h" 18 19 #if OPENSSL_PQ 20 21 namespace i2p 22 { 23 namespace crypto 24 { 25 enum MLKEMTypes 26 { 27 eMLKEM512 = 0, 28 eMLKEM768, 29 eMLKEM1024 30 }; 31 32 constexpr size_t MLKEM512_KEY_LENGTH = 800; 33 constexpr size_t MLKEM512_CIPHER_TEXT_LENGTH = 768; 34 constexpr size_t MLKEM768_KEY_LENGTH = 1184; 35 constexpr size_t MLKEM768_CIPHER_TEXT_LENGTH = 1088; 36 constexpr size_t MLKEM1024_KEY_LENGTH = 1568; 37 constexpr size_t MLKEM1024_CIPHER_TEXT_LENGTH = 1568; 38 39 constexpr std::array<std::tuple<std::string_view, size_t, size_t>, 3> MLKEMS = 40 { 41 std::make_tuple ("ML-KEM-512", MLKEM512_KEY_LENGTH, MLKEM512_CIPHER_TEXT_LENGTH), 42 std::make_tuple ("ML-KEM-768", MLKEM768_KEY_LENGTH, MLKEM768_CIPHER_TEXT_LENGTH), 43 std::make_tuple ("ML-KEM-1024", MLKEM1024_KEY_LENGTH, MLKEM1024_CIPHER_TEXT_LENGTH) 44 }; 45 46 constexpr size_t GetMLKEMPublicKeyLen (i2p::data::CryptoKeyType type) 47 { 48 if (type <= i2p::data::CRYPTO_KEY_TYPE_ECIES_X25519_AEAD || 49 type - i2p::data::CRYPTO_KEY_TYPE_ECIES_X25519_AEAD > (int)MLKEMS.size ()) return 0; 50 return std::get<1>(MLKEMS[type - i2p::data::CRYPTO_KEY_TYPE_ECIES_X25519_AEAD - 1]); 51 } 52 53 constexpr size_t GetMLKEMCipherTextLen (i2p::data::CryptoKeyType type) 54 { 55 if (type <= i2p::data::CRYPTO_KEY_TYPE_ECIES_X25519_AEAD || 56 type - i2p::data::CRYPTO_KEY_TYPE_ECIES_X25519_AEAD > (int)MLKEMS.size ()) return 0; 57 return std::get<2>(MLKEMS[type - i2p::data::CRYPTO_KEY_TYPE_ECIES_X25519_AEAD - 1]); 58 } 59 60 class MLKEMKeys 61 { 62 public: 63 64 MLKEMKeys (MLKEMTypes type); 65 ~MLKEMKeys (); 66 67 void GenerateKeys (); 68 void GetPublicKey (uint8_t * pub) const; 69 void SetPublicKey (const uint8_t * pub); 70 void Encaps (uint8_t * ciphertext, uint8_t * shared); 71 void Decaps (const uint8_t * ciphertext, uint8_t * shared); 72 73 private: 74 75 const std::string m_Name; 76 const size_t m_KeyLen, m_CTLen; 77 EVP_PKEY * m_Pkey; 78 }; 79 80 std::unique_ptr<MLKEMKeys> CreateMLKEMKeys (i2p::data::CryptoKeyType type); 81 82 void InitNoiseIKStateMLKEM (NoiseSymmetricState& state, i2p::data::CryptoKeyType type, const uint8_t * pub); // Noise_IK (ratchets) PQ ML-KEM5 83 void InitNoiseXKStateMLKEM (NoiseSymmetricState& state, i2p::data::CryptoKeyType type, const uint8_t * pub); // Noise_XK PQ ML-KEM5 84 } 85 } 86 87 #endif 88 89 #endif