xref: /linux/crypto/internal.h (revision fbdae9f3e7fb57c07cb0d973f113eb25da2e8ff2)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  * Cryptographic API.
31da177e4SLinus Torvalds  *
41da177e4SLinus Torvalds  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
51da177e4SLinus Torvalds  *
61da177e4SLinus Torvalds  * This program is free software; you can redistribute it and/or modify it
71da177e4SLinus Torvalds  * under the terms of the GNU General Public License as published by the Free
81da177e4SLinus Torvalds  * Software Foundation; either version 2 of the License, or (at your option)
91da177e4SLinus Torvalds  * any later version.
101da177e4SLinus Torvalds  *
111da177e4SLinus Torvalds  */
121da177e4SLinus Torvalds #ifndef _CRYPTO_INTERNAL_H
131da177e4SLinus Torvalds #define _CRYPTO_INTERNAL_H
141da177e4SLinus Torvalds #include <linux/crypto.h>
151da177e4SLinus Torvalds #include <linux/mm.h>
161da177e4SLinus Torvalds #include <linux/highmem.h>
171da177e4SLinus Torvalds #include <linux/interrupt.h>
181da177e4SLinus Torvalds #include <linux/init.h>
19*fbdae9f3SHerbert Xu #include <linux/kernel.h>
201da177e4SLinus Torvalds #include <asm/kmap_types.h>
211da177e4SLinus Torvalds 
221da177e4SLinus Torvalds extern enum km_type crypto_km_types[];
231da177e4SLinus Torvalds 
241da177e4SLinus Torvalds static inline enum km_type crypto_kmap_type(int out)
251da177e4SLinus Torvalds {
261da177e4SLinus Torvalds 	return crypto_km_types[(in_softirq() ? 2 : 0) + out];
271da177e4SLinus Torvalds }
281da177e4SLinus Torvalds 
291da177e4SLinus Torvalds static inline void *crypto_kmap(struct page *page, int out)
301da177e4SLinus Torvalds {
311da177e4SLinus Torvalds 	return kmap_atomic(page, crypto_kmap_type(out));
321da177e4SLinus Torvalds }
331da177e4SLinus Torvalds 
341da177e4SLinus Torvalds static inline void crypto_kunmap(void *vaddr, int out)
351da177e4SLinus Torvalds {
361da177e4SLinus Torvalds 	kunmap_atomic(vaddr, crypto_kmap_type(out));
371da177e4SLinus Torvalds }
381da177e4SLinus Torvalds 
391da177e4SLinus Torvalds static inline void crypto_yield(struct crypto_tfm *tfm)
401da177e4SLinus Torvalds {
4115333038SHerbert Xu 	if (!in_atomic())
421da177e4SLinus Torvalds 		cond_resched();
431da177e4SLinus Torvalds }
441da177e4SLinus Torvalds 
451da177e4SLinus Torvalds #ifdef CONFIG_CRYPTO_HMAC
461da177e4SLinus Torvalds int crypto_alloc_hmac_block(struct crypto_tfm *tfm);
471da177e4SLinus Torvalds void crypto_free_hmac_block(struct crypto_tfm *tfm);
481da177e4SLinus Torvalds #else
491da177e4SLinus Torvalds static inline int crypto_alloc_hmac_block(struct crypto_tfm *tfm)
501da177e4SLinus Torvalds {
511da177e4SLinus Torvalds 	return 0;
521da177e4SLinus Torvalds }
531da177e4SLinus Torvalds 
541da177e4SLinus Torvalds static inline void crypto_free_hmac_block(struct crypto_tfm *tfm)
551da177e4SLinus Torvalds { }
561da177e4SLinus Torvalds #endif
571da177e4SLinus Torvalds 
581da177e4SLinus Torvalds #ifdef CONFIG_PROC_FS
591da177e4SLinus Torvalds void __init crypto_init_proc(void);
601da177e4SLinus Torvalds #else
611da177e4SLinus Torvalds static inline void crypto_init_proc(void)
621da177e4SLinus Torvalds { }
631da177e4SLinus Torvalds #endif
641da177e4SLinus Torvalds 
65*fbdae9f3SHerbert Xu static inline unsigned int crypto_digest_ctxsize(struct crypto_alg *alg,
66*fbdae9f3SHerbert Xu 						 int flags)
67*fbdae9f3SHerbert Xu {
68*fbdae9f3SHerbert Xu 	return alg->cra_ctxsize;
69*fbdae9f3SHerbert Xu }
70*fbdae9f3SHerbert Xu 
71*fbdae9f3SHerbert Xu static inline unsigned int crypto_cipher_ctxsize(struct crypto_alg *alg,
72*fbdae9f3SHerbert Xu 						 int flags)
73*fbdae9f3SHerbert Xu {
74*fbdae9f3SHerbert Xu 	unsigned int len = alg->cra_ctxsize;
75*fbdae9f3SHerbert Xu 
76*fbdae9f3SHerbert Xu 	switch (flags & CRYPTO_TFM_MODE_MASK) {
77*fbdae9f3SHerbert Xu 	case CRYPTO_TFM_MODE_CBC:
78*fbdae9f3SHerbert Xu 		len = ALIGN(len, alg->cra_alignmask + 1);
79*fbdae9f3SHerbert Xu 		len += alg->cra_blocksize;
80*fbdae9f3SHerbert Xu 		break;
81*fbdae9f3SHerbert Xu 	}
82*fbdae9f3SHerbert Xu 
83*fbdae9f3SHerbert Xu 	return len;
84*fbdae9f3SHerbert Xu }
85*fbdae9f3SHerbert Xu 
86*fbdae9f3SHerbert Xu static inline unsigned int crypto_compress_ctxsize(struct crypto_alg *alg,
87*fbdae9f3SHerbert Xu 						   int flags)
88*fbdae9f3SHerbert Xu {
89*fbdae9f3SHerbert Xu 	return alg->cra_ctxsize;
90*fbdae9f3SHerbert Xu }
91*fbdae9f3SHerbert Xu 
921da177e4SLinus Torvalds int crypto_init_digest_flags(struct crypto_tfm *tfm, u32 flags);
931da177e4SLinus Torvalds int crypto_init_cipher_flags(struct crypto_tfm *tfm, u32 flags);
941da177e4SLinus Torvalds int crypto_init_compress_flags(struct crypto_tfm *tfm, u32 flags);
951da177e4SLinus Torvalds 
961da177e4SLinus Torvalds int crypto_init_digest_ops(struct crypto_tfm *tfm);
971da177e4SLinus Torvalds int crypto_init_cipher_ops(struct crypto_tfm *tfm);
981da177e4SLinus Torvalds int crypto_init_compress_ops(struct crypto_tfm *tfm);
991da177e4SLinus Torvalds 
1001da177e4SLinus Torvalds void crypto_exit_digest_ops(struct crypto_tfm *tfm);
1011da177e4SLinus Torvalds void crypto_exit_cipher_ops(struct crypto_tfm *tfm);
1021da177e4SLinus Torvalds void crypto_exit_compress_ops(struct crypto_tfm *tfm);
1031da177e4SLinus Torvalds 
1041da177e4SLinus Torvalds #endif	/* _CRYPTO_INTERNAL_H */
1051da177e4SLinus Torvalds 
106