11 #include "extralib/Crypto/Crypto.h"
12 #include "extralib/Crypto/Base64.h"
14 String calculateSignature(
const char* key, JsonDocument &jsonMessage) {
15 if (!jsonMessage.containsKey(
"payload"))
return String(
"");
16 String jsonPayload; serializeJson(jsonMessage[
"payload"], jsonPayload);
18 byte rawSigBuf[SHA256HMAC_SIZE];
22 SHA256HMAC hmac((
byte*) key, strlen(key));
23 hmac.doUpdate(jsonPayload.c_str(), jsonPayload.length());
24 hmac.doFinal(rawSigBuf);
27 int b64_len = base64_enc_len(SHA256HMAC_SIZE);
28 char sigBuf[b64_len+1];
29 base64_encode(sigBuf, (
char*) rawSigBuf, SHA256HMAC_SIZE);
31 String result = sigBuf;
36 bool verifyMessage(String key, JsonDocument &jsonMessage) {
37 String jsonHash = jsonMessage[
"signature"][
"HMAC"];
38 String calculatedHash = calculateSignature(key.c_str(), jsonMessage);
39 return jsonHash == calculatedHash;
42 String signMessage(String key, JsonDocument &jsonMessage) {
43 if (!jsonMessage.containsKey(
"signature")) jsonMessage.createNestedObject(
"signature");
44 jsonMessage[
"signature"][
"HMAC"] = calculateSignature(key.c_str(), jsonMessage);
45 String signedMessageString;
46 serializeJson(jsonMessage, signedMessageString);
47 return signedMessageString;
50 #endif // _SIGNATURE_H_