| /* This Source Code Form is subject to the terms of the Mozilla Public |
| * License, v. 2.0. If a copy of the MPL was not distributed with this |
| * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| |
| /* Helper functions for MPI fuzzing targets. */ |
| |
| #ifndef mpi_helper_h__ |
| #define mpi_helper_h__ |
| |
| #include <iostream> |
| #include <string> |
| #include <tuple> |
| #include <vector> |
| |
| #include "hasht.h" |
| #include "mpi.h" |
| |
| #include <openssl/bn.h> |
| |
| void check_equal(BIGNUM *b, mp_int *m, size_t max_size); |
| void parse_input(const uint8_t *data, size_t size, BIGNUM *A, BIGNUM *B, |
| mp_int *a, mp_int *b); |
| void parse_input(const uint8_t *data, size_t size, BIGNUM *A, mp_int *a); |
| std::tuple<BIGNUM *, mp_int> get_modulus(const uint8_t *data, size_t size, |
| BN_CTX *ctx); |
| void print_bn(std::string label, BIGNUM *x); |
| |
| // Initialise MPI and BN variables |
| // XXX: Also silence unused variable warnings for R. |
| #define INIT_FOUR_NUMBERS \ |
| mp_int a, b, c, r; \ |
| mp_int *m1 = nullptr; \ |
| BN_CTX *ctx = BN_CTX_new(); \ |
| BN_CTX_start(ctx); \ |
| BIGNUM *A = BN_CTX_get(ctx); \ |
| BIGNUM *B = BN_CTX_get(ctx); \ |
| BIGNUM *C = BN_CTX_get(ctx); \ |
| BIGNUM *R = BN_CTX_get(ctx); \ |
| assert(mp_init(&a) == MP_OKAY); \ |
| assert(mp_init(&b) == MP_OKAY); \ |
| assert(mp_init(&c) == MP_OKAY); \ |
| assert(mp_init(&r) == MP_OKAY); \ |
| size_t max_size = 2 * size + 1; \ |
| parse_input(data, size, A, B, &a, &b); \ |
| do { \ |
| (void)(R); \ |
| } while (0); |
| |
| // Initialise MPI and BN variables |
| // XXX: Also silence unused variable warnings for B. |
| #define INIT_THREE_NUMBERS \ |
| mp_int a, b, c; \ |
| BN_CTX *ctx = BN_CTX_new(); \ |
| BN_CTX_start(ctx); \ |
| BIGNUM *A = BN_CTX_get(ctx); \ |
| BIGNUM *B = BN_CTX_get(ctx); \ |
| BIGNUM *C = BN_CTX_get(ctx); \ |
| assert(mp_init(&a) == MP_OKAY); \ |
| assert(mp_init(&b) == MP_OKAY); \ |
| assert(mp_init(&c) == MP_OKAY); \ |
| size_t max_size = 4 * size + 1; \ |
| parse_input(data, size, A, &a); \ |
| do { \ |
| (void)(B); \ |
| } while (0); |
| |
| #define CLEANUP_AND_RETURN \ |
| mp_clear(&a); \ |
| mp_clear(&b); \ |
| mp_clear(&c); \ |
| mp_clear(&r); \ |
| if (m1) { \ |
| mp_clear(m1); \ |
| } \ |
| BN_CTX_end(ctx); \ |
| BN_CTX_free(ctx); \ |
| return 0; |
| |
| #define CLEANUP_AND_RETURN_THREE \ |
| mp_clear(&a); \ |
| mp_clear(&b); \ |
| mp_clear(&c); \ |
| BN_CTX_end(ctx); \ |
| BN_CTX_free(ctx); \ |
| return 0; |
| |
| #endif // mpi_helper_h__ |