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