provider.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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. #include <openssl/err.h>
  10. #include <openssl/cryptoerr.h>
  11. #include <openssl/provider.h>
  12. #include <openssl/core_names.h>
  13. #include "internal/provider.h"
  14. OSSL_PROVIDER *OSSL_PROVIDER_try_load(OSSL_LIB_CTX *libctx, const char *name)
  15. {
  16. OSSL_PROVIDER *prov = NULL;
  17. /* Find it or create it */
  18. if ((prov = ossl_provider_find(libctx, name, 0)) == NULL
  19. && (prov = ossl_provider_new(libctx, name, NULL, 0)) == NULL)
  20. return NULL;
  21. if (!ossl_provider_activate(prov)) {
  22. ossl_provider_free(prov);
  23. return NULL;
  24. }
  25. return prov;
  26. }
  27. OSSL_PROVIDER *OSSL_PROVIDER_load(OSSL_LIB_CTX *libctx, const char *name)
  28. {
  29. /* Any attempt to load a provider disables auto-loading of defaults */
  30. if (ossl_provider_disable_fallback_loading(libctx))
  31. return OSSL_PROVIDER_try_load(libctx, name);
  32. return NULL;
  33. }
  34. int OSSL_PROVIDER_unload(OSSL_PROVIDER *prov)
  35. {
  36. ossl_provider_free(prov);
  37. return 1;
  38. }
  39. int OSSL_PROVIDER_available(OSSL_LIB_CTX *libctx, const char *name)
  40. {
  41. OSSL_PROVIDER *prov = NULL;
  42. int available = 0;
  43. /* Find it or create it */
  44. prov = ossl_provider_find(libctx, name, 0);
  45. available = ossl_provider_available(prov);
  46. ossl_provider_free(prov);
  47. return available;
  48. }
  49. const OSSL_PARAM *OSSL_PROVIDER_gettable_params(const OSSL_PROVIDER *prov)
  50. {
  51. return ossl_provider_gettable_params(prov);
  52. }
  53. int OSSL_PROVIDER_get_params(const OSSL_PROVIDER *prov, OSSL_PARAM params[])
  54. {
  55. return ossl_provider_get_params(prov, params);
  56. }
  57. const OSSL_ALGORITHM *OSSL_PROVIDER_query_operation(const OSSL_PROVIDER *prov,
  58. int operation_id,
  59. int *no_cache)
  60. {
  61. return ossl_provider_query_operation(prov, operation_id, no_cache);
  62. }
  63. void *OSSL_PROVIDER_get0_provider_ctx(const OSSL_PROVIDER *prov)
  64. {
  65. return ossl_provider_prov_ctx(prov);
  66. }
  67. int OSSL_PROVIDER_self_test(const OSSL_PROVIDER *prov)
  68. {
  69. return ossl_provider_self_test(prov);
  70. }
  71. int OSSL_PROVIDER_get_capabilities(const OSSL_PROVIDER *prov,
  72. const char *capability,
  73. OSSL_CALLBACK *cb,
  74. void *arg)
  75. {
  76. return ossl_provider_get_capabilities(prov, capability, cb, arg);
  77. }
  78. int OSSL_PROVIDER_add_builtin(OSSL_LIB_CTX *libctx, const char *name,
  79. OSSL_provider_init_fn *init_fn)
  80. {
  81. OSSL_PROVIDER *prov = NULL;
  82. if (name == NULL || init_fn == NULL) {
  83. CRYPTOerr(CRYPTO_F_OSSL_PROVIDER_ADD_BUILTIN,
  84. ERR_R_PASSED_NULL_PARAMETER);
  85. return 0;
  86. }
  87. /* Create it */
  88. if ((prov = ossl_provider_new(libctx, name, init_fn, 0)) == NULL)
  89. return 0;
  90. /*
  91. * It's safely stored in the internal store at this point,
  92. * free the returned extra reference
  93. */
  94. ossl_provider_free(prov);
  95. return 1;
  96. }
  97. const char *OSSL_PROVIDER_name(const OSSL_PROVIDER *prov)
  98. {
  99. return ossl_provider_name(prov);
  100. }
  101. int OSSL_PROVIDER_do_all(OSSL_LIB_CTX *ctx,
  102. int (*cb)(OSSL_PROVIDER *provider,
  103. void *cbdata),
  104. void *cbdata)
  105. {
  106. return ossl_provider_forall_loaded(ctx, cb, cbdata);
  107. }