25 #ifndef MCR_EXTRAS_SAFE_STRING_H_ 26 #define MCR_EXTRAS_SAFE_STRING_H_ 28 #include "mcr/extras/util/string.h" 33 #define MCR_AES_BLOCK_SIZE 32 35 #define MCR_AES_IV_SIZE 16 37 #define MCR_AES_TAG_SIZE 16 54 virtual void key(
const void *obj,
61 virtual void deregister(
const void *obj) = 0;
77 && keyProvider), _encrypted(nullptr), _encryptedBufferSize(0),
78 _encryptedBytes(0), _keyProvider(keyProvider), _iv {0}, _lenMem(0),
79 _plain(
nullptr), _plainBufferSize(0), _stateless(
false), _tag {0}
90 if (©tron !=
this)
91 setText(copytron.
text());
103 setText(str, strlen(str));
127 return encrypt(*plainText, plainText.length(), key, iv, tagOut, bufferOut);
135 static int encrypt(
const char *plain,
size_t plainLen,
153 const unsigned char key[MCR_AES_BLOCK_SIZE],
154 const unsigned char iv[MCR_AES_IV_SIZE],
155 const unsigned char tag[])
159 if (!encrypted || !encryptedLength)
160 return ret ? ret :
nullptr;
161 ret.
resize(encryptedLength);
163 decLen = decrypt(encrypted, encryptedLength, key, iv, tag, ret.string());
164 if (static_cast<int>(decLen) != -1)
174 static size_t decrypt(
const unsigned char *encrypted,
int encryptedLength,
175 const unsigned char key[MCR_AES_BLOCK_SIZE],
176 const unsigned char iv[MCR_AES_IV_SIZE],
177 const unsigned char tag[],
char *bufferOut);
185 static void randomize(
unsigned char *bufferOut,
int bufferSize);
192 unsigned char bufferOut[MCR_AES_BLOCK_SIZE])
194 sha(*text, text.length(), bufferOut);
201 static void sha(
const char *text,
size_t textLen,
202 unsigned char bufferOut[MCR_AES_BLOCK_SIZE]);
208 static void initialize();
214 static void deinitialize();
218 static inline void generateKey(
unsigned char keyOut[MCR_AES_BLOCK_SIZE])
221 randomize(keyOut, MCR_AES_BLOCK_SIZE);
226 static inline void initializer(
unsigned char ivOut[MCR_AES_IV_SIZE])
229 randomize(ivOut, MCR_AES_IV_SIZE);
246 void setCryptic(
bool val);
258 inline const unsigned char *
iv()
const 266 void setIv(
unsigned char *iv);
284 void setStateless(
bool val);
296 return _plain ? _plain :
"";
308 size_t text(
char *bufferOut)
const;
313 setText(*str, str.length());
319 void setText(
const char *str,
size_t len);
326 setText(*str, str.length(), cryptic);
332 void setText(
const char *str,
size_t len,
bool cryptic);
340 unsigned char *_encrypted;
341 int _encryptedBufferSize;
347 size_t _plainBufferSize;
const unsigned char * iv() const
void setText(const String &str, bool cryptic)
static void generateKey(unsigned char keyOut[32])
IKeyProvider * keyProvider() const
#define MCR_DECL_INTERFACE(className)
#define MCR_AES_BLOCK_SIZE
static void sha(const String &text, unsigned char bufferOut[32])
Libmacro, by Jonathan Pelletier, New Paradigm Software. Alpha version.
static int encrypt(const String &plainText, const unsigned char key[32], const unsigned char iv[16], unsigned char tagOut[16], unsigned char *bufferOut)
static void initializer(unsigned char ivOut[16])
void setText(const String &str=String())
static String decrypt(const unsigned char *encrypted, int encryptedLength, const unsigned char key[32], const unsigned char iv[16], const unsigned char tag[])
SafeString(IKeyProvider *keyProvider=nullptr, const String &str=String(), bool cryptic=true)
void setLength(size_t val)