예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
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;
}