xref: /linux/crypto/internal.h (revision 5cb1454b862ab3040b78364d58330262fea1ddba)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  * Cryptographic API.
31da177e4SLinus Torvalds  *
41da177e4SLinus Torvalds  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
5*5cb1454bSHerbert Xu  * Copyright (c) 2005 Herbert Xu <herbert@gondor.apana.org.au>
61da177e4SLinus Torvalds  *
71da177e4SLinus Torvalds  * This program is free software; you can redistribute it and/or modify it
81da177e4SLinus Torvalds  * under the terms of the GNU General Public License as published by the Free
91da177e4SLinus Torvalds  * Software Foundation; either version 2 of the License, or (at your option)
101da177e4SLinus Torvalds  * any later version.
111da177e4SLinus Torvalds  *
121da177e4SLinus Torvalds  */
131da177e4SLinus Torvalds #ifndef _CRYPTO_INTERNAL_H
141da177e4SLinus Torvalds #define _CRYPTO_INTERNAL_H
151da177e4SLinus Torvalds #include <linux/crypto.h>
161da177e4SLinus Torvalds #include <linux/mm.h>
171da177e4SLinus Torvalds #include <linux/highmem.h>
181da177e4SLinus Torvalds #include <linux/interrupt.h>
191da177e4SLinus Torvalds #include <linux/init.h>
20*5cb1454bSHerbert Xu #include <linux/list.h>
21fbdae9f3SHerbert Xu #include <linux/kernel.h>
22*5cb1454bSHerbert Xu #include <linux/rwsem.h>
2364baf3cfSHerbert Xu #include <linux/slab.h>
241da177e4SLinus Torvalds #include <asm/kmap_types.h>
251da177e4SLinus Torvalds 
26*5cb1454bSHerbert Xu extern struct list_head crypto_alg_list;
27*5cb1454bSHerbert Xu extern struct rw_semaphore crypto_alg_sem;
28*5cb1454bSHerbert Xu 
291da177e4SLinus Torvalds extern enum km_type crypto_km_types[];
301da177e4SLinus Torvalds 
311da177e4SLinus Torvalds static inline enum km_type crypto_kmap_type(int out)
321da177e4SLinus Torvalds {
331da177e4SLinus Torvalds 	return crypto_km_types[(in_softirq() ? 2 : 0) + out];
341da177e4SLinus Torvalds }
351da177e4SLinus Torvalds 
361da177e4SLinus Torvalds static inline void *crypto_kmap(struct page *page, int out)
371da177e4SLinus Torvalds {
381da177e4SLinus Torvalds 	return kmap_atomic(page, crypto_kmap_type(out));
391da177e4SLinus Torvalds }
401da177e4SLinus Torvalds 
411da177e4SLinus Torvalds static inline void crypto_kunmap(void *vaddr, int out)
421da177e4SLinus Torvalds {
431da177e4SLinus Torvalds 	kunmap_atomic(vaddr, crypto_kmap_type(out));
441da177e4SLinus Torvalds }
451da177e4SLinus Torvalds 
461da177e4SLinus Torvalds static inline void crypto_yield(struct crypto_tfm *tfm)
471da177e4SLinus Torvalds {
4864baf3cfSHerbert Xu 	if (tfm->crt_flags & CRYPTO_TFM_REQ_MAY_SLEEP)
491da177e4SLinus Torvalds 		cond_resched();
501da177e4SLinus Torvalds }
511da177e4SLinus Torvalds 
521da177e4SLinus Torvalds #ifdef CONFIG_CRYPTO_HMAC
531da177e4SLinus Torvalds int crypto_alloc_hmac_block(struct crypto_tfm *tfm);
541da177e4SLinus Torvalds void crypto_free_hmac_block(struct crypto_tfm *tfm);
551da177e4SLinus Torvalds #else
561da177e4SLinus Torvalds static inline int crypto_alloc_hmac_block(struct crypto_tfm *tfm)
571da177e4SLinus Torvalds {
581da177e4SLinus Torvalds 	return 0;
591da177e4SLinus Torvalds }
601da177e4SLinus Torvalds 
611da177e4SLinus Torvalds static inline void crypto_free_hmac_block(struct crypto_tfm *tfm)
621da177e4SLinus Torvalds { }
631da177e4SLinus Torvalds #endif
641da177e4SLinus Torvalds 
651da177e4SLinus Torvalds #ifdef CONFIG_PROC_FS
661da177e4SLinus Torvalds void __init crypto_init_proc(void);
671da177e4SLinus Torvalds #else
681da177e4SLinus Torvalds static inline void crypto_init_proc(void)
691da177e4SLinus Torvalds { }
701da177e4SLinus Torvalds #endif
711da177e4SLinus Torvalds 
72fbdae9f3SHerbert Xu static inline unsigned int crypto_digest_ctxsize(struct crypto_alg *alg,
73fbdae9f3SHerbert Xu 						 int flags)
74fbdae9f3SHerbert Xu {
75fbdae9f3SHerbert Xu 	return alg->cra_ctxsize;
76fbdae9f3SHerbert Xu }
77fbdae9f3SHerbert Xu 
78fbdae9f3SHerbert Xu static inline unsigned int crypto_cipher_ctxsize(struct crypto_alg *alg,
79fbdae9f3SHerbert Xu 						 int flags)
80fbdae9f3SHerbert Xu {
81fbdae9f3SHerbert Xu 	unsigned int len = alg->cra_ctxsize;
82fbdae9f3SHerbert Xu 
83fbdae9f3SHerbert Xu 	switch (flags & CRYPTO_TFM_MODE_MASK) {
84fbdae9f3SHerbert Xu 	case CRYPTO_TFM_MODE_CBC:
859d853c37SHerbert Xu 		len = ALIGN(len, (unsigned long)alg->cra_alignmask + 1);
86fbdae9f3SHerbert Xu 		len += alg->cra_blocksize;
87fbdae9f3SHerbert Xu 		break;
88fbdae9f3SHerbert Xu 	}
89fbdae9f3SHerbert Xu 
90fbdae9f3SHerbert Xu 	return len;
91fbdae9f3SHerbert Xu }
92fbdae9f3SHerbert Xu 
93fbdae9f3SHerbert Xu static inline unsigned int crypto_compress_ctxsize(struct crypto_alg *alg,
94fbdae9f3SHerbert Xu 						   int flags)
95fbdae9f3SHerbert Xu {
96fbdae9f3SHerbert Xu 	return alg->cra_ctxsize;
97fbdae9f3SHerbert Xu }
98fbdae9f3SHerbert Xu 
991da177e4SLinus Torvalds int crypto_init_digest_flags(struct crypto_tfm *tfm, u32 flags);
1001da177e4SLinus Torvalds int crypto_init_cipher_flags(struct crypto_tfm *tfm, u32 flags);
1011da177e4SLinus Torvalds int crypto_init_compress_flags(struct crypto_tfm *tfm, u32 flags);
1021da177e4SLinus Torvalds 
1031da177e4SLinus Torvalds int crypto_init_digest_ops(struct crypto_tfm *tfm);
1041da177e4SLinus Torvalds int crypto_init_cipher_ops(struct crypto_tfm *tfm);
1051da177e4SLinus Torvalds int crypto_init_compress_ops(struct crypto_tfm *tfm);
1061da177e4SLinus Torvalds 
1071da177e4SLinus Torvalds void crypto_exit_digest_ops(struct crypto_tfm *tfm);
1081da177e4SLinus Torvalds void crypto_exit_cipher_ops(struct crypto_tfm *tfm);
1091da177e4SLinus Torvalds void crypto_exit_compress_ops(struct crypto_tfm *tfm);
1101da177e4SLinus Torvalds 
1111da177e4SLinus Torvalds #endif	/* _CRYPTO_INTERNAL_H */
1121da177e4SLinus Torvalds 
113