Add macaroone implementation into libweave build
BUG:25934771
Change-Id: I86f9806302135f7b7c14582196918ed85a75256e
Reviewed-on: https://weave-review.googlesource.com/1731
Reviewed-by: Alex Vakulenko <avakulenko@google.com>
diff --git a/third_party/libuweave/src/crypto_hmac.c b/third_party/libuweave/src/crypto_hmac.c
new file mode 100644
index 0000000..56bb754
--- /dev/null
+++ b/third_party/libuweave/src/crypto_hmac.c
@@ -0,0 +1,64 @@
+// Copyright 2015 The Weave Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/crypto_hmac.h"
+
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+
+#include <openssl/evp.h>
+#include <openssl/hmac.h>
+
+size_t uw_crypto_hmac_required_buffer_size_() {
+ return sizeof(HMAC_CTX);
+}
+
+bool uw_crypto_hmac_init_(uint8_t* state_buffer,
+ size_t state_buffer_len,
+ const uint8_t* key,
+ size_t key_len) {
+ if (sizeof(HMAC_CTX) > state_buffer_len) {
+ return false;
+ }
+ HMAC_CTX* context = (HMAC_CTX*)state_buffer;
+ HMAC_CTX_init(context);
+ return HMAC_Init(context, key, key_len, EVP_sha256()) ? 0 : sizeof(HMAC_CTX);
+}
+
+bool uw_crypto_hmac_update_(uint8_t* state_buffer,
+ size_t state_buffer_len,
+ const uint8_t* data,
+ size_t data_len) {
+ if (sizeof(HMAC_CTX) > state_buffer_len) {
+ return false;
+ }
+ HMAC_CTX* context = (HMAC_CTX*)state_buffer;
+ return HMAC_Update(context, data, data_len);
+}
+
+bool uw_crypto_hmac_final_(uint8_t* state_buffer,
+ size_t state_buffer_len,
+ uint8_t* truncated_digest,
+ size_t truncated_digest_len) {
+ if (sizeof(HMAC_CTX) > state_buffer_len) {
+ return false;
+ }
+ HMAC_CTX* context = (HMAC_CTX*)state_buffer;
+
+ const size_t kFullDigestLen = (size_t)EVP_MD_size(EVP_sha256());
+ if (truncated_digest_len > kFullDigestLen) {
+ return false;
+ }
+
+ uint8_t digest[kFullDigestLen];
+ uint32_t len = kFullDigestLen;
+
+ bool result = HMAC_Final(context, digest, &len) && kFullDigestLen == len;
+ HMAC_CTX_cleanup(context);
+ if (result) {
+ memcpy(truncated_digest, digest, truncated_digest_len);
+ }
+ return result;
+}