diff --git a/include/olm/pickle.h b/include/olm/pickle.h
index c1e819232db6763fabea0f730e3e704b69bb7188..0e668bb06c69831092f00322b96564d745ddfb6f 100644
--- a/include/olm/pickle.h
+++ b/include/olm/pickle.h
@@ -21,6 +21,10 @@
 extern "C" {
 #endif
 
+struct _olm_ed25519_public_key;
+struct _olm_ed25519_key_pair;
+
+
 #define _olm_pickle_uint32_length(value) 4
 uint8_t * _olm_pickle_uint32(uint8_t * pos, uint32_t value);
 uint8_t const * _olm_unpickle_uint32(
@@ -43,6 +47,42 @@ uint8_t const * _olm_unpickle_bytes(uint8_t const * pos, uint8_t const * end,
                                    uint8_t * bytes, size_t bytes_length);
 
 
+/** Get the number of bytes needed to pickle an ed25519 public key */
+size_t _olm_pickle_ed25519_public_key_length(
+    const struct _olm_ed25519_public_key * value
+);
+
+/** Pickle the ed25519 public key. Returns a pointer to the next free space in
+ * the buffer. */
+uint8_t * _olm_pickle_ed25519_public_key(
+    uint8_t *pos, const struct _olm_ed25519_public_key * value
+);
+
+/** Unpickle the ed25519 public key. Returns a pointer to the next item in the
+ * buffer. */
+const uint8_t * _olm_unpickle_ed25519_public_key(
+    const uint8_t *pos, const uint8_t *end,
+    struct _olm_ed25519_public_key * value
+);
+
+/** Get the number of bytes needed to pickle an ed25519 key pair */
+size_t _olm_pickle_ed25519_key_pair_length(
+    const struct _olm_ed25519_key_pair * value
+);
+
+/** Pickle the ed25519 key pair. Returns a pointer to the next free space in
+ * the buffer. */
+uint8_t * _olm_pickle_ed25519_key_pair(
+    uint8_t *pos, const struct _olm_ed25519_key_pair * value
+);
+
+/** Unpickle the ed25519 key pair. Returns a pointer to the next item in the
+ * buffer. */
+const uint8_t * _olm_unpickle_ed25519_key_pair(
+    const uint8_t *pos, const uint8_t *end,
+    struct _olm_ed25519_key_pair * value
+);
+
 #ifdef __cplusplus
 } // extern "C"
 #endif
diff --git a/include/olm/pickle.hh b/include/olm/pickle.hh
index a09b8a1075429eaa183d1bfdfebba16b9860a6cf..4cf3f36a420017820720d9db45e20d858a0a9947 100644
--- a/include/olm/pickle.hh
+++ b/include/olm/pickle.hh
@@ -141,40 +141,6 @@ std::uint8_t const * unpickle(
     _olm_curve25519_key_pair & value
 );
 
-
-std::size_t pickle_length(
-    const _olm_ed25519_public_key & value
-);
-
-
-std::uint8_t * pickle(
-    std::uint8_t * pos,
-    const _olm_ed25519_public_key & value
-);
-
-
-std::uint8_t const * unpickle(
-    std::uint8_t const * pos, std::uint8_t const * end,
-    _olm_ed25519_public_key & value
-);
-
-
-std::size_t pickle_length(
-    const _olm_ed25519_key_pair & value
-);
-
-
-std::uint8_t * pickle(
-    std::uint8_t * pos,
-    const _olm_ed25519_key_pair & value
-);
-
-
-std::uint8_t const * unpickle(
-    std::uint8_t const * pos, std::uint8_t const * end,
-    _olm_ed25519_key_pair & value
-);
-
 } // namespace olm
 
 
diff --git a/src/account.cpp b/src/account.cpp
index c77f95cf854b11d61a3a8fb7860bbac6713ef61e..248f3d14b87109b20c882c67ff39112da733f2f0 100644
--- a/src/account.cpp
+++ b/src/account.cpp
@@ -14,6 +14,7 @@
  */
 #include "olm/account.hh"
 #include "olm/base64.hh"
+#include "olm/pickle.h"
 #include "olm/pickle.hh"
 #include "olm/memory.hh"
 
@@ -265,7 +266,7 @@ static std::size_t pickle_length(
     olm::IdentityKeys const & value
 ) {
     size_t length = 0;
-    length += olm::pickle_length(value.ed25519_key);
+    length += _olm_pickle_ed25519_key_pair_length(&value.ed25519_key);
     length += olm::pickle_length(value.curve25519_key);
     return length;
 }
@@ -275,7 +276,7 @@ static std::uint8_t * pickle(
     std::uint8_t * pos,
     olm::IdentityKeys const & value
 ) {
-    pos = olm::pickle(pos, value.ed25519_key);
+    pos = _olm_pickle_ed25519_key_pair(pos, &value.ed25519_key);
     pos = olm::pickle(pos, value.curve25519_key);
     return pos;
 }
@@ -285,7 +286,7 @@ static std::uint8_t const * unpickle(
     std::uint8_t const * pos, std::uint8_t const * end,
     olm::IdentityKeys & value
 ) {
-    pos = olm::unpickle(pos, end, value.ed25519_key);
+    pos = _olm_unpickle_ed25519_key_pair(pos, end, &value.ed25519_key);
     pos = olm::unpickle(pos, end, value.curve25519_key);
     return pos;
 }
diff --git a/src/pickle.cpp b/src/pickle.cpp
index e9708b793cbfb83db68afa4ff2b26c05fc96710c..b6ee4c5e864df74e0512da34f3221866fa98c5b9 100644
--- a/src/pickle.cpp
+++ b/src/pickle.cpp
@@ -139,77 +139,76 @@ std::uint8_t const * olm::unpickle(
     return pos;
 }
 
-std::size_t olm::pickle_length(
-    const _olm_ed25519_public_key & value
+////// pickle.h implementations
+
+std::size_t _olm_pickle_ed25519_public_key_length(
+    const _olm_ed25519_public_key * value
 ) {
-    return sizeof(value.public_key);
+    return sizeof(value->public_key);
 }
 
 
-std::uint8_t * olm::pickle(
+std::uint8_t * _olm_pickle_ed25519_public_key(
     std::uint8_t * pos,
-    const _olm_ed25519_public_key & value
+    const _olm_ed25519_public_key *value
 ) {
     pos = olm::pickle_bytes(
-        pos, value.public_key, sizeof(value.public_key)
+        pos, value->public_key, sizeof(value->public_key)
     );
     return pos;
 }
 
 
-std::uint8_t const * olm::unpickle(
+std::uint8_t const * _olm_unpickle_ed25519_public_key(
     std::uint8_t const * pos, std::uint8_t const * end,
-    _olm_ed25519_public_key & value
+    _olm_ed25519_public_key * value
 ) {
     pos = olm::unpickle_bytes(
-        pos, end, value.public_key, sizeof(value.public_key)
+        pos, end, value->public_key, sizeof(value->public_key)
     );
     return pos;
-
 }
 
 
-std::size_t olm::pickle_length(
-    const _olm_ed25519_key_pair & value
+std::size_t _olm_pickle_ed25519_key_pair_length(
+    const _olm_ed25519_key_pair *value
 ) {
-    return sizeof(value.public_key.public_key)
-        + sizeof(value.private_key.private_key);
+    return sizeof(value->public_key.public_key)
+        + sizeof(value->private_key.private_key);
 }
 
 
-std::uint8_t * olm::pickle(
+std::uint8_t * _olm_pickle_ed25519_key_pair(
     std::uint8_t * pos,
-    const _olm_ed25519_key_pair & value
+    const _olm_ed25519_key_pair *value
 ) {
     pos = olm::pickle_bytes(
-        pos, value.public_key.public_key,
-        sizeof(value.public_key.public_key)
+        pos, value->public_key.public_key,
+        sizeof(value->public_key.public_key)
     );
     pos = olm::pickle_bytes(
-        pos, value.private_key.private_key,
-        sizeof(value.private_key.private_key)
+        pos, value->private_key.private_key,
+        sizeof(value->private_key.private_key)
     );
     return pos;
 }
 
 
-std::uint8_t const * olm::unpickle(
+std::uint8_t const * _olm_unpickle_ed25519_key_pair(
     std::uint8_t const * pos, std::uint8_t const * end,
-    _olm_ed25519_key_pair & value
+    _olm_ed25519_key_pair *value
 ) {
     pos = olm::unpickle_bytes(
-        pos, end, value.public_key.public_key,
-        sizeof(value.public_key.public_key)
+        pos, end, value->public_key.public_key,
+        sizeof(value->public_key.public_key)
     );
     pos = olm::unpickle_bytes(
-        pos, end, value.private_key.private_key,
-        sizeof(value.private_key.private_key)
+        pos, end, value->private_key.private_key,
+        sizeof(value->private_key.private_key)
     );
     return pos;
 }
 
-////// pickle.h implementations
-
 uint8_t * _olm_pickle_uint32(uint8_t * pos, uint32_t value) {
     return olm::pickle(pos, value);
 }