security_wrappers.c 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. /** BEGIN COPYRIGHT BLOCK
  2. * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
  3. * Copyright (C) 2005 Red Hat, Inc.
  4. * All rights reserved.
  5. *
  6. * License: GPL (version 3 or any later version).
  7. * See LICENSE for details.
  8. * END COPYRIGHT BLOCK **/
  9. #ifdef HAVE_CONFIG_H
  10. # include <config.h>
  11. #endif
  12. #include <ssl.h>
  13. #include <nss.h>
  14. #include <key.h>
  15. #include <certdb.h>
  16. #include <cert.h>
  17. #include <sslproto.h>
  18. #include <secoid.h>
  19. #include <secmod.h>
  20. #include <secmodt.h>
  21. #include <prtypes.h>
  22. #include <seccomon.h>
  23. #include <pkcs11.h>
  24. #include <pk11func.h>
  25. #include "slap.h"
  26. /*
  27. * Set of security wrapper functions, aimed at forcing every security-related call
  28. * pass through libslapd library.
  29. * Thus, we avoid finding any ambiguity or data inconsistency (which we would,
  30. * otherwise, have to face on NT.
  31. */
  32. /*
  33. * Note: slapd_ssl_handshakeCallback() is called with a Connection * in
  34. * client_data. That connection must have its c_mutex locked.
  35. */
  36. int
  37. slapd_ssl_handshakeCallback(PRFileDesc *fd, void * callback, void * client_data)
  38. {
  39. return SSL_HandshakeCallback(fd, (SSLHandshakeCallback) callback, client_data);
  40. }
  41. /*
  42. * Note: slapd_ssl_badCertHook() is called with a Connection * in
  43. * client_data. That connection must have its c_mutex locked.
  44. */
  45. int
  46. slapd_ssl_badCertHook(PRFileDesc *fd, void * callback, void * client_data)
  47. {
  48. return SSL_BadCertHook(fd, (SSLBadCertHandler) callback, client_data);
  49. }
  50. CERTCertificate *
  51. slapd_ssl_peerCertificate(PRFileDesc *fd)
  52. {
  53. return SSL_PeerCertificate(fd);
  54. }
  55. SECStatus
  56. slapd_ssl_getChannelInfo(PRFileDesc *fd, SSLChannelInfo *sinfo, PRUintn len)
  57. {
  58. return SSL_GetChannelInfo(fd, sinfo, len);
  59. }
  60. SECStatus
  61. slapd_ssl_getCipherSuiteInfo(PRUint16 ciphersuite, SSLCipherSuiteInfo *cinfo, PRUintn len)
  62. {
  63. return SSL_GetCipherSuiteInfo(ciphersuite, cinfo, len);
  64. }
  65. PRFileDesc *
  66. slapd_ssl_importFD(PRFileDesc *model, PRFileDesc *fd)
  67. {
  68. return SSL_ImportFD(model, fd);
  69. }
  70. SECStatus
  71. slapd_ssl_resetHandshake(PRFileDesc *fd, PRBool asServer)
  72. {
  73. return SSL_ResetHandshake(fd, asServer);
  74. }
  75. void
  76. slapd_pk11_configurePKCS11(char *man, char *libdes, char *tokdes, char *ptokdes,
  77. char *slotdes, char *pslotdes, char *fslotdes,
  78. char *fpslotdes, int minPwd,
  79. int pwdRequired)
  80. {
  81. PK11_ConfigurePKCS11(man, libdes, tokdes, ptokdes,
  82. slotdes, pslotdes, fslotdes, fpslotdes, minPwd,
  83. pwdRequired);
  84. return;
  85. }
  86. void
  87. slapd_pk11_freeSlot(PK11SlotInfo *slot)
  88. {
  89. PK11_FreeSlot(slot);
  90. return;
  91. }
  92. void
  93. slapd_pk11_freeSymKey(PK11SymKey *key)
  94. {
  95. PK11_FreeSymKey(key);
  96. return;
  97. }
  98. PK11SlotInfo *
  99. slapd_pk11_findSlotByName(char *name)
  100. {
  101. return PK11_FindSlotByName(name);
  102. }
  103. SECAlgorithmID *
  104. slapd_pk11_createPBEAlgorithmID(SECOidTag algorithm, int iteration, SECItem *salt)
  105. {
  106. return PK11_CreatePBEAlgorithmID(algorithm, iteration, salt);
  107. }
  108. PK11SymKey *
  109. slapd_pk11_pbeKeyGen(PK11SlotInfo *slot, SECAlgorithmID *algid, SECItem *pwitem,
  110. PRBool faulty3DES, void *wincx)
  111. {
  112. return PK11_PBEKeyGen(slot, algid, pwitem,
  113. faulty3DES, wincx);
  114. }
  115. CK_MECHANISM_TYPE
  116. slapd_pk11_algtagToMechanism(SECOidTag algTag)
  117. {
  118. return PK11_AlgtagToMechanism(algTag);
  119. }
  120. SECItem *
  121. slapd_pk11_paramFromAlgid(SECAlgorithmID *algid)
  122. {
  123. return PK11_ParamFromAlgid(algid);
  124. }
  125. CK_RV
  126. slapd_pk11_mapPBEMechanismToCryptoMechanism(CK_MECHANISM_PTR pPBEMechanism,
  127. CK_MECHANISM_PTR pCryptoMechanism,
  128. SECItem *pbe_pwd, PRBool bad3DES)
  129. {
  130. return PK11_MapPBEMechanismToCryptoMechanism(pPBEMechanism,
  131. pCryptoMechanism,
  132. pbe_pwd, bad3DES);
  133. }
  134. int
  135. slapd_pk11_getBlockSize(CK_MECHANISM_TYPE type,SECItem *params)
  136. {
  137. return PK11_GetBlockSize(type,params);
  138. }
  139. PK11Context *
  140. slapd_pk11_createContextBySymKey(CK_MECHANISM_TYPE type,
  141. CK_ATTRIBUTE_TYPE operation,
  142. PK11SymKey *symKey, SECItem *param)
  143. {
  144. return PK11_CreateContextBySymKey(type,
  145. operation, symKey, param);
  146. }
  147. SECStatus
  148. slapd_pk11_cipherOp(PK11Context *context, unsigned char * out, int *outlen,
  149. int maxout, unsigned char *in, int inlen)
  150. {
  151. return PK11_CipherOp(context, out, outlen, maxout, in, inlen);
  152. }
  153. SECStatus
  154. slapd_pk11_finalize(PK11Context *context)
  155. {
  156. return PK11_Finalize(context);
  157. }
  158. PK11SlotInfo *
  159. slapd_pk11_getInternalKeySlot()
  160. {
  161. return PK11_GetInternalKeySlot();
  162. }
  163. PK11SlotInfo *
  164. slapd_pk11_getInternalSlot()
  165. {
  166. return PK11_GetInternalSlot();
  167. }
  168. SECStatus
  169. slapd_pk11_authenticate(PK11SlotInfo *slot, PRBool loadCerts, void *wincx)
  170. {
  171. return PK11_Authenticate(slot, loadCerts, wincx);
  172. }
  173. void
  174. slapd_pk11_setSlotPWValues(PK11SlotInfo *slot,int askpw, int timeout)
  175. {
  176. PK11_SetSlotPWValues(slot, askpw, timeout);
  177. return;
  178. }
  179. PRBool
  180. slapd_pk11_isFIPS()
  181. {
  182. return PK11_IsFIPS();
  183. }
  184. CERTCertificate *
  185. slapd_pk11_findCertFromNickname(char *nickname, void *wincx)
  186. {
  187. return PK11_FindCertFromNickname(nickname, wincx);
  188. }
  189. SECKEYPrivateKey *
  190. slapd_pk11_findKeyByAnyCert(CERTCertificate *cert, void *wincx)
  191. {
  192. return PK11_FindKeyByAnyCert(cert, wincx);
  193. }
  194. PRBool
  195. slapd_pk11_fortezzaHasKEA(CERTCertificate *cert)
  196. {
  197. return PK11_FortezzaHasKEA(cert);
  198. }
  199. void
  200. slapd_pk11_destroyContext(PK11Context *context, PRBool freeit)
  201. {
  202. PK11_DestroyContext(context, freeit);
  203. }
  204. void secoid_destroyAlgorithmID(SECAlgorithmID *algid, PRBool freeit)
  205. {
  206. SECOID_DestroyAlgorithmID(algid, freeit);
  207. }
  208. void slapd_pk11_CERT_DestroyCertificate(CERTCertificate *cert)
  209. {
  210. CERT_DestroyCertificate(cert);
  211. }
  212. SECKEYPublicKey *slapd_CERT_ExtractPublicKey(CERTCertificate *cert)
  213. {
  214. return CERT_ExtractPublicKey(cert);
  215. }
  216. SECKEYPrivateKey * slapd_pk11_FindPrivateKeyFromCert(PK11SlotInfo *slot,CERTCertificate *cert, void *wincx)
  217. {
  218. return PK11_FindPrivateKeyFromCert(slot,cert,wincx);
  219. }
  220. PK11SlotInfo *slapd_pk11_GetInternalKeySlot(void)
  221. {
  222. return PK11_GetInternalKeySlot();
  223. }
  224. SECStatus slapd_pk11_PubWrapSymKey(CK_MECHANISM_TYPE type, SECKEYPublicKey *pubKey,PK11SymKey *symKey, SECItem *wrappedKey)
  225. {
  226. return PK11_PubWrapSymKey(type,pubKey,symKey,wrappedKey);
  227. }
  228. PK11SymKey *slapd_pk11_KeyGen(PK11SlotInfo *slot,CK_MECHANISM_TYPE type,SECItem *param, int keySize,void *wincx)
  229. {
  230. return PK11_KeyGen(slot,type,param,keySize,wincx);
  231. }
  232. void slapd_pk11_FreeSlot(PK11SlotInfo *slot)
  233. {
  234. PK11_FreeSlot(slot);
  235. }
  236. void slapd_pk11_FreeSymKey(PK11SymKey *key)
  237. {
  238. PK11_FreeSymKey(key);
  239. }
  240. SECItem *slapd_pk11_ParamFromIV(CK_MECHANISM_TYPE type,SECItem *iv)
  241. {
  242. return PK11_ParamFromIV(type,iv);
  243. }
  244. PK11SymKey *slapd_pk11_PubUnwrapSymKey(SECKEYPrivateKey *wrappingKey, SECItem *wrappedKey,CK_MECHANISM_TYPE target, CK_ATTRIBUTE_TYPE operation, int keySize)
  245. {
  246. return PK11_PubUnwrapSymKey(wrappingKey,wrappedKey,target,operation,keySize);
  247. }
  248. unsigned slapd_SECKEY_PublicKeyStrength(SECKEYPublicKey *pubk)
  249. {
  250. return SECKEY_PublicKeyStrength(pubk);
  251. }
  252. SECStatus slapd_pk11_Finalize(PK11Context *context)
  253. {
  254. return PK11_Finalize(context);
  255. }
  256. SECStatus slapd_pk11_DigestFinal(PK11Context *context, unsigned char *data,unsigned int *outLen, unsigned int length)
  257. {
  258. return PK11_DigestFinal(context, data, outLen, length);
  259. }
  260. void
  261. slapd_SECITEM_FreeItem (SECItem *zap, PRBool freeit)
  262. {
  263. SECITEM_FreeItem(zap,freeit);
  264. }
  265. void slapd_pk11_DestroyPrivateKey(SECKEYPrivateKey *key)
  266. {
  267. SECKEY_DestroyPrivateKey(key);
  268. }
  269. void slapd_pk11_DestroyPublicKey(SECKEYPublicKey *key)
  270. {
  271. SECKEY_DestroyPublicKey(key);
  272. }
  273. PRBool slapd_pk11_DoesMechanism(PK11SlotInfo *slot, CK_MECHANISM_TYPE type)
  274. {
  275. return PK11_DoesMechanism(slot, type);
  276. }
  277. PK11SymKey *slapd_pk11_PubUnwrapSymKeyWithFlagsPerm(
  278. SECKEYPrivateKey *wrappingKey,
  279. SECItem *wrappedKey,
  280. CK_MECHANISM_TYPE target,
  281. CK_ATTRIBUTE_TYPE operation,
  282. int keySize,
  283. CK_FLAGS flags,
  284. PRBool isPerm)
  285. {
  286. return PK11_PubUnwrapSymKeyWithFlagsPerm(wrappingKey, wrappedKey, target,
  287. operation, keySize, flags, isPerm);
  288. }
  289. PK11SymKey *slapd_pk11_TokenKeyGenWithFlags(PK11SlotInfo *slot,
  290. CK_MECHANISM_TYPE type,
  291. SECItem *param,
  292. int keySize,
  293. SECItem *keyid,
  294. CK_FLAGS opFlags,
  295. PK11AttrFlags attrFlags,
  296. void *wincx)
  297. {
  298. return PK11_TokenKeyGenWithFlags(slot, type, param, keySize, keyid,
  299. opFlags, attrFlags, wincx);
  300. }
  301. CK_MECHANISM_TYPE
  302. slapd_PK11_GetPBECryptoMechanism(SECAlgorithmID *algid, SECItem **params, SECItem *pwitem)
  303. {
  304. return PK11_GetPBECryptoMechanism(algid, params, pwitem );
  305. }