* #35924 (zrtp): switch to libzrtpcpp
diff --git a/jni/libzrtp/sources/zrtp/crypto/hmac256.cpp b/jni/libzrtp/sources/zrtp/crypto/hmac256.cpp
new file mode 100644
index 0000000..1e3ceb7
--- /dev/null
+++ b/jni/libzrtp/sources/zrtp/crypto/hmac256.cpp
@@ -0,0 +1,186 @@
+/*
+  Copyright (C) 2012-2013 Werner Dittmann
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License as published by the Free Software Foundation; either
+  version 2.1 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL.  If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so.  If you
+ * do not wish to do so, delete this exception statement from your
+ * version.  If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+/*
+ * Authors: Werner Dittmann
+ */
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include "zrtp/crypto/sha2.h"
+#include "zrtp/crypto/hmac256.h"
+
+typedef struct _hmacSha256Context {
+    sha256_ctx ctx;
+    sha256_ctx innerCtx;
+    sha256_ctx outerCtx;
+} hmacSha256Context;
+
+static int32_t hmacSha256Init(hmacSha256Context *ctx, const uint8_t *key, uint32_t kLength)
+{
+    int32_t i;
+    uint8_t localPad[SHA256_BLOCK_SIZE] = {0};
+    uint8_t localKey[SHA256_BLOCK_SIZE] = {0};
+
+    if (key == NULL)
+        return 0;
+
+    memset(ctx, 0, sizeof(hmacSha256Context));
+
+    /* check key length and reduce it if necessary */
+    if (kLength > SHA256_BLOCK_SIZE) {
+        sha256_begin(&ctx->ctx);
+        sha256_hash(key, kLength, &ctx->ctx);
+        sha256_end(localKey, &ctx->ctx);
+    }
+    else {
+        memcpy(localKey, key, kLength);
+    }
+    /* prepare inner hash and hold the context */
+    for (i = 0; i < SHA256_BLOCK_SIZE; i++)
+        localPad[i] = localKey[i] ^ 0x36;
+
+    sha256_begin(&ctx->innerCtx);
+    sha256_hash(localPad, SHA256_BLOCK_SIZE, &ctx->innerCtx);
+
+    /* prepare outer hash and hold the context */
+    for (i = 0; i < SHA256_BLOCK_SIZE; i++)
+        localPad[i] = localKey[i] ^ 0x5c;
+
+    sha256_begin(&ctx->outerCtx);
+    sha256_hash(localPad, SHA256_BLOCK_SIZE, &ctx->outerCtx);
+
+    /* copy prepared inner hash to work hash - ready to process data */
+    memcpy(&ctx->ctx, &ctx->innerCtx, sizeof(sha256_ctx));
+
+    memset(localKey, 0, sizeof(localKey));
+
+    return 1;
+}
+
+static void hmacSha256Reset(hmacSha256Context *ctx)
+{
+    /* copy prepared inner hash to work hash context */
+    memcpy(&ctx->ctx, &ctx->innerCtx, sizeof(sha256_ctx));
+}
+
+static void hmacSha256Update(hmacSha256Context *ctx, const uint8_t *data, uint32_t dLength)
+{
+    /* hash new data to work hash context */
+    sha256_hash(data, dLength, &ctx->ctx);
+}
+
+static void hmacSha256Final(hmacSha256Context *ctx, uint8_t *mac)
+{
+    uint8_t tmpDigest[SHA256_DIGEST_SIZE];
+
+    /* finalize work hash context */
+    sha256_end(tmpDigest, &ctx->ctx);
+
+    /* copy prepared outer hash to work hash */
+    memcpy(&ctx->ctx, &ctx->outerCtx, sizeof(sha256_ctx));
+
+    /* hash inner digest to work (outer) hash context */
+    sha256_hash(tmpDigest, SHA256_DIGEST_SIZE, &ctx->ctx);
+
+    /* finalize work hash context to get the hmac*/
+    sha256_end(mac, &ctx->ctx);
+}
+
+
+void hmac_sha256(uint8_t *key, uint32_t keyLength, uint8_t* data, int32_t dataLength, uint8_t* mac, uint32_t* macLength)
+{
+    hmacSha256Context ctx;
+
+    hmacSha256Init(&ctx, key, keyLength);
+    hmacSha256Update(&ctx, data, dataLength);
+    hmacSha256Final(&ctx, mac);
+    *macLength = SHA256_DIGEST_SIZE;
+}
+
+void hmac_sha256(uint8_t* key, uint32_t keyLength, uint8_t* dataChunks[], uint32_t dataChunckLength[],
+                uint8_t* mac, uint32_t* macLength )
+{
+    hmacSha256Context ctx;
+
+    hmacSha256Init(&ctx, key, keyLength);
+
+    while (*dataChunks) {
+        hmacSha256Update(&ctx, *dataChunks, *dataChunckLength);
+        dataChunks ++;
+        dataChunckLength ++;
+    }
+    hmacSha256Final(&ctx, mac);
+    *macLength = SHA256_DIGEST_SIZE;
+}
+
+void* createSha256HmacContext(uint8_t* key, int32_t keyLength)
+{
+    hmacSha256Context *ctx = reinterpret_cast<hmacSha256Context*>(malloc(sizeof(hmacSha256Context)));
+
+    hmacSha256Init(ctx, key, keyLength);
+    return ctx;
+}
+
+void hmacSha256Ctx(void* ctx, const uint8_t* data, uint32_t dataLength,
+                uint8_t* mac, int32_t* macLength)
+{
+    hmacSha256Context *pctx = (hmacSha256Context*)ctx;
+
+    hmacSha256Reset(pctx);
+    hmacSha256Update(pctx, data, dataLength);
+    hmacSha256Final(pctx, mac);
+    *macLength = SHA256_DIGEST_SIZE;
+}
+
+void hmacSha256Ctx(void* ctx, const uint8_t* data[], uint32_t dataLength[],
+                uint8_t* mac, int32_t* macLength )
+{
+    hmacSha256Context *pctx = (hmacSha256Context*)ctx;
+
+    hmacSha256Reset(pctx);
+    while (*data) {
+        hmacSha256Update(pctx, *data, *dataLength);
+        data++;
+        dataLength++;
+    }
+    hmacSha256Final(pctx, mac);
+    *macLength = SHA256_DIGEST_SIZE;
+}
+
+void freeSha256HmacContext(void* ctx)
+{
+    if (ctx) {
+        memset(ctx, 0, sizeof(hmacSha256Context));
+        free(ctx);
+    }
+}
\ No newline at end of file