Make the naming scheme for dispatched functions more consistent
[oweals/openssl.git] / providers / implementations / serializers / serializer_dsa_pub.c
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 /*
11  * DSA low level APIs are deprecated for public use, but still ok for
12  * internal use.
13  */
14 #include "internal/deprecated.h"
15
16 #include <openssl/core_dispatch.h>
17 #include <openssl/err.h>
18 #include <openssl/pem.h>
19 #include <openssl/dsa.h>
20 #include <openssl/types.h>
21 #include <openssl/params.h>
22 #include "prov/bio.h"
23 #include "prov/implementations.h"
24 #include "prov/provider_ctx.h"
25 #include "serializer_local.h"
26
27 static OSSL_FUNC_serializer_newctx_fn dsa_pub_newctx;
28 static OSSL_FUNC_serializer_freectx_fn dsa_pub_freectx;
29 static OSSL_FUNC_serializer_serialize_data_fn dsa_pub_der_data;
30 static OSSL_FUNC_serializer_serialize_object_fn dsa_pub_der;
31 static OSSL_FUNC_serializer_serialize_data_fn dsa_pub_pem_data;
32 static OSSL_FUNC_serializer_serialize_object_fn dsa_pub_pem;
33
34 static OSSL_FUNC_serializer_serialize_data_fn dsa_pub_print_data;
35 static OSSL_FUNC_serializer_serialize_object_fn dsa_pub_print;
36
37 /* Public key : context */
38
39 /*
40  * There's no specific implementation context, so we use the provider context
41  */
42 static void *dsa_pub_newctx(void *provctx)
43 {
44     return provctx;
45 }
46
47 static void dsa_pub_freectx(void *ctx)
48 {
49 }
50
51 /* Public key : DER */
52 static int dsa_pub_der_data(void *ctx, const OSSL_PARAM params[],
53                             OSSL_CORE_BIO *out,
54                             OSSL_PASSPHRASE_CALLBACK *cb, void *cbarg)
55 {
56     OSSL_FUNC_keymgmt_new_fn *dsa_new = ossl_prov_get_keymgmt_dsa_new();
57     OSSL_FUNC_keymgmt_free_fn *dsa_free = ossl_prov_get_keymgmt_dsa_free();
58     OSSL_FUNC_keymgmt_import_fn *dsa_import = ossl_prov_get_keymgmt_dsa_import();
59     int ok = 0;
60
61     if (dsa_import != NULL) {
62         DSA *dsa;
63
64         /* ctx == provctx */
65         if ((dsa = dsa_new(ctx)) != NULL
66             && dsa_import(dsa, OSSL_KEYMGMT_SELECT_KEYPAIR, params)
67             && dsa_pub_der(ctx, dsa, out, cb, cbarg))
68             ok = 1;
69         dsa_free(dsa);
70     }
71     return ok;
72 }
73
74 static int dsa_pub_der(void *ctx, void *dsa, OSSL_CORE_BIO *cout,
75                        OSSL_PASSPHRASE_CALLBACK *cb, void *cbarg)
76 {
77     /*
78      * TODO(v3.0) implement setting save_parameters, see dsa_pub_encode()
79      * in crypto/dsa/dsa_ameth.c
80      */
81     int save_parameters = 1;
82     BIO *out = bio_new_from_core_bio(ctx, cout);
83     int ret;
84
85     if (out == NULL)
86         return 0;
87
88     ret =
89         save_parameters
90         ? ossl_prov_write_pub_der_from_obj(out, dsa, EVP_PKEY_DSA,
91                                            ossl_prov_prepare_all_dsa_params,
92                                            ossl_prov_dsa_pub_to_der)
93         : ossl_prov_write_pub_der_from_obj(out, dsa, EVP_PKEY_DSA,
94                                            ossl_prov_prepare_dsa_params,
95                                            ossl_prov_dsa_pub_to_der);
96
97     BIO_free(out);
98
99     return ret;
100 }
101
102 /* Public key : PEM */
103 static int dsa_pub_pem_data(void *ctx, const OSSL_PARAM params[],
104                             OSSL_CORE_BIO *out,
105                             OSSL_PASSPHRASE_CALLBACK *cb, void *cbarg)
106 {
107     OSSL_FUNC_keymgmt_new_fn *dsa_new = ossl_prov_get_keymgmt_dsa_new();
108     OSSL_FUNC_keymgmt_free_fn *dsa_free = ossl_prov_get_keymgmt_dsa_free();
109     OSSL_FUNC_keymgmt_import_fn *dsa_import = ossl_prov_get_keymgmt_dsa_import();
110     int ok = 0;
111
112     if (dsa_import != NULL) {
113         DSA *dsa;
114
115         /* ctx == provctx */
116         if ((dsa = dsa_new(ctx)) != NULL
117             && dsa_import(dsa, OSSL_KEYMGMT_SELECT_KEYPAIR, params)
118             && dsa_pub_pem(ctx, dsa, out, cb, cbarg))
119             ok = 1;
120         dsa_free(dsa);
121     }
122     return ok;
123 }
124
125 static int dsa_pub_pem(void *ctx, void *dsa, OSSL_CORE_BIO *cout,
126                        OSSL_PASSPHRASE_CALLBACK *cb, void *cbarg)
127 {
128     BIO *out = bio_new_from_core_bio(ctx, cout);
129     int ret;
130
131     if (out == NULL)
132         return 0;
133
134     ret = ossl_prov_write_pub_pem_from_obj(out, dsa, EVP_PKEY_DSA,
135                                            ossl_prov_prepare_dsa_params,
136                                            ossl_prov_dsa_pub_to_der);
137
138     BIO_free(out);
139
140     return ret;
141 }
142
143 static int dsa_pub_print_data(void *ctx, const OSSL_PARAM params[],
144                               OSSL_CORE_BIO *out,
145                               OSSL_PASSPHRASE_CALLBACK *cb, void *cbarg)
146 {
147     OSSL_FUNC_keymgmt_new_fn *dsa_new = ossl_prov_get_keymgmt_dsa_new();
148     OSSL_FUNC_keymgmt_free_fn *dsa_free = ossl_prov_get_keymgmt_dsa_free();
149     OSSL_FUNC_keymgmt_import_fn *dsa_import = ossl_prov_get_keymgmt_dsa_import();
150     int ok = 0;
151
152     if (dsa_import != NULL) {
153         DSA *dsa;
154
155         /* ctx == provctx */
156         if ((dsa = dsa_new(ctx)) != NULL
157             && dsa_import(dsa, OSSL_KEYMGMT_SELECT_KEYPAIR, params)
158             && dsa_pub_print(ctx, dsa, out, cb, cbarg))
159             ok = 1;
160         dsa_free(dsa);
161     }
162     return ok;
163 }
164
165 static int dsa_pub_print(void *ctx, void *dsa, OSSL_CORE_BIO *cout,
166                          OSSL_PASSPHRASE_CALLBACK *cb, void *cbarg)
167 {
168     BIO *out = bio_new_from_core_bio(ctx, cout);
169     int ret;
170
171     if (out == NULL)
172         return 0;
173
174     ret = ossl_prov_print_dsa(out, dsa, 0);
175     BIO_free(out);
176
177     return ret;
178 }
179
180 const OSSL_DISPATCH dsa_pub_der_serializer_functions[] = {
181     { OSSL_FUNC_SERIALIZER_NEWCTX, (void (*)(void))dsa_pub_newctx },
182     { OSSL_FUNC_SERIALIZER_FREECTX, (void (*)(void))dsa_pub_freectx },
183     { OSSL_FUNC_SERIALIZER_SERIALIZE_DATA, (void (*)(void))dsa_pub_der_data },
184     { OSSL_FUNC_SERIALIZER_SERIALIZE_OBJECT, (void (*)(void))dsa_pub_der },
185     { 0, NULL }
186 };
187
188 const OSSL_DISPATCH dsa_pub_pem_serializer_functions[] = {
189     { OSSL_FUNC_SERIALIZER_NEWCTX, (void (*)(void))dsa_pub_newctx },
190     { OSSL_FUNC_SERIALIZER_FREECTX, (void (*)(void))dsa_pub_freectx },
191     { OSSL_FUNC_SERIALIZER_SERIALIZE_DATA, (void (*)(void))dsa_pub_pem_data },
192     { OSSL_FUNC_SERIALIZER_SERIALIZE_OBJECT, (void (*)(void))dsa_pub_pem },
193     { 0, NULL }
194 };
195
196 const OSSL_DISPATCH dsa_pub_text_serializer_functions[] = {
197     { OSSL_FUNC_SERIALIZER_NEWCTX, (void (*)(void))dsa_pub_newctx },
198     { OSSL_FUNC_SERIALIZER_FREECTX, (void (*)(void))dsa_pub_freectx },
199     { OSSL_FUNC_SERIALIZER_SERIALIZE_OBJECT, (void (*)(void))dsa_pub_print },
200     { OSSL_FUNC_SERIALIZER_SERIALIZE_DATA,
201       (void (*)(void))dsa_pub_print_data },
202     { 0, NULL }
203 };