2 * Host AP crypto routines
4 * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
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
12 struct hostap_crypto_alg
{
13 struct list_head list
;
14 struct hostap_crypto_ops
*ops
;
18 struct hostap_crypto
{
19 struct list_head algs
;
23 static struct hostap_crypto
*hcrypt
;
26 int hostap_register_crypto_ops(struct hostap_crypto_ops
*ops
)
29 struct hostap_crypto_alg
*alg
;
34 alg
= (struct hostap_crypto_alg
*) kmalloc(sizeof(*alg
), GFP_KERNEL
);
38 memset(alg
, 0, sizeof(*alg
));
41 spin_lock_irqsave(&hcrypt
->lock
, flags
);
42 list_add(&alg
->list
, &hcrypt
->algs
);
43 spin_unlock_irqrestore(&hcrypt
->lock
, flags
);
45 printk(KERN_DEBUG
"hostap_crypt: registered algorithm '%s'\n",
52 int hostap_unregister_crypto_ops(struct hostap_crypto_ops
*ops
)
55 struct list_head
*ptr
;
56 struct hostap_crypto_alg
*del_alg
= NULL
;
61 spin_lock_irqsave(&hcrypt
->lock
, flags
);
62 for (ptr
= hcrypt
->algs
.next
; ptr
!= &hcrypt
->algs
; ptr
= ptr
->next
) {
63 struct hostap_crypto_alg
*alg
=
64 (struct hostap_crypto_alg
*) ptr
;
65 if (alg
->ops
== ops
) {
71 spin_unlock_irqrestore(&hcrypt
->lock
, flags
);
74 printk(KERN_DEBUG
"hostap_crypt: unregistered algorithm "
79 return del_alg
? 0 : -1;
83 struct hostap_crypto_ops
* hostap_get_crypto_ops(const char *name
)
86 struct list_head
*ptr
;
87 struct hostap_crypto_alg
*found_alg
= NULL
;
92 spin_lock_irqsave(&hcrypt
->lock
, flags
);
93 for (ptr
= hcrypt
->algs
.next
; ptr
!= &hcrypt
->algs
; ptr
= ptr
->next
) {
94 struct hostap_crypto_alg
*alg
=
95 (struct hostap_crypto_alg
*) ptr
;
96 if (strcmp(alg
->ops
->name
, name
) == 0) {
101 spin_unlock_irqrestore(&hcrypt
->lock
, flags
);
104 return found_alg
->ops
;
110 static void * hostap_crypt_null_init(int keyidx
) { return (void *) 1; }
111 static void hostap_crypt_null_deinit(void *priv
) {}
113 static struct hostap_crypto_ops hostap_crypt_null
= {
115 .init
= hostap_crypt_null_init
,
116 .deinit
= hostap_crypt_null_deinit
,
117 .encrypt_mpdu
= NULL
,
118 .decrypt_mpdu
= NULL
,
119 .encrypt_msdu
= NULL
,
120 .decrypt_msdu
= NULL
,
123 .extra_prefix_len
= 0,
124 .extra_postfix_len
= 0
128 static int __init
hostap_crypto_init(void)
130 hcrypt
= (struct hostap_crypto
*) kmalloc(sizeof(*hcrypt
), GFP_KERNEL
);
134 memset(hcrypt
, 0, sizeof(*hcrypt
));
135 INIT_LIST_HEAD(&hcrypt
->algs
);
136 spin_lock_init(&hcrypt
->lock
);
138 (void) hostap_register_crypto_ops(&hostap_crypt_null
);
144 static void __exit
hostap_crypto_deinit(void)
146 struct list_head
*ptr
, *n
;
151 for (ptr
= hcrypt
->algs
.next
, n
= ptr
->next
; ptr
!= &hcrypt
->algs
;
152 ptr
= n
, n
= ptr
->next
) {
153 struct hostap_crypto_alg
*alg
=
154 (struct hostap_crypto_alg
*) ptr
;
156 printk(KERN_DEBUG
"hostap_crypt: unregistered algorithm "
157 "'%s' (deinit)\n", alg
->ops
->name
);
165 EXPORT_SYMBOL(hostap_register_crypto_ops
);
166 EXPORT_SYMBOL(hostap_unregister_crypto_ops
);
167 EXPORT_SYMBOL(hostap_get_crypto_ops
);