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
