2 * Copyright 2000-2016 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>
23 /* Override the default free and new methods */
24 static int dh_cb(int operation
, ASN1_VALUE
**pval
, const ASN1_ITEM
*it
,
27 if (operation
== ASN1_OP_NEW_PRE
) {
28 *pval
= (ASN1_VALUE
*)DH_new();
32 } else if (operation
== ASN1_OP_FREE_PRE
) {
36 } else if (operation
== ASN1_OP_D2I_POST
) {
37 ((DH
*)*pval
)->dirty_cnt
++;
42 ASN1_SEQUENCE_cb(DHparams
, dh_cb
) = {
43 ASN1_SIMPLE(DH
, params
.p
, BIGNUM
),
44 ASN1_SIMPLE(DH
, params
.g
, BIGNUM
),
45 ASN1_OPT_EMBED(DH
, length
, ZINT32
),
46 } ASN1_SEQUENCE_END_cb(DH
, DHparams
)
48 IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(DH
, DHparams
, DHparams
)
51 * Internal only structures for handling X9.42 DH: this gets translated to or
52 * from a DH structure straight away.
56 ASN1_BIT_STRING
*seed
;
65 int_dhvparams
*vparams
;
68 ASN1_SEQUENCE(DHvparams
) = {
69 ASN1_SIMPLE(int_dhvparams
, seed
, ASN1_BIT_STRING
),
70 ASN1_SIMPLE(int_dhvparams
, counter
, BIGNUM
)
71 } static_ASN1_SEQUENCE_END_name(int_dhvparams
, DHvparams
)
73 ASN1_SEQUENCE(DHxparams
) = {
74 ASN1_SIMPLE(int_dhx942_dh
, p
, BIGNUM
),
75 ASN1_SIMPLE(int_dhx942_dh
, g
, BIGNUM
),
76 ASN1_SIMPLE(int_dhx942_dh
, q
, BIGNUM
),
77 ASN1_OPT(int_dhx942_dh
, j
, BIGNUM
),
78 ASN1_OPT(int_dhx942_dh
, vparams
, DHvparams
),
79 } static_ASN1_SEQUENCE_END_name(int_dhx942_dh
, DHxparams
)
81 int_dhx942_dh
*d2i_int_dhx(int_dhx942_dh
**a
,
82 const unsigned char **pp
, long length
);
83 int i2d_int_dhx(const int_dhx942_dh
*a
, unsigned char **pp
);
85 IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(int_dhx942_dh
, DHxparams
, int_dhx
)
87 /* Application public function: read in X9.42 DH parameters into DH structure */
89 DH
*d2i_DHxparams(DH
**a
, const unsigned char **pp
, long length
)
92 int_dhx942_dh
*dhx
= NULL
;
98 dhx
= d2i_int_dhx(NULL
, pp
, length
);
109 params
= &dh
->params
;
110 DH_set0_pqg(dh
, dhx
->p
, dhx
->q
, dhx
->g
);
111 ffc_params_set0_j(params
, dhx
->j
);
113 if (dhx
->vparams
!= NULL
) {
114 /* The counter has a maximum value of 4 * numbits(p) - 1 */
115 size_t counter
= (size_t)BN_get_word(dhx
->vparams
->counter
);
116 ffc_params_set_validate_params(params
, dhx
->vparams
->seed
->data
,
117 dhx
->vparams
->seed
->length
, counter
);
118 ASN1_BIT_STRING_free(dhx
->vparams
->seed
);
119 BN_free(dhx
->vparams
->counter
);
120 OPENSSL_free(dhx
->vparams
);
128 int i2d_DHxparams(const DH
*dh
, unsigned char **pp
)
132 int_dhvparams dhv
= { NULL
, NULL
};
133 ASN1_BIT_STRING seed
;
135 const FFC_PARAMS
*params
= &dh
->params
;
138 ffc_params_get0_pqg(params
, (const BIGNUM
**)&dhx
.p
,
139 (const BIGNUM
**)&dhx
.q
, (const BIGNUM
**)&dhx
.g
);
141 ffc_params_get_validate_params(params
, &seed
.data
, &seedlen
, &counter
);
142 seed
.length
= (int)seedlen
;
144 if (counter
!= -1 && seed
.data
!= NULL
&& seed
.length
> 0) {
145 seed
.flags
= ASN1_STRING_FLAG_BITS_LEFT
;
147 dhv
.counter
= BN_new();
148 if (dhv
.counter
== NULL
)
150 if (!BN_set_word(dhv
.counter
, (BN_ULONG
)counter
))
156 ret
= i2d_int_dhx(&dhx
, pp
);
158 BN_free(dhv
.counter
);