cl_crypt.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. /** BEGIN COPYRIGHT BLOCK
  2. * Copyright (C) 2010 Red Hat, Inc.
  3. * All rights reserved.
  4. *
  5. * License: GPL (version 3 or any later version).
  6. * See LICENSE for details.
  7. * END COPYRIGHT BLOCK **/
  8. #ifdef HAVE_CONFIG_H
  9. #include <config.h>
  10. #endif
  11. /* cl_crypt.c - handles changelog encryption. */
  12. #include <errno.h>
  13. #include <sys/stat.h>
  14. #if defined(OS_solaris) || defined(hpux)
  15. #include <sys/types.h>
  16. #include <sys/statvfs.h>
  17. #endif
  18. #if defined(linux)
  19. #include <sys/vfs.h>
  20. #endif
  21. #include "slapi-plugin.h"
  22. #include "cl5_api.h"
  23. #include "cl_crypt.h"
  24. /*
  25. * BACK_INFO_CRYPT_INIT
  26. */
  27. void *
  28. clcrypt_init(char *encryptionAlgorithm, Slapi_Backend *be)
  29. {
  30. int rc = 0;
  31. back_info_crypt_init crypt_init = {0};
  32. void *crypt_handle = NULL;
  33. slapi_log_err(SLAPI_LOG_TRACE, repl_plugin_name, "-> clcrypt_init\n");
  34. if (!encryptionAlgorithm) {
  35. /* Encryption is not specified */
  36. goto bail;
  37. }
  38. crypt_init.dn = "cn=changelog";
  39. crypt_init.encryptionAlgorithm = encryptionAlgorithm;
  40. crypt_init.be = be;
  41. rc = slapi_back_ctrl_info(be, BACK_INFO_CRYPT_INIT,
  42. (void *)&crypt_init);
  43. if (LDAP_SUCCESS == rc && crypt_init.state_priv) {
  44. crypt_handle = crypt_init.state_priv;
  45. }
  46. bail:
  47. slapi_log_err(SLAPI_LOG_TRACE, repl_plugin_name,
  48. "<- clcrypt_init : %d\n", rc);
  49. return crypt_handle;
  50. }
  51. /*
  52. * return values: 0 - success
  53. * : -1 - error
  54. *
  55. * output value: out: non-NULL - cl encryption state private freed
  56. * : NULL - failure
  57. */
  58. int
  59. clcrypt_destroy(void *clcrypt_handle, Slapi_Backend *be)
  60. {
  61. int rc = -1;
  62. back_info_crypt_destroy crypt_destroy = {0};
  63. slapi_log_err(SLAPI_LOG_TRACE, repl_plugin_name,
  64. "-> clcrypt_destroy\n");
  65. if (NULL == clcrypt_handle) {
  66. /* Nothing to free */
  67. return 0;
  68. }
  69. crypt_destroy.state_priv = clcrypt_handle;
  70. rc = slapi_back_ctrl_info(be, BACK_INFO_CRYPT_DESTROY,
  71. (void *)&crypt_destroy);
  72. if (LDAP_SUCCESS == rc) {
  73. rc = 0;
  74. } else {
  75. rc = -1;
  76. }
  77. slapi_log_err(SLAPI_LOG_TRACE, repl_plugin_name,
  78. "<- clcrypt_destroy (returning %d)\n", rc);
  79. return rc;
  80. }
  81. /*
  82. * return values: 0 - success
  83. * : 1 - no encryption
  84. * : -1 - error
  85. *
  86. * output value: out: non-NULL - encryption successful
  87. * : NULL - no encryption or failure
  88. */
  89. int
  90. clcrypt_encrypt_value(void *clcrypt_handle,
  91. struct berval *in,
  92. struct berval **out)
  93. {
  94. int rc = -1;
  95. char *cookie = NULL;
  96. Slapi_Backend *be = NULL;
  97. back_info_crypt_value crypt_value = {0};
  98. slapi_log_err(SLAPI_LOG_TRACE, repl_plugin_name,
  99. "-> clcrypt_encrypt_value\n");
  100. if (NULL == out) {
  101. goto bail;
  102. }
  103. *out = NULL;
  104. if (NULL == clcrypt_handle) {
  105. rc = 1;
  106. goto bail;
  107. }
  108. crypt_value.state_priv = clcrypt_handle;
  109. crypt_value.in = in;
  110. be = slapi_get_first_backend(&cookie);
  111. while (be) {
  112. rc = slapi_back_ctrl_info(be, BACK_INFO_CRYPT_ENCRYPT_VALUE,
  113. (void *)&crypt_value);
  114. if (LDAP_SUCCESS == rc) {
  115. break; /* Successfully fetched */
  116. }
  117. be = slapi_get_next_backend(cookie);
  118. }
  119. slapi_ch_free((void **)&cookie);
  120. if (LDAP_SUCCESS == rc && crypt_value.out) {
  121. *out = crypt_value.out;
  122. rc = 0;
  123. } else {
  124. rc = -1;
  125. }
  126. bail:
  127. slapi_log_err(SLAPI_LOG_TRACE, repl_plugin_name,
  128. "<- clcrypt_encrypt_entry (returning %d)\n", rc);
  129. return rc;
  130. }
  131. /*
  132. * return values: 0 - success
  133. * : 1 - no encryption
  134. * : -1 - error
  135. *
  136. * output value: out: non-NULL - encryption successful
  137. * : NULL - no encryption or failure
  138. */
  139. int
  140. clcrypt_decrypt_value(void *clcrypt_handle,
  141. struct berval *in,
  142. struct berval **out)
  143. {
  144. int rc = -1;
  145. char *cookie = NULL;
  146. Slapi_Backend *be = NULL;
  147. back_info_crypt_value crypt_value = {0};
  148. slapi_log_err(SLAPI_LOG_TRACE, repl_plugin_name,
  149. "-> clcrypt_decrypt_value\n");
  150. if (NULL == out) {
  151. goto bail;
  152. }
  153. *out = NULL;
  154. if (NULL == clcrypt_handle) {
  155. rc = 1;
  156. goto bail;
  157. }
  158. crypt_value.state_priv = clcrypt_handle;
  159. crypt_value.in = in;
  160. be = slapi_get_first_backend(&cookie);
  161. while (be) {
  162. rc = slapi_back_ctrl_info(be, BACK_INFO_CRYPT_DECRYPT_VALUE,
  163. (void *)&crypt_value);
  164. if (LDAP_SUCCESS == rc) {
  165. break; /* Successfully fetched */
  166. }
  167. be = slapi_get_next_backend(cookie);
  168. }
  169. slapi_ch_free((void **)&cookie);
  170. if (LDAP_SUCCESS == rc && crypt_value.out) {
  171. *out = crypt_value.out;
  172. rc = 0;
  173. } else {
  174. rc = -1;
  175. }
  176. bail:
  177. slapi_log_err(SLAPI_LOG_TRACE, repl_plugin_name,
  178. "<- clcrypt_decrypt_entry (returning %d)\n", rc);
  179. return rc;
  180. }