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