Modify DSA and DH keys to use a shared FFC_PARAMS struct
[openssl.git] / include / internal / ffc.h
1 /*
2  * Copyright 2019-2020 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9
10 #ifndef OSSL_INTERNAL_FFC_H
11 # define OSSL_INTERNAL_FFC_H
12
13 # include <openssl/bn.h>
14
15 /*
16  * Finite field cryptography (FFC) domain parameters are used by DH and DSA.
17  * Refer to FIPS186_4 Appendix A & B.
18  */
19 typedef struct ffc_params_st {
20     /* Primes */
21     BIGNUM *p;
22     BIGNUM *q;
23     /* Generator */
24     BIGNUM *g;
25     /* DH X9.42 Optional Subgroup factor j >= 2 where p = j * q + 1 */
26     BIGNUM *j;
27
28     /* Required for FIPS186_4 validation of p, q and optionally canonical g */
29     unsigned char *seed;
30     /* If this value is zero the hash size is used as the seed length */
31     size_t seedlen;
32     /* Required for FIPS186_4 validation of p and q */
33     int pcounter;
34
35 } FFC_PARAMS;
36
37 void ffc_params_init(FFC_PARAMS *params);
38 void ffc_params_cleanup(FFC_PARAMS *params);
39 void ffc_params_set0_pqg(FFC_PARAMS *params, BIGNUM *p, BIGNUM *q, BIGNUM *g);
40 void ffc_params_get0_pqg(const FFC_PARAMS *params, const BIGNUM **p,
41                          const BIGNUM **q, const BIGNUM **g);
42 void ffc_params_set0_j(FFC_PARAMS *d, BIGNUM *j);
43 int ffc_params_set_validate_params(FFC_PARAMS *params,
44                                    const unsigned char *seed, size_t seedlen,
45                                    int counter);
46 void ffc_params_get_validate_params(const FFC_PARAMS *params,
47                                     unsigned char **seed, size_t *seedlen,
48                                     int *pcounter);
49
50 int ffc_params_copy(FFC_PARAMS *dst, const FFC_PARAMS *src);
51 int ffc_params_cmp(const FFC_PARAMS *a, const FFC_PARAMS *b, int ignore_q);
52
53 #ifndef FIPS_MODE
54 int ffc_params_print(BIO *bp, const FFC_PARAMS *ffc, int indent);
55 #endif /* FIPS_MODE */
56
57 #endif /* OSSL_INTERNAL_FFC_H */