crypto.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651
  1. /* Copyright 2001,2002 Roger Dingledine, Matej Pfajfar. */
  2. /* See LICENSE for licensing information */
  3. /* $Id$ */
  4. #include <string.h>
  5. #include <openssl/err.h>
  6. #include <openssl/rsa.h>
  7. #include <openssl/pem.h>
  8. #include <openssl/evp.h>
  9. #include <openssl/rand.h>
  10. #include <openssl/opensslv.h>
  11. #include <stdlib.h>
  12. #include <assert.h>
  13. #include "crypto.h"
  14. #include "config.h"
  15. #include "log.h"
  16. #if OPENSSL_VERSION_NUMBER < 0x00905000l
  17. #error "We require openssl >= 0.9.5"
  18. #elif OPENSSL_VERSION_NUMBER < 0x00906000l
  19. #define OPENSSL_095
  20. #endif
  21. /*
  22. * Certain functions that return a success code in OpenSSL 0.9.6 return void
  23. * (and don't indicate errors) in OpenSSL version 0.9.5.
  24. *
  25. * [OpenSSL 0.9.5 matters, because it ships with Redhat 6.2.]
  26. */
  27. #ifdef OPENSSL_095
  28. #define RETURN_SSL_OUTCOME(exp) (exp); return 0
  29. #else
  30. #define RETURN_SSL_OUTCOME(exp) return !(exp)
  31. #endif
  32. int crypto_global_init()
  33. {
  34. ERR_load_crypto_strings();
  35. return 0;
  36. }
  37. int crypto_global_cleanup()
  38. {
  39. ERR_free_strings();
  40. return 0;
  41. }
  42. crypto_pk_env_t *crypto_new_pk_env(int type)
  43. {
  44. crypto_pk_env_t *env;
  45. env = (crypto_pk_env_t *)malloc(sizeof(crypto_pk_env_t));
  46. if (!env)
  47. return 0;
  48. env->type = type;
  49. env->refs = 1;
  50. env->key = NULL;
  51. env->aux = NULL;
  52. switch(type) {
  53. case CRYPTO_PK_RSA:
  54. env->key = (unsigned char *)RSA_new();
  55. if (!env->key) {
  56. free((void *)env);
  57. return NULL;
  58. }
  59. break;
  60. default:
  61. free((void *)env);
  62. return NULL;
  63. break;
  64. }
  65. return env;
  66. }
  67. void crypto_free_pk_env(crypto_pk_env_t *env)
  68. {
  69. assert(env);
  70. if(--env->refs > 0)
  71. return;
  72. switch(env->type) {
  73. case CRYPTO_PK_RSA:
  74. if (env->key)
  75. RSA_free((RSA *)env->key);
  76. break;
  77. default:
  78. break;
  79. }
  80. free((void *)env);
  81. return;
  82. }
  83. crypto_cipher_env_t *crypto_new_cipher_env(int type)
  84. {
  85. crypto_cipher_env_t *env;
  86. env = (crypto_cipher_env_t *)malloc(sizeof(crypto_cipher_env_t));
  87. if (!env)
  88. return NULL;
  89. env->type = type;
  90. env->key = NULL;
  91. env->iv = NULL;
  92. env->aux = NULL;
  93. switch(type) {
  94. case CRYPTO_CIPHER_IDENTITY:
  95. env->aux = (unsigned char *)malloc(sizeof(EVP_CIPHER_CTX));
  96. if (!env->aux) {
  97. free((void *)env);
  98. return NULL;
  99. }
  100. EVP_CIPHER_CTX_init((EVP_CIPHER_CTX *)env->aux);
  101. break;
  102. case CRYPTO_CIPHER_DES:
  103. env->aux = (unsigned char *)malloc(sizeof(EVP_CIPHER_CTX));
  104. if (!env->aux) {
  105. free((void *)env);
  106. return NULL;
  107. }
  108. env->key = (unsigned char *)malloc(8);
  109. if (!env->key) {
  110. free((void *)env->aux);
  111. free((void *)env);
  112. return NULL;
  113. }
  114. env->iv = (unsigned char *)malloc(8);
  115. if (!env->iv) {
  116. free((void *)env->key);
  117. free((void *)env->aux);
  118. return NULL;
  119. }
  120. EVP_CIPHER_CTX_init((EVP_CIPHER_CTX *)env->aux);
  121. break;
  122. case CRYPTO_CIPHER_RC4:
  123. env->aux = (unsigned char *)malloc(sizeof(EVP_CIPHER_CTX));
  124. if (!env->aux) {
  125. free((void *)env);
  126. return NULL;
  127. }
  128. env->key = (unsigned char *)malloc(16);
  129. if (!env->key) {
  130. free((void *)env->aux);
  131. free((void *)env);
  132. return NULL;
  133. }
  134. env->iv = (unsigned char *)malloc(16);
  135. if (!env->iv) {
  136. free((void *)env->key);
  137. free((void *)env->aux);
  138. return NULL;
  139. }
  140. break;
  141. EVP_CIPHER_CTX_init((EVP_CIPHER_CTX *)env->aux);
  142. default:
  143. free((void *)env);
  144. return NULL;
  145. break;
  146. }
  147. return env;
  148. }
  149. void crypto_free_cipher_env(crypto_cipher_env_t *env)
  150. {
  151. assert(env);
  152. switch(env->type) {
  153. case CRYPTO_CIPHER_IDENTITY:
  154. if (env->aux) {
  155. EVP_CIPHER_CTX_cleanup((EVP_CIPHER_CTX *)env->aux);
  156. free((void *)env->aux);
  157. }
  158. break;
  159. case CRYPTO_CIPHER_DES:
  160. if (env->aux) {
  161. EVP_CIPHER_CTX_cleanup((EVP_CIPHER_CTX *)env->aux);
  162. free((void *)env->aux);
  163. }
  164. if (env->key)
  165. free((void *)env->key);
  166. if (env->iv)
  167. free((void *)env->iv);
  168. break;
  169. case CRYPTO_CIPHER_RC4:
  170. if (env->aux) {
  171. EVP_CIPHER_CTX_cleanup((EVP_CIPHER_CTX *)env->aux);
  172. free((void *)env->aux);
  173. }
  174. if (env->key)
  175. free((void *)env->key);
  176. if (env->iv)
  177. free((void *)env->iv);
  178. break;
  179. default:
  180. break;
  181. }
  182. free((void *)env);
  183. return;
  184. }
  185. /* public key crypto */
  186. int crypto_pk_generate_key(crypto_pk_env_t *env)
  187. {
  188. assert(env);
  189. switch(env->type) {
  190. case CRYPTO_PK_RSA:
  191. if (env->key)
  192. RSA_free((RSA *)env->key);
  193. env->key = (unsigned char *)RSA_generate_key(1024,65537, NULL, NULL);
  194. if (!env->key)
  195. return -1;
  196. break;
  197. default:
  198. return -1;
  199. }
  200. return 0;
  201. }
  202. int crypto_pk_read_private_key_from_file(crypto_pk_env_t *env, FILE *src)
  203. {
  204. assert(env && src);
  205. switch(env->type) {
  206. case CRYPTO_PK_RSA:
  207. /*
  208. if (env->key)
  209. RSA_free((RSA *)env->key);*/
  210. env->key = (unsigned char *)PEM_read_RSAPrivateKey(src, (RSA **)&env->key, NULL, NULL);
  211. if (!env->key)
  212. return -1;
  213. break;
  214. default :
  215. return -1;
  216. }
  217. return 0;
  218. }
  219. int crypto_pk_read_private_key_from_filename(crypto_pk_env_t *env, unsigned char *keyfile)
  220. {
  221. FILE *f_pr;
  222. int retval = 0;
  223. assert(env && keyfile);
  224. if (strspn(keyfile,CONFIG_LEGAL_FILENAME_CHARACTERS) == strlen(keyfile)) /* filename contains legal characters only */
  225. {
  226. /* open the keyfile */
  227. f_pr=fopen(keyfile,"r");
  228. if (!f_pr)
  229. return -1;
  230. /* read the private key */
  231. retval = crypto_pk_read_private_key_from_file(env, f_pr);
  232. fclose(f_pr);
  233. if (retval == -1)
  234. {
  235. log(LOG_ERR,"Error reading private key : %s",crypto_perror());
  236. return -1;
  237. }
  238. /* check the private key */
  239. retval = crypto_pk_check_key(env);
  240. if (retval == 0)
  241. {
  242. log(LOG_ERR,"Private key read but is invalid : %s.", crypto_perror());
  243. return -1;
  244. }
  245. else if (retval == -1)
  246. {
  247. log(LOG_ERR,"Private key read but validity checking failed : %s",crypto_perror());
  248. return -1;
  249. }
  250. else if (retval == 1)
  251. {
  252. return 0;
  253. }
  254. } /* filename contains legal characters only */
  255. return -1; /* report error */
  256. }
  257. int crypto_pk_read_public_key_from_file(crypto_pk_env_t *env, FILE *src)
  258. {
  259. assert(env && src);
  260. switch(env->type) {
  261. case CRYPTO_PK_RSA:
  262. env->key = (unsigned char *)PEM_read_RSAPublicKey(src, (RSA **)&env->key, NULL, NULL);
  263. if (!env->key)
  264. return -1;
  265. break;
  266. default :
  267. return -1;
  268. }
  269. return 0;
  270. }
  271. int crypto_pk_write_public_key_to_string(crypto_pk_env_t *env, char **dest, int *len) {
  272. BUF_MEM *buf;
  273. BIO *b;
  274. assert(env && env->key && dest);
  275. switch(env->type) {
  276. case CRYPTO_PK_RSA:
  277. b = BIO_new(BIO_s_mem()); /* Create a memory BIO */
  278. /* Now you can treat b as if it were a file. Just use the
  279. * * PEM_*_bio_* functions instead of the non-bio variants.
  280. * */
  281. if(!PEM_write_bio_RSAPublicKey(b, (RSA *)env->key))
  282. return -1;
  283. BIO_get_mem_ptr(b, &buf);
  284. BIO_set_close(b, BIO_NOCLOSE); /* so BIO_free doesn't free buf */
  285. BIO_free(b);
  286. *dest = malloc(buf->length+1);
  287. if(!*dest)
  288. return -1;
  289. memcpy(*dest, buf->data, buf->length);
  290. (*dest)[buf->length] = 0; /* null terminate it */
  291. *len = buf->length;
  292. BUF_MEM_free(buf);
  293. break;
  294. default:
  295. return -1;
  296. }
  297. return 0;
  298. }
  299. int crypto_pk_read_public_key_from_string(crypto_pk_env_t *env, char *src, int len) {
  300. BIO *b;
  301. assert(env && src);
  302. switch(env->type) {
  303. case CRYPTO_PK_RSA:
  304. b = BIO_new(BIO_s_mem()); /* Create a memory BIO */
  305. BIO_write(b, src, len);
  306. RSA_free((RSA *)env->key);
  307. env->key = (unsigned char *)PEM_read_bio_RSAPublicKey(b, NULL, NULL, NULL);
  308. if(!env->key)
  309. return -1;
  310. BIO_free(b);
  311. break;
  312. default:
  313. return -1;
  314. }
  315. return 0;
  316. }
  317. int crypto_pk_write_private_key_to_file(crypto_pk_env_t *env, FILE *dest)
  318. {
  319. assert(env && dest);
  320. switch(env->type) {
  321. case CRYPTO_PK_RSA:
  322. if (!env->key)
  323. return -1;
  324. if (PEM_write_RSAPrivateKey(dest, (RSA *)env->key, NULL, NULL, 0,0, NULL) == 0)
  325. return -1;
  326. break;
  327. default :
  328. return -1;
  329. }
  330. return 0;
  331. }
  332. int crypto_pk_write_public_key_to_file(crypto_pk_env_t *env, FILE *dest)
  333. {
  334. assert(env && dest);
  335. switch(env->type) {
  336. case CRYPTO_PK_RSA:
  337. if (!env->key)
  338. return -1;
  339. if (PEM_write_RSAPublicKey(dest, (RSA *)env->key) == 0)
  340. return -1;
  341. break;
  342. default :
  343. return -1;
  344. }
  345. return 0;
  346. }
  347. int crypto_pk_check_key(crypto_pk_env_t *env)
  348. {
  349. assert(env);
  350. switch(env->type) {
  351. case CRYPTO_PK_RSA:
  352. return RSA_check_key((RSA *)env->key);
  353. default:
  354. return -1;
  355. }
  356. }
  357. int crypto_pk_set_key(crypto_pk_env_t *env, unsigned char *key)
  358. {
  359. assert(env && key);
  360. switch(env->type) {
  361. case CRYPTO_PK_RSA:
  362. if (!env->key)
  363. return -1;
  364. memcpy((void *)env->key, (void *)key, sizeof(RSA));
  365. /* XXX BUG XXX you can't memcpy an RSA, it's got a bunch of subpointers */
  366. break;
  367. default :
  368. return -1;
  369. }
  370. return 0;
  371. }
  372. int crypto_pk_cmp_keys(crypto_pk_env_t *a, crypto_pk_env_t *b) {
  373. int result;
  374. if (!a || !b)
  375. return -1;
  376. if (!a->key || !b->key)
  377. return -1;
  378. if (a->type != b->type)
  379. return -1;
  380. switch(a->type) {
  381. case CRYPTO_PK_RSA:
  382. assert(((RSA *)a->key)->n && ((RSA *)a->key)->e && ((RSA *)b->key)->n && ((RSA *)b->key)->e);
  383. result = BN_cmp(((RSA *)a->key)->n, ((RSA *)b->key)->n);
  384. if (result)
  385. return result;
  386. return BN_cmp(((RSA *)a->key)->e, ((RSA *)b->key)->e);
  387. default:
  388. return -1;
  389. }
  390. }
  391. int crypto_pk_keysize(crypto_pk_env_t *env)
  392. {
  393. assert(env && env->key);
  394. return RSA_size((RSA *)env->key);
  395. }
  396. crypto_pk_env_t *crypto_pk_dup_key(crypto_pk_env_t *env) {
  397. assert(env && env->key);
  398. switch(env->type) {
  399. case CRYPTO_PK_RSA:
  400. env->refs++;
  401. break;
  402. default:
  403. return NULL;
  404. }
  405. return env;
  406. }
  407. int crypto_pk_public_encrypt(crypto_pk_env_t *env, unsigned char *from, int fromlen, unsigned char *to, int padding)
  408. {
  409. assert(env && from && to);
  410. switch(env->type) {
  411. case CRYPTO_PK_RSA:
  412. return RSA_public_encrypt(fromlen, from, to, (RSA *)env->key, padding);
  413. default:
  414. return -1;
  415. }
  416. }
  417. int crypto_pk_private_decrypt(crypto_pk_env_t *env, unsigned char *from, int fromlen, unsigned char *to, int padding)
  418. {
  419. assert(env && from && to);
  420. switch(env->type) {
  421. case CRYPTO_PK_RSA:
  422. return RSA_private_decrypt(fromlen, from, to, (RSA *)env->key, padding);
  423. default:
  424. return -1;
  425. }
  426. }
  427. /* symmetric crypto */
  428. int crypto_cipher_generate_key(crypto_cipher_env_t *env)
  429. {
  430. assert(env);
  431. switch(env->type) {
  432. case CRYPTO_CIPHER_IDENTITY:
  433. return 0;
  434. case CRYPTO_CIPHER_DES:
  435. return crypto_rand(8, env->key);
  436. case CRYPTO_CIPHER_RC4:
  437. return crypto_rand(16, env->key);
  438. default:
  439. return -1;
  440. }
  441. }
  442. int crypto_cipher_set_iv(crypto_cipher_env_t *env, unsigned char *iv)
  443. {
  444. assert(env && iv);
  445. switch(env->type) {
  446. case CRYPTO_CIPHER_IDENTITY:
  447. break;
  448. case CRYPTO_CIPHER_DES:
  449. if (!env->iv)
  450. return -1;
  451. memcpy((void *)env->iv, (void *)iv, 8);
  452. break;
  453. case CRYPTO_CIPHER_RC4:
  454. if (!env->iv)
  455. return -1;
  456. memcpy((void *)env->iv, (void *)iv, 16);
  457. break;
  458. default:
  459. return -1;
  460. }
  461. return 0;
  462. }
  463. int crypto_cipher_set_key(crypto_cipher_env_t *env, unsigned char *key)
  464. {
  465. assert(env && key);
  466. switch(env->type) {
  467. case CRYPTO_CIPHER_IDENTITY:
  468. break;
  469. case CRYPTO_CIPHER_DES:
  470. if (!env->key)
  471. return -1;
  472. memcpy((void *)env->key, (void *)key, 8);
  473. break;
  474. case CRYPTO_CIPHER_RC4:
  475. if (!env->key)
  476. return -1;
  477. memcpy((void *)env->key, (void *)key, 16);
  478. break;
  479. default:
  480. return -1;
  481. }
  482. return 0;
  483. }
  484. int crypto_cipher_encrypt_init_cipher(crypto_cipher_env_t *env)
  485. {
  486. assert(env);
  487. switch(env->type) {
  488. case CRYPTO_CIPHER_IDENTITY:
  489. RETURN_SSL_OUTCOME(EVP_EncryptInit((EVP_CIPHER_CTX *)env->aux, EVP_enc_null(), env->key, env->iv));
  490. case CRYPTO_CIPHER_DES:
  491. RETURN_SSL_OUTCOME(EVP_EncryptInit((EVP_CIPHER_CTX *)env->aux, EVP_des_ofb(), env->key, env->iv));
  492. case CRYPTO_CIPHER_RC4:
  493. RETURN_SSL_OUTCOME(EVP_EncryptInit((EVP_CIPHER_CTX *)env->aux, EVP_rc4(), env->key, env->iv));
  494. default:
  495. return -1;
  496. }
  497. return 0;
  498. }
  499. int crypto_cipher_decrypt_init_cipher(crypto_cipher_env_t *env)
  500. {
  501. assert(env);
  502. switch(env->type) {
  503. case CRYPTO_CIPHER_IDENTITY:
  504. RETURN_SSL_OUTCOME(EVP_DecryptInit((EVP_CIPHER_CTX *)env->aux, EVP_enc_null(), env->key, env->iv));
  505. case CRYPTO_CIPHER_DES:
  506. RETURN_SSL_OUTCOME(EVP_DecryptInit((EVP_CIPHER_CTX *)env->aux, EVP_des_ofb(), env->key, env->iv));
  507. case CRYPTO_CIPHER_RC4:
  508. RETURN_SSL_OUTCOME(EVP_DecryptInit((EVP_CIPHER_CTX *)env->aux, EVP_rc4(), env->key, env->iv));
  509. default:
  510. return -1;
  511. }
  512. return 0;
  513. }
  514. int crypto_cipher_encrypt(crypto_cipher_env_t *env, unsigned char *from, unsigned int fromlen, unsigned char *to)
  515. {
  516. int tolen;
  517. assert(env && from && to);
  518. RETURN_SSL_OUTCOME(EVP_EncryptUpdate((EVP_CIPHER_CTX *)env->aux, to, &tolen, from, fromlen));
  519. }
  520. int crypto_cipher_decrypt(crypto_cipher_env_t *env, unsigned char *from, unsigned int fromlen, unsigned char *to)
  521. {
  522. int tolen;
  523. assert(env && from && to);
  524. RETURN_SSL_OUTCOME(EVP_DecryptUpdate((EVP_CIPHER_CTX *)env->aux, to, &tolen, from, fromlen));
  525. }
  526. /* SHA-1 */
  527. int crypto_SHA_digest(unsigned char *m, int len, unsigned char *digest)
  528. {
  529. assert(m && digest);
  530. return (SHA1(m,len,digest) == NULL);
  531. }
  532. /* random numbers */
  533. int crypto_rand(unsigned int n, unsigned char *to)
  534. {
  535. assert(to);
  536. return (RAND_bytes(to, n) != 1);
  537. }
  538. int crypto_pseudo_rand(unsigned int n, unsigned char *to)
  539. {
  540. assert(to);
  541. return (RAND_pseudo_bytes(to, n) == -1);
  542. }
  543. /* errors */
  544. char *crypto_perror()
  545. {
  546. return (char *)ERR_reason_error_string(ERR_get_error());
  547. }