1 /*############################################################################ 2 # Copyright 2017 Intel Corporation 3 # 4 # Licensed under the Apache License, Version 2.0 (the "License"); 5 # you may not use this file except in compliance with the License. 6 # You may obtain a copy of the License at 7 # 8 # http://www.apache.org/licenses/LICENSE-2.0 9 # 10 # Unless required by applicable law or agreed to in writing, software 11 # distributed under the License is distributed on an "AS IS" BASIS, 12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 # See the License for the specific language governing permissions and 14 # limitations under the License. 15 ############################################################################*/ 16 /// Implementation of de/serialize functionality. 17 /*! \file */ 18 19 #include "epid/member/tiny/math/serialize.h" 20 #include <stddef.h> 21 #include <stdint.h> 22 #include "epid/common/types.h" 23 #include "epid/member/tiny/math/mathtypes.h" 24 #include "epid/member/tiny/stdlib/endian.h" 25 #include "epid/member/tiny/stdlib/tiny_stdlib.h" 26 27 #if !defined(UNOPTIMIZED_SERIALIZATION) 28 void SwapNativeAndPortableLayout(void* dest, size_t dest_size, void const* src, 29 size_t src_size) { 30 size_t i, j; 31 #if defined(DEBUG) 32 if (dest_size != src_size || 0 != src_size % 32) { 33 memset(dest, 0xff, dest_size); 34 return; 35 } 36 #else // defined(DEBUG) 37 (void)dest_size; 38 #endif // defined(DEBUG) 39 for (i = 0; i < src_size; i += 32) { 40 for (j = 0; j < 32 / 2; j += sizeof(uint32_t)) { 41 uint32_t tmp = htobe32( 42 *(uint32_t*)((uint8_t*)src + i + j)); // handle src==dest case 43 *(uint32_t*)((uint8_t*)dest + i + j) = 44 htobe32(*(uint32_t*)((uint8_t*)src + i + 32 - sizeof(uint32_t) - j)); 45 *(uint32_t*)((uint8_t*)dest + i + 32 - sizeof(uint32_t) - j) = tmp; 46 } 47 } 48 } 49 #endif // !defined(UNOPTIMIZED_SERIALIZATION) 50 51 void* Uint32Serialize(OctStr32* dest, uint32_t src) { 52 int i; 53 for (i = 0; i < 4; i++) 54 dest->data[i] = 55 (char)((src >> (24 - 8 * i)) & 56 0x000000FF); // get the ith byte of num, in little-endian order 57 return dest->data + 4; 58 } 59 60 void const* Uint32Deserialize(uint32_t* dest, OctStr32 const* src) { 61 int i; 62 *dest = 0; 63 for (i = 0; i < 4; i++) { 64 *dest <<= 8; 65 *dest |= (uint32_t)(*(&src->data[i]) & 0x000000FF); 66 } 67 return src->data + 4; 68 } 69 70 void* VliSerialize(BigNumStr* dest, VeryLargeInt const* src) { 71 #if defined(UNOPTIMIZED_SERIALIZATION) 72 int i; 73 for (i = NUM_ECC_DIGITS - 1; i >= 0; i--) { 74 dest = Uint32Serialize((OctStr32*)dest, src->word[i]); 75 } 76 return dest; 77 #else // defined(UNOPTIMIZED_SERIALIZATION) 78 SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src)); 79 return dest + 1; 80 #endif // defined(UNOPTIMIZED_SERIALIZATION) 81 } 82 83 void const* VliDeserialize(VeryLargeInt* dest, BigNumStr const* src) { 84 #if defined(UNOPTIMIZED_SERIALIZATION) 85 int i; 86 for (i = NUM_ECC_DIGITS - 1; i >= 0; i--) { 87 src = Uint32Deserialize(dest->word + i, (OctStr32 const*)src); 88 } 89 return src; 90 #else // defined(UNOPTIMIZED_SERIALIZATION) 91 SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src)); 92 return src + 1; 93 #endif // defined(UNOPTIMIZED_SERIALIZATION) 94 } 95 96 void* FqSerialize(FqElemStr* dest, FqElem const* src) { 97 #if defined(UNOPTIMIZED_SERIALIZATION) 98 dest = VliSerialize((BigNumStr*)dest, &src->limbs); 99 return dest; 100 #else // defined(UNOPTIMIZED_SERIALIZATION) 101 SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src)); 102 return dest + 1; 103 #endif // defined(UNOPTIMIZED_SERIALIZATION) 104 } 105 106 void const* FqDeserialize(FqElem* dest, FqElemStr const* src) { 107 #if defined(UNOPTIMIZED_SERIALIZATION) 108 src = VliDeserialize(&dest->limbs, (BigNumStr const*)src); 109 return src; 110 #else // defined(UNOPTIMIZED_SERIALIZATION) 111 SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src)); 112 return src + 1; 113 #endif // defined(UNOPTIMIZED_SERIALIZATION) 114 } 115 116 #if defined(UNOPTIMIZED_SERIALIZATION) 117 static void* Fq2Serialize(Fq2ElemStr* dest, Fq2Elem const* src) { 118 FqSerialize(&dest->a[0], &src->x0); 119 FqSerialize(&dest->a[1], &src->x1); 120 return dest + sizeof(*dest); 121 } 122 123 static void const* Fq2Deserialize(Fq2Elem* dest, Fq2ElemStr const* src) { 124 FqDeserialize(&dest->x0, &src->a[0]); 125 FqDeserialize(&dest->x1, &src->a[1]); 126 return src + sizeof(*src); 127 } 128 129 static void* Fq6Serialize(Fq6ElemStr* dest, Fq6Elem const* src) { 130 Fq2Serialize(&dest->a[0], &src->y0); 131 Fq2Serialize(&dest->a[1], &src->y1); 132 Fq2Serialize(&dest->a[2], &src->y2); 133 return dest + sizeof(*dest); 134 } 135 136 static void const* Fq6Deserialize(Fq6Elem* dest, Fq6ElemStr const* src) { 137 Fq2Deserialize(&dest->y0, &src->a[0]); 138 Fq2Deserialize(&dest->y1, &src->a[1]); 139 Fq2Deserialize(&dest->y2, &src->a[2]); 140 return src + sizeof(*src); 141 } 142 #endif // defined(UNOPTIMIZED_SERIALIZATION) 143 144 void const* Fq12Deserialize(Fq12Elem* dest, Fq12ElemStr const* src) { 145 #if defined(UNOPTIMIZED_SERIALIZATION) 146 Fq6Deserialize(&dest->z0, &src->a[0]); 147 Fq6Deserialize(&dest->z1, &src->a[1]); 148 return src + sizeof(*src); 149 #else // defined(UNOPTIMIZED_SERIALIZATION) 150 SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src)); 151 return src + 1; 152 #endif // defined(UNOPTIMIZED_SERIALIZATION) 153 } 154 155 void* Fq12Serialize(Fq12ElemStr* dest, Fq12Elem const* src) { 156 #if defined(UNOPTIMIZED_SERIALIZATION) 157 Fq6Serialize(&dest->a[0], &src->z0); 158 Fq6Serialize(&dest->a[1], &src->z1); 159 return dest + sizeof(*dest); 160 #else // defined(UNOPTIMIZED_SERIALIZATION) 161 SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src)); 162 return dest + 1; 163 #endif // defined(UNOPTIMIZED_SERIALIZATION) 164 } 165 166 void* FpSerialize(FpElemStr* dest, FpElem const* src) { 167 #if defined(UNOPTIMIZED_SERIALIZATION) 168 dest = VliSerialize((BigNumStr*)dest, &src->limbs); 169 return dest; 170 #else // defined(UNOPTIMIZED_SERIALIZATION) 171 SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src)); 172 return dest + 1; 173 #endif // defined(UNOPTIMIZED_SERIALIZATION) 174 } 175 176 void const* FpDeserialize(FpElem* dest, FpElemStr const* src) { 177 #if defined(UNOPTIMIZED_SERIALIZATION) 178 src = VliDeserialize(&dest->limbs, (BigNumStr const*)src); 179 return src; 180 #else // defined(UNOPTIMIZED_SERIALIZATION) 181 SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src)); 182 return src + 1; 183 #endif // defined(UNOPTIMIZED_SERIALIZATION) 184 } 185 186 void* EFqSerialize(G1ElemStr* dest, EccPointFq const* src) { 187 #if defined(UNOPTIMIZED_SERIALIZATION) 188 dest = FqSerialize((FqElemStr*)dest, &src->x); 189 dest = FqSerialize((FqElemStr*)dest, &src->y); 190 return dest; 191 #else // defined(UNOPTIMIZED_SERIALIZATION) 192 SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src)); 193 return dest + 1; 194 #endif // defined(UNOPTIMIZED_SERIALIZATION) 195 } 196 197 void const* EFqDeserialize(EccPointFq* dest, G1ElemStr const* src) { 198 #if defined(UNOPTIMIZED_SERIALIZATION) 199 src = FqDeserialize(&dest->x, (FqElemStr const*)src); 200 src = FqDeserialize(&dest->y, (FqElemStr const*)src); 201 return src; 202 #else // defined(UNOPTIMIZED_SERIALIZATION) 203 SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src)); 204 return src + 1; 205 #endif // defined(UNOPTIMIZED_SERIALIZATION) 206 } 207 208 void* EFq2Serialize(G2ElemStr* dest, EccPointFq2 const* src) { 209 #if defined(UNOPTIMIZED_SERIALIZATION) 210 dest = FqSerialize((FqElemStr*)dest, &src->x.x0); 211 dest = FqSerialize((FqElemStr*)dest, &src->x.x1); 212 dest = FqSerialize((FqElemStr*)dest, &src->y.x0); 213 dest = FqSerialize((FqElemStr*)dest, &src->y.x1); 214 return dest; 215 #else // defined(UNOPTIMIZED_SERIALIZATION) 216 SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src)); 217 return dest + 1; 218 #endif // defined(UNOPTIMIZED_SERIALIZATION) 219 } 220 221 void const* EFq2Deserialize(EccPointFq2* dest, G2ElemStr const* src) { 222 #if defined(UNOPTIMIZED_SERIALIZATION) 223 src = FqDeserialize(&dest->x.x0, (FqElemStr const*)src); 224 src = FqDeserialize(&dest->x.x1, (FqElemStr const*)src); 225 src = FqDeserialize(&dest->y.x0, (FqElemStr const*)src); 226 src = FqDeserialize(&dest->y.x1, (FqElemStr const*)src); 227 return src; 228 #else // defined(UNOPTIMIZED_SERIALIZATION) 229 SwapNativeAndPortableLayout(dest, sizeof(*dest), src, sizeof(*src)); 230 return src + 1; 231 #endif // defined(UNOPTIMIZED_SERIALIZATION) 232 } 233