bool point_set_contains(struct point_set * set, struct point * point) { struct point * vec = set->vec; size_t size = set->size; for (size_t i = 0; i < size;) { if (point_eq(&vec[i++], point, &set->ratio)) { return true; } } return false; }
cryptonite_decaf_error_t cryptonite_decaf_ed448_verify ( const uint8_t signature[CRYPTONITE_DECAF_EDDSA_448_SIGNATURE_BYTES], const uint8_t pubkey[CRYPTONITE_DECAF_EDDSA_448_PUBLIC_BYTES], const uint8_t *message, size_t message_len, uint8_t prehashed, const uint8_t *context, uint8_t context_len ) { API_NS(point_t) pk_point, r_point; cryptonite_decaf_error_t error = API_NS(point_decode_like_eddsa_and_ignore_cofactor)(pk_point,pubkey); if (CRYPTONITE_DECAF_SUCCESS != error) { return error; } error = API_NS(point_decode_like_eddsa_and_ignore_cofactor)(r_point,signature); if (CRYPTONITE_DECAF_SUCCESS != error) { return error; } API_NS(scalar_t) challenge_scalar; { /* Compute the challenge */ hash_ctx_t hash; hash_init_with_dom(hash,prehashed,0,context,context_len); hash_update(hash,signature,CRYPTONITE_DECAF_EDDSA_448_PUBLIC_BYTES); hash_update(hash,pubkey,CRYPTONITE_DECAF_EDDSA_448_PUBLIC_BYTES); hash_update(hash,message,message_len); uint8_t challenge[2*CRYPTONITE_DECAF_EDDSA_448_PRIVATE_BYTES]; hash_final(hash,challenge,sizeof(challenge)); hash_destroy(hash); API_NS(scalar_decode_long)(challenge_scalar,challenge,sizeof(challenge)); cryptonite_decaf_bzero(challenge,sizeof(challenge)); } API_NS(scalar_sub)(challenge_scalar, API_NS(scalar_zero), challenge_scalar); API_NS(scalar_t) response_scalar; API_NS(scalar_decode_long)( response_scalar, &signature[CRYPTONITE_DECAF_EDDSA_448_PUBLIC_BYTES], CRYPTONITE_DECAF_EDDSA_448_PRIVATE_BYTES ); #if EDDSA_BASE_POINT_RATIO == 2 API_NS(scalar_add)(response_scalar,response_scalar,response_scalar); #endif /* pk_point = -c(x(P)) + (cx + k)G = kG */ API_NS(base_double_scalarmul_non_secret)( pk_point, response_scalar, pk_point, challenge_scalar ); return cryptonite_decaf_succeed_if(API_NS(point_eq(pk_point,r_point))); }