diff --git a/lib/import/import-libkeccak.mk b/lib/import/import-libkeccak.mk
new file mode 100644
index 0000000..9e92fd9
--- /dev/null
+++ b/lib/import/import-libkeccak.mk
@@ -0,0 +1,9 @@
+XKCP_SRC_DIR := $(call select_from_ports,xkcp)
+
+ifeq ($(filter-out $(SPECS),64bit),)
+ INC_DIR += $(XKCP_SRC_DIR)/generic64/libkeccak.a
+endif
+
+ifeq ($(filter-out $(SPECS),32bit),)
+ INC_DIR += $(XKCP_SRC_DIR)/generic32/libkeccak.a
+endif
diff --git a/lib/import/libkeccak.mk b/lib/import/libkeccak.mk
new file mode 100644
index 0000000..e69de29
diff --git a/lib/mk/libkeccak.inc b/lib/mk/libkeccak.inc
new file mode 100644
index 0000000..3f4cddf
--- /dev/null
+++ b/lib/mk/libkeccak.inc
@@ -0,0 +1,3 @@
+INC_DIR += $(REP_DIR)/src/lib/keccak
+SRC_C += $(notdir $(wildcard $(KECCAK_SRC_DIR)/*.c))
+vpath %.c $(KECCAK_SRC_DIR)
diff --git a/lib/mk/spec/32bit/libkeccak.mk b/lib/mk/spec/32bit/libkeccak.mk
new file mode 100644
index 0000000..c356116
--- /dev/null
+++ b/lib/mk/spec/32bit/libkeccak.mk
@@ -0,0 +1,4 @@
+XKCP_SRC_DIR := $(call select_from_ports,xkcp)
+KECCAK_SRC_DIR := $(XKCP_SRC_DIR)/generic32/libkeccak.a
+
+include $(REP_DIR)/lib/mk/libkeccak.inc
diff --git a/lib/mk/spec/64bit/libkeccak.mk b/lib/mk/spec/64bit/libkeccak.mk
new file mode 100644
index 0000000..cd5f3fa
--- /dev/null
+++ b/lib/mk/spec/64bit/libkeccak.mk
@@ -0,0 +1,4 @@
+XKCP_SRC_DIR := $(call select_from_ports,xkcp)
+KECCAK_SRC_DIR := $(XKCP_SRC_DIR)/generic64/libkeccak.a
+
+include $(REP_DIR)/lib/mk/libkeccak.inc
diff --git a/ports/xkcp.hash b/ports/xkcp.hash
new file mode 100644
index 0000000..5787c08
--- /dev/null
+++ b/ports/xkcp.hash
@@ -0,0 +1 @@
+cafc0339ae335bd559d667749899feae48acc9c1
diff --git a/ports/xkcp.port b/ports/xkcp.port
new file mode 100644
index 0000000..8c13fd7
--- /dev/null
+++ b/ports/xkcp.port
@@ -0,0 +1,24 @@
+LICENSE := CC0
+VERSION := HEAD
+DOWNLOADS := xkcp.archive
+
+OWNER := XKCP
+REPO := XKCP
+REV := 645e825ae47d7c91780aa5e48eb07e0b035165ea
+URL(xkcp) := https://github.com/$(OWNER)/$(REPO)/archive/$(REV).tar.gz
+SHA(xkcp) := 883f13c471b31e6ca0329634e74abe5e11cadd50674625b51b40522834a2d6ab
+DIR(xkcp) = tmp
+
+_dirs: generic32/libkeccak.a generic64/libkeccak.a
+
+generic32/libkeccak.a: tmp/bin/generic32_libkeccak.a.tar.gz
+ tar fx $<
+
+generic64/libkeccak.a: tmp/bin/generic64_libkeccak.a.tar.gz
+ tar fx $<
+
+tmp/bin/generic32_libkeccak.a.tar.gz: tmp
+ make -C $< generic32/libkeccak.a.pack
+
+tmp/bin/generic64_libkeccak.a.tar.gz: tmp
+ make -C $< generic64/libkeccak.a.pack
diff --git a/src/lib/keccak/assert.h b/src/lib/keccak/assert.h
new file mode 100644
index 0000000..e69de29
diff --git a/src/lib/keccak/stdint.h b/src/lib/keccak/stdint.h
new file mode 100644
index 0000000..bdd64cf
--- /dev/null
+++ b/src/lib/keccak/stdint.h
@@ -0,0 +1,5 @@
+#include
+#include
+
+typedef genode_uint32_t uint32_t;
+typedef genode_uint64_t uint64_t;
diff --git a/src/lib/keccak/stdio.h b/src/lib/keccak/stdio.h
new file mode 100644
index 0000000..e69de29
diff --git a/src/lib/keccak/stdlib.h b/src/lib/keccak/stdlib.h
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/src/lib/keccak/stdlib.h
@@ -0,0 +1 @@
+
diff --git a/src/lib/keccak/string.h b/src/lib/keccak/string.h
new file mode 100644
index 0000000..ce37b58
--- /dev/null
+++ b/src/lib/keccak/string.h
@@ -0,0 +1,27 @@
+#ifndef __FAKE_STRING_H__
+#define __FAKE_STRING_H__
+
+#include "stdint.h"
+
+static inline int memcmp(const void *p0, const void *p1, size_t size)
+{
+ const unsigned char *c0 = (const unsigned char *)p0;
+ const unsigned char *c1 = (const unsigned char *)p1;
+
+ size_t i;
+ for (i = 0; i < size; i++)
+ if (c0[i] != c1[i]) return c0[i] - c1[i];
+
+ return 0;
+}
+
+void *memcpy(void *dst, const void *src, size_t size);
+void *memset(void *dst, int i, size_t size);
+
+typedef void FILE;
+
+static inline void assert() { }
+static inline int fprintf(FILE * restrict stream, const char * restrict format, ...) { return -1; }
+static inline int fputc(int c, FILE *stream) { return -1; }
+
+#endif