Coverage Report

Created: 2024-06-28 06:19

/src/libecc/src/curves/ec_montgomery.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 *  Copyright (C) 2021 - This file is part of libecc project
3
 *
4
 *  Authors:
5
 *      Ryad BENADJILA <ryadbenadjila@gmail.com>
6
 *      Arnaud EBALARD <arnaud.ebalard@ssi.gouv.fr>
7
 *
8
 *  This software is licensed under a dual BSD and GPL v2 license.
9
 *  See LICENSE file at the root folder of the project.
10
 */
11
#include <libecc/curves/ec_montgomery.h>
12
13
0
#define EC_MONTGOMERY_CRV_MAGIC ((word_t)(0x83734673a0443720ULL))
14
15
/* Check if a Montgomery curve is initialized.
16
 * Returns 0 on success, -1 on error.
17
 */
18
int ec_montgomery_crv_check_initialized(ec_montgomery_crv_src_t crv)
19
0
{
20
0
  int ret;
21
22
0
  MUST_HAVE((crv != NULL) && (crv->magic == EC_MONTGOMERY_CRV_MAGIC), ret, err);
23
0
  ret = 0;
24
25
0
err:
26
0
  return ret;
27
0
}
28
29
/*
30
 * Initialize pointed Montgomery curve structure using given A and B
31
 * Fp elements representing curve equation (B v^2 = u^3 + A u^2 + u) parameters.
32
 *
33
 * The function returns 0 on success, -1 on error.
34
 */
35
int ec_montgomery_crv_init(ec_montgomery_crv_t crv, fp_src_t A, fp_src_t B, nn_src_t order)
36
0
{
37
0
  int ret, iszero;
38
0
  fp tmp;
39
0
  tmp.magic = WORD(0);
40
41
0
  MUST_HAVE((crv != NULL), ret, err);
42
43
0
  ret = nn_check_initialized(order); EG(ret, err);
44
0
  ret = fp_check_initialized(A); EG(ret, err);
45
0
  ret = fp_check_initialized(B); EG(ret, err);
46
0
  MUST_HAVE(A->ctx == B->ctx, ret, err);
47
48
0
  ret = fp_init(&tmp, A->ctx); EG(ret, err);
49
50
  /* A and B elements of Fp, A unequal to (+/-)2 and B non zero */
51
0
  ret = fp_set_word_value(&tmp, 2); EG(ret, err);
52
0
  ret = fp_add(&tmp, A, &tmp); EG(ret, err);
53
0
  MUST_HAVE((!fp_iszero(&tmp, &iszero)) && (!iszero), ret, err);
54
55
0
  ret = fp_set_word_value(&tmp, 2); EG(ret, err);
56
0
  ret = fp_sub(&tmp, A, &tmp); EG(ret, err);
57
0
  MUST_HAVE((!fp_iszero(&tmp, &iszero)) && (!iszero), ret, err);
58
0
  MUST_HAVE((!fp_iszero(B, &iszero)) && (!iszero), ret, err);
59
60
0
  ret = fp_init(&(crv->A), A->ctx); EG(ret, err);
61
0
  ret = fp_init(&(crv->B), B->ctx); EG(ret, err);
62
63
0
  ret = fp_copy(&(crv->A), A); EG(ret, err);
64
0
  ret = fp_copy(&(crv->B), B); EG(ret, err);
65
66
0
  ret = nn_copy(&(crv->order), order); EG(ret, err);
67
68
0
  crv->magic = EC_MONTGOMERY_CRV_MAGIC;
69
70
0
err:
71
0
  fp_uninit(&tmp);
72
73
0
  return ret;
74
0
}
75
76
/* Uninitialize curve
77
 */
78
void ec_montgomery_crv_uninit(ec_montgomery_crv_t crv)
79
0
{
80
0
  if ((crv != NULL) && (crv->magic == EC_MONTGOMERY_CRV_MAGIC)) {
81
0
    crv->magic = WORD(0);
82
0
  }
83
84
0
  return;
85
0
}