2 * Copyright 2000-2020 The OpenSSL Project Authors. All Rights Reserved.
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
11 * DH low level APIs are deprecated for public use, but still ok for
14 #include "internal/deprecated.h"
17 #include "internal/cryptlib.h"
18 #include <openssl/bn.h>
20 #include <openssl/objects.h>
21 #include <openssl/asn1t.h>
22 #include "crypto/dh.h"
24 /* Override the default free and new methods */
25 static int dh_cb(int operation
, ASN1_VALUE
**pval
, const ASN1_ITEM
*it
,
28 if (operation
== ASN1_OP_NEW_PRE
) {
29 *pval
= (ASN1_VALUE
*)DH_new();
33 } else if (operation
== ASN1_OP_FREE_PRE
) {
37 } else if (operation
== ASN1_OP_D2I_POST
) {
40 DH_clear_flags(dh
, DH_FLAG_TYPE_MASK
);
41 DH_set_flags(dh
, DH_FLAG_TYPE_DH
);
42 ossl_dh_cache_named_group(dh
);
48 ASN1_SEQUENCE_cb(DHparams
, dh_cb
) = {
49 ASN1_SIMPLE(DH
, params
.p
, BIGNUM
),
50 ASN1_SIMPLE(DH
, params
.g
, BIGNUM
),
51 ASN1_OPT_EMBED(DH
, length
, ZINT32
),
52 } ASN1_SEQUENCE_END_cb(DH
, DHparams
)
54 IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(DH
, DHparams
, DHparams
)
57 * Internal only structures for handling X9.42 DH: this gets translated to or
58 * from a DH structure straight away.
62 ASN1_BIT_STRING
*seed
;
71 int_dhvparams
*vparams
;
74 ASN1_SEQUENCE(DHvparams
) = {
75 ASN1_SIMPLE(int_dhvparams
, seed
, ASN1_BIT_STRING
),
76 ASN1_SIMPLE(int_dhvparams
, counter
, BIGNUM
)
77 } static_ASN1_SEQUENCE_END_name(int_dhvparams
, DHvparams
)
79 ASN1_SEQUENCE(DHxparams
) = {
80 ASN1_SIMPLE(int_dhx942_dh
, p
, BIGNUM
),
81 ASN1_SIMPLE(int_dhx942_dh
, g
, BIGNUM
),
82 ASN1_SIMPLE(int_dhx942_dh
, q
, BIGNUM
),
83 ASN1_OPT(int_dhx942_dh
, j
, BIGNUM
),
84 ASN1_OPT(int_dhx942_dh
, vparams
, DHvparams
),
85 } static_ASN1_SEQUENCE_END_name(int_dhx942_dh
, DHxparams
)
87 int_dhx942_dh
*d2i_int_dhx(int_dhx942_dh
**a
,
88 const unsigned char **pp
, long length
);
89 int i2d_int_dhx(const int_dhx942_dh
*a
, unsigned char **pp
);
91 IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(int_dhx942_dh
, DHxparams
, int_dhx
)
93 DH
*d2i_DHxparams(DH
**a
, const unsigned char **pp
, long length
)
96 int_dhx942_dh
*dhx
= NULL
;
102 dhx
= d2i_int_dhx(NULL
, pp
, length
);
113 params
= &dh
->params
;
114 DH_set0_pqg(dh
, dhx
->p
, dhx
->q
, dhx
->g
);
115 ossl_ffc_params_set0_j(params
, dhx
->j
);
117 if (dhx
->vparams
!= NULL
) {
118 /* The counter has a maximum value of 4 * numbits(p) - 1 */
119 size_t counter
= (size_t)BN_get_word(dhx
->vparams
->counter
);
120 ossl_ffc_params_set_validate_params(params
, dhx
->vparams
->seed
->data
,
121 dhx
->vparams
->seed
->length
,
123 ASN1_BIT_STRING_free(dhx
->vparams
->seed
);
124 BN_free(dhx
->vparams
->counter
);
125 OPENSSL_free(dhx
->vparams
);
130 DH_clear_flags(dh
, DH_FLAG_TYPE_MASK
);
131 DH_set_flags(dh
, DH_FLAG_TYPE_DHX
);
135 int i2d_DHxparams(const DH
*dh
, unsigned char **pp
)
139 int_dhvparams dhv
= { NULL
, NULL
};
140 ASN1_BIT_STRING seed
;
142 const FFC_PARAMS
*params
= &dh
->params
;
145 ossl_ffc_params_get0_pqg(params
, (const BIGNUM
**)&dhx
.p
,
146 (const BIGNUM
**)&dhx
.q
, (const BIGNUM
**)&dhx
.g
);
148 ossl_ffc_params_get_validate_params(params
, &seed
.data
, &seedlen
, &counter
);
149 seed
.length
= (int)seedlen
;
151 if (counter
!= -1 && seed
.data
!= NULL
&& seed
.length
> 0) {
152 seed
.flags
= ASN1_STRING_FLAG_BITS_LEFT
;
154 dhv
.counter
= BN_new();
155 if (dhv
.counter
== NULL
)
157 if (!BN_set_word(dhv
.counter
, (BN_ULONG
)counter
))
163 ret
= i2d_int_dhx(&dhx
, pp
);
165 BN_free(dhv
.counter
);