普通文本  |  424行  |  18.58 KB

/*############################################################################
# Copyright 2017 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
############################################################################*/
/// Unit tests of serialization implementation.
/*! \file */

#include <gtest/gtest.h>
#include <stdint.h>
#include <cstring>
#include "epid/member/tiny/math/unittests/cmp-testhelper.h"

extern "C" {
#include "epid/common/types.h"
#include "epid/member/tiny/math/mathtypes.h"
#include "epid/member/tiny/math/serialize.h"
}

bool operator==(OctStr32 const& lhs, OctStr32 const& rhs) {
  return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
}

bool operator==(BigNumStr const& lhs, BigNumStr const& rhs) {
  return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
}

bool operator==(FpElemStr const& lhs, FpElemStr const& rhs) {
  return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
}

bool operator==(FqElemStr const& lhs, FqElemStr const& rhs) {
  return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
}

bool operator==(G1ElemStr const& lhs, G1ElemStr const& rhs) {
  return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
}

bool operator==(G2ElemStr const& lhs, G2ElemStr const& rhs) {
  return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
}

bool operator==(Fq12ElemStr const& lhs, Fq12ElemStr const& rhs) {
  return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
}

namespace {
////////////////////////////////////////////////////////////////////////
// Uint32Serialize

TEST(TinySerializeTest, Uint32SerializeWorks) {
  OctStr32 octstr = {0};
  const OctStr32 expected_octstr = {0x01, 0x02, 0x03, 0x04};
  const uint32_t num = 0x01020304;
  Uint32Serialize(&octstr, num);
  EXPECT_EQ(expected_octstr, octstr);
}

////////////////////////////////////////////////////////////////////////
// Uint32Deserialize

TEST(TinySerializeTest, Uint32DeserializeWorks) {
  const OctStr32 octstr = {0x01, 0x02, 0x03, 0x04};
  uint32_t num = 0;
  const uint32_t expected_num = 0x01020304;
  Uint32Deserialize(&num, &octstr);
  EXPECT_EQ(expected_num, num);
}

////////////////////////////////////////////////////////////////////////
// VliSerialize

TEST(TinySerializeTest, VliSerializeWorks) {
  const VeryLargeInt vli = {0x01020304, 0x05060708, 0x090A0B0C, 0x0D0E0F10,
                            0x11121314, 0x15161718, 0x191A1B1C, 0x1D1E1F20};
  BigNumStr serialize_vli = {0};
  const BigNumStr expected_serialize_vli = {
      0x1D, 0x1E, 0x1F, 0x20, 0x19, 0x1A, 0x1B, 0x1C, 0x15, 0x16, 0x17,
      0x18, 0x11, 0x12, 0x13, 0x14, 0x0D, 0x0E, 0x0F, 0x10, 0x09, 0x0A,
      0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04};
  VliSerialize(&serialize_vli, &vli);
  EXPECT_EQ(expected_serialize_vli, serialize_vli);
}

////////////////////////////////////////////////////////////////////////
// VliDeserialize

TEST(TinySerializeTest, VliDeserializeWorks) {
  VeryLargeInt vli = {0};
  const VeryLargeInt expected_vli = {0x01020304, 0x05060708, 0x090A0B0C,
                                     0x0D0E0F10, 0x11121314, 0x15161718,
                                     0x191A1B1C, 0x1D1E1F20};
  const BigNumStr serialize_vli = {
      0x1D, 0x1E, 0x1F, 0x20, 0x19, 0x1A, 0x1B, 0x1C, 0x15, 0x16, 0x17,
      0x18, 0x11, 0x12, 0x13, 0x14, 0x0D, 0x0E, 0x0F, 0x10, 0x09, 0x0A,
      0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04};
  VliDeserialize(&vli, &serialize_vli);
  EXPECT_EQ(expected_vli, vli);
}

////////////////////////////////////////////////////////////////////////
// FqSerialize

TEST(TinySerializeTest, FqSerializeWorks) {
  const FqElem fqelm = {0x01020304, 0x05060708, 0x090A0B0C, 0x0D0E0F10,
                        0x11121314, 0x15161718, 0x191A1B1C, 0x1D1E1F20};
  FqElemStr serialize_fqelm = {0};
  const FqElemStr expected_serialize_fqelm = {
      0x1D, 0x1E, 0x1F, 0x20, 0x19, 0x1A, 0x1B, 0x1C, 0x15, 0x16, 0x17,
      0x18, 0x11, 0x12, 0x13, 0x14, 0x0D, 0x0E, 0x0F, 0x10, 0x09, 0x0A,
      0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04};
  FqSerialize(&serialize_fqelm, &fqelm);
  EXPECT_EQ(expected_serialize_fqelm, serialize_fqelm);
}

////////////////////////////////////////////////////////////////////////
// FqDeserialize

TEST(TinySerializeTest, FqDeserializeWorks) {
  const FqElemStr serialize_fqelm = {
      0x1D, 0x1E, 0x1F, 0x20, 0x19, 0x1A, 0x1B, 0x1C, 0x15, 0x16, 0x17,
      0x18, 0x11, 0x12, 0x13, 0x14, 0x0D, 0x0E, 0x0F, 0x10, 0x09, 0x0A,
      0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04};
  FqElem fqelm = {0};
  const FqElem expected_fqelm = {0x01020304, 0x05060708, 0x090A0B0C,
                                 0x0D0E0F10, 0x11121314, 0x15161718,
                                 0x191A1B1C, 0x1D1E1F20};
  FqDeserialize(&fqelm, &serialize_fqelm);
  EXPECT_EQ(expected_fqelm, fqelm);
}

////////////////////////////////////////////////////////////////////////
// Fq12Serialize

TEST(TinySerializeTest, Fq12SerializeWorks) {
  const Fq12Elem fq12elm = {
      {{
           {0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
           {0x00000200, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
       },
       {
           {0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
           {0x04000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
       },
       {
           {0x00000000, 0x00000005, 0x00000000, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
           {0x00000000, 0x00000600, 0x00000000, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
       }},
      {{
           {0x00000000, 0x00070000, 0x00000000, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
           {0x00000000, 0x08000000, 0x00000000, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
       },
       {
           {0x00000000, 0x00000000, 0x00000009, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
           {0x00000000, 0x00000000, 0x00000A00, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
       },
       {
           {0x00000000, 0x00000000, 0x000B0000, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
           {0x00000000, 0x00000000, 0x0C000000, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
       }}};
  Fq12ElemStr serialized_fq12elm = {0};
  const Fq12ElemStr expected_serialized_fq12elm = {
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,

      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,

      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,

      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  };
  Fq12Serialize(&serialized_fq12elm, &fq12elm);
  EXPECT_EQ(expected_serialized_fq12elm, serialized_fq12elm);
}

////////////////////////////////////////////////////////////////////////
// Fq12Deserialize

TEST(TinySerializeTest, Fq12DeserializeWorks) {
  const Fq12ElemStr serialized_fq12elm = {
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,

      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,

      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,

      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  };
  Fq12Elem fq12elm = {0};
  const Fq12Elem expected_fq12elm = {
      {{
           {0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
           {0x00000200, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
       },
       {
           {0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
           {0x04000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
       },
       {
           {0x00000000, 0x00000005, 0x00000000, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
           {0x00000000, 0x00000600, 0x00000000, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
       }},
      {{
           {0x00000000, 0x00070000, 0x00000000, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
           {0x00000000, 0x08000000, 0x00000000, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
       },
       {
           {0x00000000, 0x00000000, 0x00000009, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
           {0x00000000, 0x00000000, 0x00000A00, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
       },
       {
           {0x00000000, 0x00000000, 0x000B0000, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
           {0x00000000, 0x00000000, 0x0C000000, 0x00000000, 0x00000000,
            0x00000000, 0x00000000, 0x00000000},
       }}};
  Fq12Deserialize(&fq12elm, &serialized_fq12elm);
  EXPECT_EQ(expected_fq12elm, fq12elm);
}

////////////////////////////////////////////////////////////////////////
// FpSerialize

TEST(TinySerializeTest, FpSerializeWorks) {
  const FpElem fpelm = {0x01020304, 0x05060708, 0x090A0B0C, 0x0D0E0F10,
                        0x11121314, 0x15161718, 0x191A1B1C, 0x1D1E1F20};
  FpElemStr serialize_fpelm = {0};
  const FpElemStr expected_serialize_fpelm = {
      0x1D, 0x1E, 0x1F, 0x20, 0x19, 0x1A, 0x1B, 0x1C, 0x15, 0x16, 0x17,
      0x18, 0x11, 0x12, 0x13, 0x14, 0x0D, 0x0E, 0x0F, 0x10, 0x09, 0x0A,
      0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04};
  FpSerialize(&serialize_fpelm, &fpelm);
  EXPECT_EQ(expected_serialize_fpelm, serialize_fpelm);
}

////////////////////////////////////////////////////////////////////////
// FpDeserialize

TEST(TinySerializeTest, FpDeserializeWorks) {
  const FpElemStr serialize_fpelm = {
      0x1D, 0x1E, 0x1F, 0x20, 0x19, 0x1A, 0x1B, 0x1C, 0x15, 0x16, 0x17,
      0x18, 0x11, 0x12, 0x13, 0x14, 0x0D, 0x0E, 0x0F, 0x10, 0x09, 0x0A,
      0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04};
  FpElem fpelm = {0};
  const FpElem expected_fpelm = {0x01020304, 0x05060708, 0x090A0B0C,
                                 0x0D0E0F10, 0x11121314, 0x15161718,
                                 0x191A1B1C, 0x1D1E1F20};
  FpDeserialize(&fpelm, &serialize_fpelm);
  EXPECT_EQ(expected_fpelm, fpelm);
}

////////////////////////////////////////////////////////////////////////
// EFqSerialize

TEST(TinySerializeTest, EFqSerializeWorks) {
  const FqElem fqelm = {0x01020304, 0x05060708, 0x090A0B0C, 0x0D0E0F10,
                        0x11121314, 0x15161718, 0x191A1B1C, 0x1D1E1F20};
  const EccPointFq efq_point = {fqelm, fqelm};
  const FqElemStr serialize_fqelm = {
      0x1D, 0x1E, 0x1F, 0x20, 0x19, 0x1A, 0x1B, 0x1C, 0x15, 0x16, 0x17,
      0x18, 0x11, 0x12, 0x13, 0x14, 0x0D, 0x0E, 0x0F, 0x10, 0x09, 0x0A,
      0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04};
  G1ElemStr efq_point_serialize = {0};
  const G1ElemStr expected_efq_point_serialize = {serialize_fqelm,
                                                  serialize_fqelm};
  EFqSerialize(&efq_point_serialize, &efq_point);
  EXPECT_EQ(expected_efq_point_serialize, efq_point_serialize);
}

////////////////////////////////////////////////////////////////////////
// EFqDeserialize

TEST(TinySerializeTest, EFqDeserializeWorks) {
  const FqElemStr serialize_fqelm = {
      0x1D, 0x1E, 0x1F, 0x20, 0x19, 0x1A, 0x1B, 0x1C, 0x15, 0x16, 0x17,
      0x18, 0x11, 0x12, 0x13, 0x14, 0x0D, 0x0E, 0x0F, 0x10, 0x09, 0x0A,
      0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04};
  const G1ElemStr serialize_efq_point = {serialize_fqelm, serialize_fqelm};
  EccPointFq efq_point = {0};
  const FqElem fqelm = {0x01020304, 0x05060708, 0x090A0B0C, 0x0D0E0F10,
                        0x11121314, 0x15161718, 0x191A1B1C, 0x1D1E1F20};
  const EccPointFq expected_efq_point = {fqelm, fqelm};
  EFqDeserialize(&efq_point, &serialize_efq_point);
  EXPECT_EQ(expected_efq_point, efq_point);
}

////////////////////////////////////////////////////////////////////////
// EFq2Serialize

TEST(TinySerializeTest, EFq2SerializeWorks) {
  const FqElem fqelm = {0x01020304, 0x05060708, 0x090A0B0C, 0x0D0E0F10,
                        0x11121314, 0x15161718, 0x191A1B1C, 0x1D1E1F20};
  const EccPointFq2 efq2_point = {{fqelm, fqelm}, {fqelm, fqelm}};
  const FqElemStr serialize_fqelm = {
      0x1D, 0x1E, 0x1F, 0x20, 0x19, 0x1A, 0x1B, 0x1C, 0x15, 0x16, 0x17,
      0x18, 0x11, 0x12, 0x13, 0x14, 0x0D, 0x0E, 0x0F, 0x10, 0x09, 0x0A,
      0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04};
  G2ElemStr efq2_point_serialize = {0};
  const G2ElemStr expected_efq2_point_serialize = {
      {serialize_fqelm, serialize_fqelm}, {serialize_fqelm, serialize_fqelm}};
  EFq2Serialize(&efq2_point_serialize, &efq2_point);
  EXPECT_EQ(expected_efq2_point_serialize, efq2_point_serialize);
}

////////////////////////////////////////////////////////////////////////
// EFq2Deserialize

TEST(TinySerializeTest, EFq2DeserializeWorks) {
  const FqElemStr serialize_fqelm = {
      0x1D, 0x1E, 0x1F, 0x20, 0x19, 0x1A, 0x1B, 0x1C, 0x15, 0x16, 0x17,
      0x18, 0x11, 0x12, 0x13, 0x14, 0x0D, 0x0E, 0x0F, 0x10, 0x09, 0x0A,
      0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04};
  const G2ElemStr serialize_efq2_point = {{serialize_fqelm, serialize_fqelm},
                                          {serialize_fqelm, serialize_fqelm}};
  EccPointFq2 efq2_point = {0};
  const FqElem fqelm = {0x01020304, 0x05060708, 0x090A0B0C, 0x0D0E0F10,
                        0x11121314, 0x15161718, 0x191A1B1C, 0x1D1E1F20};
  const EccPointFq2 expected_efq2_point = {{fqelm, fqelm}, {fqelm, fqelm}};
  EFq2Deserialize(&efq2_point, &serialize_efq2_point);
  EXPECT_EQ(expected_efq2_point, efq2_point);
}

}  // namespace