string Element_ToBytes(Element &e) { int data_len; string encoded= ""; if(e.type == Str_t) { return string(e.strPtr); } else if(e.type == ZR_t) { data_len = compute_length(e.type); uint8_t data[data_len+1]; memset(data, 0, data_len); bn_write_bin(data, data_len, e.zr.z); string t((char *) data, data_len); encoded = _base64_encode(reinterpret_cast<const unsigned char*>(t.c_str()), t.size()); memset(data, 0, data_len); } else if(e.type == G1_t) { data_len = compute_length(e.type); uint8_t data[data_len+1]; memset(data, 0, data_len); g1_write_bin(e.g1.g, data, data_len); string t((char *) data, data_len); encoded = _base64_encode(reinterpret_cast<const unsigned char*>(t.c_str()), t.size()); memset(data, 0, data_len); } else if(e.type == G2_t) { data_len = compute_length(e.type); uint8_t data[data_len+1]; memset(data, 0, data_len); g2_write_bin(e.g2.g, data, data_len); string t((char *) data, data_len); encoded = _base64_encode(reinterpret_cast<const unsigned char*>(t.c_str()), t.size()); memset(data, 0, data_len); } else if(e.type == GT_t) { data_len = compute_length(e.type); uint8_t data[data_len+1]; memset(data, 0, data_len); gt_write_bin(e.gt.g, data, data_len); // x1-6 && y1-6 string t((char *) data, data_len); encoded = _base64_encode(reinterpret_cast<const unsigned char*>(t.c_str()), t.size()); memset(data, 0, data_len); } return encoded; }
status_t element_to_bytes(unsigned char *data, int data_len, element_t e) { LEAVE_IF(e->isInitialized != TRUE, "uninitialized argument."); GroupType type = e->type; if(type == ZR) { bn_write_bin(data, data_len, e->bn); } else if(type == G1) { return g1_write_bin(e->g1, data, data_len); // x & y } else if(type == G2) { return g2_write_bin(e->g2, data, data_len); // x1, y1 & x2, y2 } else if(type == GT) { return gt_write_bin(e->gt, data, data_len); // x1-6 && y1-6 } else { return ELEMENT_INVALID_TYPES; } return ELEMENT_OK; }
int cp_sokaka_key(uint8_t *key, unsigned int key_len, char *id1, int len1, sokaka_t k, char *id2, int len2) { int first = 0, result = STS_OK; g1_t p; g2_t q; gt_t e; g1_null(p); g2_null(q); gt_null(e); TRY { g1_new(p); g2_new(q); gt_new(e); if (len1 == len2) { if (strncmp(id1, id2, len1) == 0) { THROW(ERR_NO_VALID); } first = (strncmp(id1, id2, len1) < 0 ? 1 : 2); } else { if (len1 < len2) { if (strncmp(id1, id2, len1) == 0) { first = 1; } else { first = (strncmp(id1, id2, len2) < 0 ? 1 : 2); } } else { if (strncmp(id1, id2, len2) == 0) { first = 2; } else { first = (strncmp(id1, id2, len2) < 0 ? 1 : 2); } } } if (pc_map_is_type1()) { g2_map(q, (uint8_t *)id2, len2); pc_map(e, k->s1, q); } else { if (first == 1) { g2_map(q, (uint8_t *)id2, len2); pc_map(e, k->s1, q); } else { g1_map(p, (uint8_t *)id2, len2); pc_map(e, p, k->s2); } } /* Allocate size for storing the output. */ uint8_t buf[gt_size_bin(e, 0)]; gt_write_bin(buf, sizeof(buf), e, 0); md_kdf1(key, key_len, buf, sizeof(buf)); } CATCH_ANY { result = STS_ERR; } FINALLY { g1_free(p); g2_free(q); gt_free(e); } return result; }