diff --git a/include/olm/pickle.h b/include/olm/pickle.h index c1e8192..0e668bb 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 a09b8a1..4cf3f36 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 c77f95c..248f3d1 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 e9708b7..b6ee4c5 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 -) { - return sizeof(value.public_key); -} - - -std::uint8_t * olm::pickle( - std::uint8_t * pos, - const _olm_ed25519_public_key & value -) { - pos = olm::pickle_bytes( - pos, value.public_key, sizeof(value.public_key) - ); - return pos; -} - - -std::uint8_t const * olm::unpickle( - std::uint8_t const * pos, std::uint8_t const * end, - _olm_ed25519_public_key & value -) { - pos = olm::unpickle_bytes( - pos, end, value.public_key, sizeof(value.public_key) - ); - return pos; - -} - - -std::size_t olm::pickle_length( - const _olm_ed25519_key_pair & value -) { - return sizeof(value.public_key.public_key) - + sizeof(value.private_key.private_key); -} - - -std::uint8_t * olm::pickle( - std::uint8_t * pos, - const _olm_ed25519_key_pair & value -) { - pos = olm::pickle_bytes( - 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) - ); - return pos; -} - - -std::uint8_t const * olm::unpickle( - std::uint8_t const * pos, std::uint8_t const * end, - _olm_ed25519_key_pair & value -) { - pos = olm::unpickle_bytes( - 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) - ); - return pos; -} - ////// pickle.h implementations +std::size_t _olm_pickle_ed25519_public_key_length( + const _olm_ed25519_public_key * value +) { + return sizeof(value->public_key); +} + + +std::uint8_t * _olm_pickle_ed25519_public_key( + std::uint8_t * pos, + const _olm_ed25519_public_key *value +) { + pos = olm::pickle_bytes( + pos, value->public_key, sizeof(value->public_key) + ); + return pos; +} + + +std::uint8_t const * _olm_unpickle_ed25519_public_key( + std::uint8_t const * pos, std::uint8_t const * end, + _olm_ed25519_public_key * value +) { + pos = olm::unpickle_bytes( + pos, end, value->public_key, sizeof(value->public_key) + ); + return pos; +} + + +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); +} + + +std::uint8_t * _olm_pickle_ed25519_key_pair( + std::uint8_t * pos, + const _olm_ed25519_key_pair *value +) { + pos = olm::pickle_bytes( + 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) + ); + return pos; +} + + +std::uint8_t const * _olm_unpickle_ed25519_key_pair( + std::uint8_t const * pos, std::uint8_t const * end, + _olm_ed25519_key_pair *value +) { + pos = olm::unpickle_bytes( + 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) + ); + return pos; +} + uint8_t * _olm_pickle_uint32(uint8_t * pos, uint32_t value) { return olm::pickle(pos, value); }