hostap_crypt.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /*
  2. * Host AP crypto routines
  3. *
  4. * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License version 2 as
  8. * published by the Free Software Foundation. See README and COPYING for
  9. * more details.
  10. */
  11. struct hostap_crypto_alg {
  12. struct list_head list;
  13. struct hostap_crypto_ops *ops;
  14. };
  15. struct hostap_crypto {
  16. struct list_head algs;
  17. spinlock_t lock;
  18. };
  19. static struct hostap_crypto *hcrypt;
  20. int hostap_register_crypto_ops(struct hostap_crypto_ops *ops)
  21. {
  22. unsigned long flags;
  23. struct hostap_crypto_alg *alg;
  24. if (hcrypt == NULL)
  25. return -1;
  26. alg = (struct hostap_crypto_alg *) kmalloc(sizeof(*alg), GFP_KERNEL);
  27. if (alg == NULL)
  28. return -ENOMEM;
  29. memset(alg, 0, sizeof(*alg));
  30. alg->ops = ops;
  31. spin_lock_irqsave(&hcrypt->lock, flags);
  32. list_add(&alg->list, &hcrypt->algs);
  33. spin_unlock_irqrestore(&hcrypt->lock, flags);
  34. printk(KERN_DEBUG "hostap_crypt: registered algorithm '%s'\n",
  35. ops->name);
  36. return 0;
  37. }
  38. int hostap_unregister_crypto_ops(struct hostap_crypto_ops *ops)
  39. {
  40. unsigned long flags;
  41. struct list_head *ptr;
  42. struct hostap_crypto_alg *del_alg = NULL;
  43. if (hcrypt == NULL)
  44. return -1;
  45. spin_lock_irqsave(&hcrypt->lock, flags);
  46. for (ptr = hcrypt->algs.next; ptr != &hcrypt->algs; ptr = ptr->next) {
  47. struct hostap_crypto_alg *alg =
  48. (struct hostap_crypto_alg *) ptr;
  49. if (alg->ops == ops) {
  50. list_del(&alg->list);
  51. del_alg = alg;
  52. break;
  53. }
  54. }
  55. spin_unlock_irqrestore(&hcrypt->lock, flags);
  56. if (del_alg) {
  57. printk(KERN_DEBUG "hostap_crypt: unregistered algorithm "
  58. "'%s'\n", ops->name);
  59. kfree(del_alg);
  60. }
  61. return del_alg ? 0 : -1;
  62. }
  63. struct hostap_crypto_ops * hostap_get_crypto_ops(const char *name)
  64. {
  65. unsigned long flags;
  66. struct list_head *ptr;
  67. struct hostap_crypto_alg *found_alg = NULL;
  68. if (hcrypt == NULL)
  69. return NULL;
  70. spin_lock_irqsave(&hcrypt->lock, flags);
  71. for (ptr = hcrypt->algs.next; ptr != &hcrypt->algs; ptr = ptr->next) {
  72. struct hostap_crypto_alg *alg =
  73. (struct hostap_crypto_alg *) ptr;
  74. if (strcmp(alg->ops->name, name) == 0) {
  75. found_alg = alg;
  76. break;
  77. }
  78. }
  79. spin_unlock_irqrestore(&hcrypt->lock, flags);
  80. if (found_alg)
  81. return found_alg->ops;
  82. else
  83. return NULL;
  84. }
  85. static void * hostap_crypt_null_init(int keyidx) { return (void *) 1; }
  86. static void hostap_crypt_null_deinit(void *priv) {}
  87. static struct hostap_crypto_ops hostap_crypt_null = {
  88. .name = "NULL",
  89. .init = hostap_crypt_null_init,
  90. .deinit = hostap_crypt_null_deinit,
  91. .encrypt_mpdu = NULL,
  92. .decrypt_mpdu = NULL,
  93. .encrypt_msdu = NULL,
  94. .decrypt_msdu = NULL,
  95. .set_key = NULL,
  96. .get_key = NULL,
  97. .extra_prefix_len = 0,
  98. .extra_postfix_len = 0
  99. };
  100. static int __init hostap_crypto_init(void)
  101. {
  102. hcrypt = (struct hostap_crypto *) kmalloc(sizeof(*hcrypt), GFP_KERNEL);
  103. if (hcrypt == NULL)
  104. return -ENOMEM;
  105. memset(hcrypt, 0, sizeof(*hcrypt));
  106. INIT_LIST_HEAD(&hcrypt->algs);
  107. spin_lock_init(&hcrypt->lock);
  108. (void) hostap_register_crypto_ops(&hostap_crypt_null);
  109. return 0;
  110. }
  111. static void __exit hostap_crypto_deinit(void)
  112. {
  113. struct list_head *ptr, *n;
  114. if (hcrypt == NULL)
  115. return;
  116. for (ptr = hcrypt->algs.next, n = ptr->next; ptr != &hcrypt->algs;
  117. ptr = n, n = ptr->next) {
  118. struct hostap_crypto_alg *alg =
  119. (struct hostap_crypto_alg *) ptr;
  120. list_del(ptr);
  121. printk(KERN_DEBUG "hostap_crypt: unregistered algorithm "
  122. "'%s' (deinit)\n", alg->ops->name);
  123. kfree(alg);
  124. }
  125. kfree(hcrypt);
  126. }
  127. EXPORT_SYMBOL(hostap_register_crypto_ops);
  128. EXPORT_SYMBOL(hostap_unregister_crypto_ops);
  129. EXPORT_SYMBOL(hostap_get_crypto_ops);