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