int cp_sokaka_gen_prv(sokaka_t k, char *id, int len, bn_t master) { if (pc_map_is_type1()) { g1_map(k->s1, (uint8_t *)id, len); g1_mul(k->s1, k->s1, master); } else { g1_map(k->s1, (uint8_t *)id, len); g1_mul(k->s1, k->s1, master); g2_map(k->s2, (uint8_t *)id, len); g2_mul(k->s2, k->s2, master); } return STS_OK; }
status_t element_from_hash(element_t e, unsigned char *data, int len) { LEAVE_IF(e->isInitialized == FALSE, "uninitialized argument."); GroupType type = e->type; status_t result = ELEMENT_OK; int digest_len = SHA_LEN; unsigned char digest[digest_len + 1]; memset(digest, 0, digest_len); SHA_FUNC(digest, data, len); #ifdef DEBUG printf("%s: digest: ", __FUNCTION__); print_as_hex(digest, digest_len); #endif switch(type) { case ZR: bn_read_bin(e->bn, digest, digest_len); if(bn_cmp(e->bn, e->order) == CMP_GT) bn_mod(e->bn, e->bn, e->order); // bn_print(e->bn); break; case G1: g1_map(e->g1, digest, digest_len); break; case G2: g2_map(e->g2, digest, digest_len); break; default: result = ELEMENT_INVALID_TYPES; break; } return result; }
int cp_bls_sig(g1_t s, uint8_t *msg, int len, bn_t d) { g1_t p; int result = STS_OK; g1_null(p); TRY { g1_new(p); g1_map(p, msg, len); g1_mul(s, p, d); } CATCH_ANY { result = STS_ERR; } FINALLY { g1_free(p); } return result; }
int cp_bls_ver(g1_t s, uint8_t *msg, int len, g2_t q) { g1_t p; g2_t g; gt_t e1, e2; int result = 0; g1_null(p); g2_null(g); gt_null(e1); gt_null(e2); TRY { g1_new(p); g2_new(g); gt_new(e1); gt_new(e2); g2_get_gen(g); g1_map(p, msg, len); pc_map(e1, p, q); pc_map(e2, s, g); if (gt_cmp(e1, e2) == CMP_EQ) { result = 1; } } CATCH_ANY { THROW(ERR_CAUGHT); } FINALLY { g1_free(p); g2_free(g); gt_free(e1); gt_free(e2); } return result; }
status_t element_from_hash(element_t e, unsigned char *data, int len) { LEAVE_IF(e->isInitialized == FALSE, "uninitialized argument."); GroupType type = e->type; status_t result = ELEMENT_OK; int digest_len = SHA_LEN; unsigned char digest[digest_len + 1]; memset(digest, 0, digest_len); SHA_FUNC(digest, data, len); switch(type) { case ZR: bn_read_bin(e->bn, digest, digest_len); break; case G1: g1_map(e->g1, digest, digest_len); break; case G2: g2_map(e->g2, digest, digest_len); break; default: result = ELEMENT_INVALID_TYPES; break; } return result; }
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; }