encoder_dsa_priv.c 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  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. * DSA low level APIs are deprecated for public use, but still ok for
  11. * internal use.
  12. */
  13. #include "internal/deprecated.h"
  14. #include <openssl/core_dispatch.h>
  15. #include <openssl/core_names.h>
  16. #include <openssl/err.h>
  17. #include <openssl/pem.h>
  18. #include <openssl/dsa.h>
  19. #include <openssl/types.h>
  20. #include <openssl/params.h>
  21. #include "prov/bio.h"
  22. #include "prov/implementations.h"
  23. #include "prov/provider_ctx.h"
  24. #include "encoder_local.h"
  25. static OSSL_FUNC_encoder_newctx_fn dsa_priv_newctx;
  26. static OSSL_FUNC_encoder_freectx_fn dsa_priv_freectx;
  27. static OSSL_FUNC_encoder_set_ctx_params_fn dsa_priv_set_ctx_params;
  28. static OSSL_FUNC_encoder_settable_ctx_params_fn dsa_priv_settable_ctx_params;
  29. static OSSL_FUNC_encoder_encode_data_fn dsa_priv_der_data;
  30. static OSSL_FUNC_encoder_encode_object_fn dsa_priv_der;
  31. static OSSL_FUNC_encoder_encode_data_fn dsa_pem_priv_data;
  32. static OSSL_FUNC_encoder_encode_object_fn dsa_pem_priv;
  33. static OSSL_FUNC_encoder_newctx_fn dsa_print_newctx;
  34. static OSSL_FUNC_encoder_freectx_fn dsa_print_freectx;
  35. static OSSL_FUNC_encoder_encode_data_fn dsa_priv_print_data;
  36. static OSSL_FUNC_encoder_encode_object_fn dsa_priv_print;
  37. /*
  38. * Context used for private key encoding.
  39. */
  40. struct dsa_priv_ctx_st {
  41. void *provctx;
  42. struct pkcs8_encrypt_ctx_st sc;
  43. };
  44. /* Private key : context */
  45. static void *dsa_priv_newctx(void *provctx)
  46. {
  47. struct dsa_priv_ctx_st *ctx = OPENSSL_zalloc(sizeof(*ctx));
  48. if (ctx != NULL) {
  49. ctx->provctx = provctx;
  50. /* -1 is the "whatever" indicator, i.e. the PKCS8 library default PBE */
  51. ctx->sc.pbe_nid = -1;
  52. }
  53. return ctx;
  54. }
  55. static void dsa_priv_freectx(void *vctx)
  56. {
  57. struct dsa_priv_ctx_st *ctx = vctx;
  58. EVP_CIPHER_free(ctx->sc.cipher);
  59. OPENSSL_free(ctx->sc.cipher_pass);
  60. OPENSSL_free(ctx);
  61. }
  62. static const OSSL_PARAM *dsa_priv_settable_ctx_params(ossl_unused void *provctx)
  63. {
  64. static const OSSL_PARAM settables[] = {
  65. OSSL_PARAM_utf8_string(OSSL_ENCODER_PARAM_CIPHER, NULL, 0),
  66. OSSL_PARAM_octet_string(OSSL_ENCODER_PARAM_PASS, NULL, 0),
  67. OSSL_PARAM_END,
  68. };
  69. return settables;
  70. }
  71. static int dsa_priv_set_ctx_params(void *vctx, const OSSL_PARAM params[])
  72. {
  73. struct dsa_priv_ctx_st *ctx = vctx;
  74. const OSSL_PARAM *p;
  75. if ((p = OSSL_PARAM_locate_const(params, OSSL_ENCODER_PARAM_CIPHER))
  76. != NULL) {
  77. const OSSL_PARAM *propsp =
  78. OSSL_PARAM_locate_const(params, OSSL_ENCODER_PARAM_PROPERTIES);
  79. const char *props = NULL;
  80. if (p->data_type != OSSL_PARAM_UTF8_STRING)
  81. return 0;
  82. if (propsp != NULL && propsp->data_type != OSSL_PARAM_UTF8_STRING)
  83. return 0;
  84. props = (propsp != NULL ? propsp->data : NULL);
  85. EVP_CIPHER_free(ctx->sc.cipher);
  86. ctx->sc.cipher_intent = p->data != NULL;
  87. if (p->data != NULL
  88. && ((ctx->sc.cipher = EVP_CIPHER_fetch(NULL, p->data, props))
  89. == NULL))
  90. return 0;
  91. }
  92. if ((p = OSSL_PARAM_locate_const(params, OSSL_ENCODER_PARAM_PASS))
  93. != NULL) {
  94. OPENSSL_free(ctx->sc.cipher_pass);
  95. ctx->sc.cipher_pass = NULL;
  96. if (!OSSL_PARAM_get_octet_string(p, &ctx->sc.cipher_pass, 0,
  97. &ctx->sc.cipher_pass_length))
  98. return 0;
  99. }
  100. return 1;
  101. }
  102. /* Private key : DER */
  103. static int dsa_priv_der_data(void *vctx, const OSSL_PARAM params[],
  104. OSSL_CORE_BIO *out,
  105. OSSL_PASSPHRASE_CALLBACK *cb, void *cbarg)
  106. {
  107. struct dsa_priv_ctx_st *ctx = vctx;
  108. OSSL_FUNC_keymgmt_new_fn *dsa_new = ossl_prov_get_keymgmt_dsa_new();
  109. OSSL_FUNC_keymgmt_free_fn *dsa_free = ossl_prov_get_keymgmt_dsa_free();
  110. OSSL_FUNC_keymgmt_import_fn *dsa_import = ossl_prov_get_keymgmt_dsa_import();
  111. int ok = 0;
  112. if (dsa_import != NULL) {
  113. DSA *dsa;
  114. if ((dsa = dsa_new(ctx->provctx)) != NULL
  115. && dsa_import(dsa, OSSL_KEYMGMT_SELECT_KEYPAIR, params)
  116. && dsa_priv_der(ctx, dsa, out, cb, cbarg))
  117. ok = 1;
  118. dsa_free(dsa);
  119. }
  120. return ok;
  121. }
  122. static int dsa_priv_der(void *vctx, void *dsa, OSSL_CORE_BIO *cout,
  123. OSSL_PASSPHRASE_CALLBACK *cb, void *cbarg)
  124. {
  125. struct dsa_priv_ctx_st *ctx = vctx;
  126. BIO *out = bio_new_from_core_bio(ctx->provctx, cout);
  127. int ret;
  128. if (out == NULL)
  129. return 0;
  130. ctx->sc.cb = cb;
  131. ctx->sc.cbarg = cbarg;
  132. ret = ossl_prov_write_priv_der_from_obj(out, dsa, EVP_PKEY_DSA,
  133. ossl_prov_prepare_dsa_params,
  134. ossl_prov_dsa_priv_to_der,
  135. &ctx->sc);
  136. BIO_free(out);
  137. return ret;
  138. }
  139. /* Private key : PEM */
  140. static int dsa_pem_priv_data(void *vctx, const OSSL_PARAM params[],
  141. OSSL_CORE_BIO *out,
  142. OSSL_PASSPHRASE_CALLBACK *cb, void *cbarg)
  143. {
  144. struct dsa_priv_ctx_st *ctx = vctx;
  145. OSSL_FUNC_keymgmt_new_fn *dsa_new = ossl_prov_get_keymgmt_dsa_new();
  146. OSSL_FUNC_keymgmt_free_fn *dsa_free = ossl_prov_get_keymgmt_dsa_free();
  147. OSSL_FUNC_keymgmt_import_fn *dsa_import = ossl_prov_get_keymgmt_dsa_import();
  148. int ok = 0;
  149. if (dsa_import != NULL) {
  150. DSA *dsa;
  151. if ((dsa = dsa_new(ctx->provctx)) != NULL
  152. && dsa_import(dsa, OSSL_KEYMGMT_SELECT_KEYPAIR, params)
  153. && dsa_pem_priv(ctx, dsa, out, cb, cbarg))
  154. ok = 1;
  155. dsa_free(dsa);
  156. }
  157. return ok;
  158. }
  159. static int dsa_pem_priv(void *vctx, void *dsa, OSSL_CORE_BIO *cout,
  160. OSSL_PASSPHRASE_CALLBACK *cb, void *cbarg)
  161. {
  162. struct dsa_priv_ctx_st *ctx = vctx;
  163. BIO *out = bio_new_from_core_bio(ctx->provctx, cout);
  164. int ret;
  165. if (out == NULL)
  166. return 0;
  167. ctx->sc.cb = cb;
  168. ctx->sc.cbarg = cbarg;
  169. ret = ossl_prov_write_priv_pem_from_obj(out, dsa, EVP_PKEY_DSA,
  170. ossl_prov_prepare_dsa_params,
  171. ossl_prov_dsa_priv_to_der,
  172. &ctx->sc);
  173. BIO_free(out);
  174. return ret;
  175. }
  176. /*
  177. * There's no specific print context, so we use the provider context
  178. */
  179. static void *dsa_print_newctx(void *provctx)
  180. {
  181. return provctx;
  182. }
  183. static void dsa_print_freectx(void *ctx)
  184. {
  185. }
  186. static int dsa_priv_print_data(void *vctx, const OSSL_PARAM params[],
  187. OSSL_CORE_BIO *out,
  188. OSSL_PASSPHRASE_CALLBACK *cb, void *cbarg)
  189. {
  190. struct dsa_priv_ctx_st *ctx = vctx;
  191. OSSL_FUNC_keymgmt_new_fn *dsa_new = ossl_prov_get_keymgmt_dsa_new();
  192. OSSL_FUNC_keymgmt_free_fn *dsa_free = ossl_prov_get_keymgmt_dsa_free();
  193. OSSL_FUNC_keymgmt_import_fn *dsa_import = ossl_prov_get_keymgmt_dsa_import();
  194. int ok = 0;
  195. if (dsa_import != NULL) {
  196. DSA *dsa;
  197. if ((dsa = dsa_new(ctx->provctx)) != NULL
  198. && dsa_import(dsa, OSSL_KEYMGMT_SELECT_KEYPAIR, params)
  199. && dsa_priv_print(ctx, dsa, out, cb, cbarg))
  200. ok = 1;
  201. dsa_free(dsa);
  202. }
  203. return ok;
  204. }
  205. static int dsa_priv_print(void *ctx, void *dsa, OSSL_CORE_BIO *cout,
  206. OSSL_PASSPHRASE_CALLBACK *cb, void *cbarg)
  207. {
  208. BIO *out = bio_new_from_core_bio(ctx, cout);
  209. int ret;
  210. if (out == NULL)
  211. return 0;
  212. ret = ossl_prov_print_dsa(out, dsa, dsa_print_priv);
  213. BIO_free(out);
  214. return ret;
  215. }
  216. const OSSL_DISPATCH dsa_priv_der_encoder_functions[] = {
  217. { OSSL_FUNC_ENCODER_NEWCTX, (void (*)(void))dsa_priv_newctx },
  218. { OSSL_FUNC_ENCODER_FREECTX, (void (*)(void))dsa_priv_freectx },
  219. { OSSL_FUNC_ENCODER_SET_CTX_PARAMS,
  220. (void (*)(void))dsa_priv_set_ctx_params },
  221. { OSSL_FUNC_ENCODER_SETTABLE_CTX_PARAMS,
  222. (void (*)(void))dsa_priv_settable_ctx_params },
  223. { OSSL_FUNC_ENCODER_ENCODE_DATA, (void (*)(void))dsa_priv_der_data },
  224. { OSSL_FUNC_ENCODER_ENCODE_OBJECT, (void (*)(void))dsa_priv_der },
  225. { 0, NULL }
  226. };
  227. const OSSL_DISPATCH dsa_priv_pem_encoder_functions[] = {
  228. { OSSL_FUNC_ENCODER_NEWCTX, (void (*)(void))dsa_priv_newctx },
  229. { OSSL_FUNC_ENCODER_FREECTX, (void (*)(void))dsa_priv_freectx },
  230. { OSSL_FUNC_ENCODER_SET_CTX_PARAMS,
  231. (void (*)(void))dsa_priv_set_ctx_params },
  232. { OSSL_FUNC_ENCODER_SETTABLE_CTX_PARAMS,
  233. (void (*)(void))dsa_priv_settable_ctx_params },
  234. { OSSL_FUNC_ENCODER_ENCODE_DATA, (void (*)(void))dsa_pem_priv_data },
  235. { OSSL_FUNC_ENCODER_ENCODE_OBJECT, (void (*)(void))dsa_pem_priv },
  236. { 0, NULL }
  237. };
  238. const OSSL_DISPATCH dsa_priv_text_encoder_functions[] = {
  239. { OSSL_FUNC_ENCODER_NEWCTX, (void (*)(void))dsa_print_newctx },
  240. { OSSL_FUNC_ENCODER_FREECTX, (void (*)(void))dsa_print_freectx },
  241. { OSSL_FUNC_ENCODER_ENCODE_OBJECT, (void (*)(void))dsa_priv_print },
  242. { OSSL_FUNC_ENCODER_ENCODE_DATA,
  243. (void (*)(void))dsa_priv_print_data },
  244. { 0, NULL }
  245. };