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 #include "internal/cryptlib.h"
12 #include <openssl/bn.h>
14 #include <openssl/objects.h>
15 #include <openssl/asn1t.h>
17 /* Override the default free and new methods */
18 static int dh_cb(int operation
, ASN1_VALUE
**pval
, const ASN1_ITEM
*it
,
21 if (operation
== ASN1_OP_NEW_PRE
) {
22 *pval
= (ASN1_VALUE
*)DH_new();
26 } else if (operation
== ASN1_OP_FREE_PRE
) {
30 } else if (operation
== ASN1_OP_D2I_POST
) {
31 ((DH
*)*pval
)->dirty_cnt
++;
36 ASN1_SEQUENCE_cb(DHparams
, dh_cb
) = {
37 ASN1_SIMPLE(DH
, params
.p
, BIGNUM
),
38 ASN1_SIMPLE(DH
, params
.g
, BIGNUM
),
39 ASN1_OPT_EMBED(DH
, length
, ZINT32
),
40 } ASN1_SEQUENCE_END_cb(DH
, DHparams
)
42 IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(DH
, DHparams
, DHparams
)
45 * Internal only structures for handling X9.42 DH: this gets translated to or
46 * from a DH structure straight away.
50 ASN1_BIT_STRING
*seed
;
59 int_dhvparams
*vparams
;
62 ASN1_SEQUENCE(DHvparams
) = {
63 ASN1_SIMPLE(int_dhvparams
, seed
, ASN1_BIT_STRING
),
64 ASN1_SIMPLE(int_dhvparams
, counter
, BIGNUM
)
65 } static_ASN1_SEQUENCE_END_name(int_dhvparams
, DHvparams
)
67 ASN1_SEQUENCE(DHxparams
) = {
68 ASN1_SIMPLE(int_dhx942_dh
, p
, BIGNUM
),
69 ASN1_SIMPLE(int_dhx942_dh
, g
, BIGNUM
),
70 ASN1_SIMPLE(int_dhx942_dh
, q
, BIGNUM
),
71 ASN1_OPT(int_dhx942_dh
, j
, BIGNUM
),
72 ASN1_OPT(int_dhx942_dh
, vparams
, DHvparams
),
73 } static_ASN1_SEQUENCE_END_name(int_dhx942_dh
, DHxparams
)
75 int_dhx942_dh
*d2i_int_dhx(int_dhx942_dh
**a
,
76 const unsigned char **pp
, long length
);
77 int i2d_int_dhx(const int_dhx942_dh
*a
, unsigned char **pp
);
79 IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(int_dhx942_dh
, DHxparams
, int_dhx
)
81 /* Application public function: read in X9.42 DH parameters into DH structure */
83 DH
*d2i_DHxparams(DH
**a
, const unsigned char **pp
, long length
)
86 int_dhx942_dh
*dhx
= NULL
;
92 dhx
= d2i_int_dhx(NULL
, pp
, length
);
103 params
= &dh
->params
;
104 DH_set0_pqg(dh
, dhx
->p
, dhx
->q
, dhx
->g
);
105 ffc_params_set0_j(params
, dhx
->j
);
107 if (dhx
->vparams
!= NULL
) {
108 /* The counter has a maximum value of 4 * numbits(p) - 1 */
109 size_t counter
= (size_t)BN_get_word(dhx
->vparams
->counter
);
110 ffc_params_set_validate_params(params
, dhx
->vparams
->seed
->data
,
111 dhx
->vparams
->seed
->length
, counter
);
112 ASN1_BIT_STRING_free(dhx
->vparams
->seed
);
113 BN_free(dhx
->vparams
->counter
);
114 OPENSSL_free(dhx
->vparams
);
122 int i2d_DHxparams(const DH
*dh
, unsigned char **pp
)
126 int_dhvparams dhv
= { NULL
, NULL
};
127 ASN1_BIT_STRING seed
;
129 const FFC_PARAMS
*params
= &dh
->params
;
132 ffc_params_get0_pqg(params
, (const BIGNUM
**)&dhx
.p
,
133 (const BIGNUM
**)&dhx
.q
, (const BIGNUM
**)&dhx
.g
);
135 ffc_params_get_validate_params(params
, &seed
.data
, &seedlen
, &counter
);
136 seed
.length
= (int)seedlen
;
138 if (counter
!= -1 && seed
.data
!= NULL
&& seed
.length
> 0) {
139 seed
.flags
= ASN1_STRING_FLAG_BITS_LEFT
;
141 dhv
.counter
= BN_new();
142 if (dhv
.counter
== NULL
)
144 if (!BN_set_word(dhv
.counter
, (BN_ULONG
)counter
))
150 ret
= i2d_int_dhx(&dhx
, pp
);
152 BN_free(dhv
.counter
);