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_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); 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; }