xref: /openbmc/linux/crypto/internal.h (revision 64baf3cf)
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>
19fbdae9f3SHerbert Xu #include <linux/kernel.h>
2064baf3cfSHerbert Xu #include <linux/slab.h>
211da177e4SLinus Torvalds #include <asm/kmap_types.h>
221da177e4SLinus Torvalds 
231da177e4SLinus Torvalds extern enum km_type crypto_km_types[];
241da177e4SLinus Torvalds 
251da177e4SLinus Torvalds static inline enum km_type crypto_kmap_type(int out)
261da177e4SLinus Torvalds {
271da177e4SLinus Torvalds 	return crypto_km_types[(in_softirq() ? 2 : 0) + out];
281da177e4SLinus Torvalds }
291da177e4SLinus Torvalds 
301da177e4SLinus Torvalds static inline void *crypto_kmap(struct page *page, int out)
311da177e4SLinus Torvalds {
321da177e4SLinus Torvalds 	return kmap_atomic(page, crypto_kmap_type(out));
331da177e4SLinus Torvalds }
341da177e4SLinus Torvalds 
351da177e4SLinus Torvalds static inline void crypto_kunmap(void *vaddr, int out)
361da177e4SLinus Torvalds {
371da177e4SLinus Torvalds 	kunmap_atomic(vaddr, crypto_kmap_type(out));
381da177e4SLinus Torvalds }
391da177e4SLinus Torvalds 
401da177e4SLinus Torvalds static inline void crypto_yield(struct crypto_tfm *tfm)
411da177e4SLinus Torvalds {
4264baf3cfSHerbert Xu 	if (tfm->crt_flags & CRYPTO_TFM_REQ_MAY_SLEEP)
431da177e4SLinus Torvalds 		cond_resched();
441da177e4SLinus Torvalds }
451da177e4SLinus Torvalds 
461da177e4SLinus Torvalds #ifdef CONFIG_CRYPTO_HMAC
471da177e4SLinus Torvalds int crypto_alloc_hmac_block(struct crypto_tfm *tfm);
481da177e4SLinus Torvalds void crypto_free_hmac_block(struct crypto_tfm *tfm);
491da177e4SLinus Torvalds #else
501da177e4SLinus Torvalds static inline int crypto_alloc_hmac_block(struct crypto_tfm *tfm)
511da177e4SLinus Torvalds {
521da177e4SLinus Torvalds 	return 0;
531da177e4SLinus Torvalds }
541da177e4SLinus Torvalds 
551da177e4SLinus Torvalds static inline void crypto_free_hmac_block(struct crypto_tfm *tfm)
561da177e4SLinus Torvalds { }
571da177e4SLinus Torvalds #endif
581da177e4SLinus Torvalds 
591da177e4SLinus Torvalds #ifdef CONFIG_PROC_FS
601da177e4SLinus Torvalds void __init crypto_init_proc(void);
611da177e4SLinus Torvalds #else
621da177e4SLinus Torvalds static inline void crypto_init_proc(void)
631da177e4SLinus Torvalds { }
641da177e4SLinus Torvalds #endif
651da177e4SLinus Torvalds 
66fbdae9f3SHerbert Xu static inline unsigned int crypto_digest_ctxsize(struct crypto_alg *alg,
67fbdae9f3SHerbert Xu 						 int flags)
68fbdae9f3SHerbert Xu {
69fbdae9f3SHerbert Xu 	return alg->cra_ctxsize;
70fbdae9f3SHerbert Xu }
71fbdae9f3SHerbert Xu 
72fbdae9f3SHerbert Xu static inline unsigned int crypto_cipher_ctxsize(struct crypto_alg *alg,
73fbdae9f3SHerbert Xu 						 int flags)
74fbdae9f3SHerbert Xu {
75fbdae9f3SHerbert Xu 	unsigned int len = alg->cra_ctxsize;
76fbdae9f3SHerbert Xu 
77fbdae9f3SHerbert Xu 	switch (flags & CRYPTO_TFM_MODE_MASK) {
78fbdae9f3SHerbert Xu 	case CRYPTO_TFM_MODE_CBC:
799d853c37SHerbert Xu 		len = ALIGN(len, (unsigned long)alg->cra_alignmask + 1);
80fbdae9f3SHerbert Xu 		len += alg->cra_blocksize;
81fbdae9f3SHerbert Xu 		break;
82fbdae9f3SHerbert Xu 	}
83fbdae9f3SHerbert Xu 
84fbdae9f3SHerbert Xu 	return len;
85fbdae9f3SHerbert Xu }
86fbdae9f3SHerbert Xu 
87fbdae9f3SHerbert Xu static inline unsigned int crypto_compress_ctxsize(struct crypto_alg *alg,
88fbdae9f3SHerbert Xu 						   int flags)
89fbdae9f3SHerbert Xu {
90fbdae9f3SHerbert Xu 	return alg->cra_ctxsize;
91fbdae9f3SHerbert Xu }
92fbdae9f3SHerbert Xu 
931da177e4SLinus Torvalds int crypto_init_digest_flags(struct crypto_tfm *tfm, u32 flags);
941da177e4SLinus Torvalds int crypto_init_cipher_flags(struct crypto_tfm *tfm, u32 flags);
951da177e4SLinus Torvalds int crypto_init_compress_flags(struct crypto_tfm *tfm, u32 flags);
961da177e4SLinus Torvalds 
971da177e4SLinus Torvalds int crypto_init_digest_ops(struct crypto_tfm *tfm);
981da177e4SLinus Torvalds int crypto_init_cipher_ops(struct crypto_tfm *tfm);
991da177e4SLinus Torvalds int crypto_init_compress_ops(struct crypto_tfm *tfm);
1001da177e4SLinus Torvalds 
1011da177e4SLinus Torvalds void crypto_exit_digest_ops(struct crypto_tfm *tfm);
1021da177e4SLinus Torvalds void crypto_exit_cipher_ops(struct crypto_tfm *tfm);
1031da177e4SLinus Torvalds void crypto_exit_compress_ops(struct crypto_tfm *tfm);
1041da177e4SLinus Torvalds 
1051da177e4SLinus Torvalds #endif	/* _CRYPTO_INTERNAL_H */
1061da177e4SLinus Torvalds 
107