linux/include/linux/crypto.h
<<
>>
Prefs
   1/*
   2 * Scatterlist Cryptographic API.
   3 *
   4 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
   5 * Copyright (c) 2002 David S. Miller (davem@redhat.com)
   6 * Copyright (c) 2005 Herbert Xu <herbert@gondor.apana.org.au>
   7 *
   8 * Portions derived from Cryptoapi, by Alexander Kjeldaas <astor@fast.no>
   9 * and Nettle, by Niels Möller.
  10 * 
  11 * This program is free software; you can redistribute it and/or modify it
  12 * under the terms of the GNU General Public License as published by the Free
  13 * Software Foundation; either version 2 of the License, or (at your option) 
  14 * any later version.
  15 *
  16 */
  17#ifndef _LINUX_CRYPTO_H
  18#define _LINUX_CRYPTO_H
  19
  20#include <asm/atomic.h>
  21#include <linux/module.h>
  22#include <linux/kernel.h>
  23#include <linux/list.h>
  24#include <linux/slab.h>
  25#include <linux/string.h>
  26#include <linux/uaccess.h>
  27
  28/*
  29 * Algorithm masks and types.
  30 */
  31#define CRYPTO_ALG_TYPE_MASK            0x0000000f
  32#define CRYPTO_ALG_TYPE_CIPHER          0x00000001
  33#define CRYPTO_ALG_TYPE_COMPRESS        0x00000002
  34#define CRYPTO_ALG_TYPE_AEAD            0x00000003
  35#define CRYPTO_ALG_TYPE_BLKCIPHER       0x00000004
  36#define CRYPTO_ALG_TYPE_ABLKCIPHER      0x00000005
  37#define CRYPTO_ALG_TYPE_GIVCIPHER       0x00000006
  38#define CRYPTO_ALG_TYPE_DIGEST          0x00000008
  39#define CRYPTO_ALG_TYPE_HASH            0x00000008
  40#define CRYPTO_ALG_TYPE_SHASH           0x00000009
  41#define CRYPTO_ALG_TYPE_AHASH           0x0000000a
  42#define CRYPTO_ALG_TYPE_RNG             0x0000000c
  43#define CRYPTO_ALG_TYPE_PCOMPRESS       0x0000000f
  44
  45#define CRYPTO_ALG_TYPE_HASH_MASK       0x0000000e
  46#define CRYPTO_ALG_TYPE_AHASH_MASK      0x0000000c
  47#define CRYPTO_ALG_TYPE_BLKCIPHER_MASK  0x0000000c
  48
  49#define CRYPTO_ALG_LARVAL               0x00000010
  50#define CRYPTO_ALG_DEAD                 0x00000020
  51#define CRYPTO_ALG_DYING                0x00000040
  52#define CRYPTO_ALG_ASYNC                0x00000080
  53
  54/*
  55 * Set this bit if and only if the algorithm requires another algorithm of
  56 * the same type to handle corner cases.
  57 */
  58#define CRYPTO_ALG_NEED_FALLBACK        0x00000100
  59
  60/*
  61 * This bit is set for symmetric key ciphers that have already been wrapped
  62 * with a generic IV generator to prevent them from being wrapped again.
  63 */
  64#define CRYPTO_ALG_GENIV                0x00000200
  65
  66/*
  67 * Set if the algorithm has passed automated run-time testing.  Note that
  68 * if there is no run-time testing for a given algorithm it is considered
  69 * to have passed.
  70 */
  71
  72#define CRYPTO_ALG_TESTED               0x00000400
  73
  74/*
  75 * Transform masks and values (for crt_flags).
  76 */
  77#define CRYPTO_TFM_REQ_MASK             0x000fff00
  78#define CRYPTO_TFM_RES_MASK             0xfff00000
  79
  80#define CRYPTO_TFM_REQ_WEAK_KEY         0x00000100
  81#define CRYPTO_TFM_REQ_MAY_SLEEP        0x00000200
  82#define CRYPTO_TFM_REQ_MAY_BACKLOG      0x00000400
  83#define CRYPTO_TFM_RES_WEAK_KEY         0x00100000
  84#define CRYPTO_TFM_RES_BAD_KEY_LEN      0x00200000
  85#define CRYPTO_TFM_RES_BAD_KEY_SCHED    0x00400000
  86#define CRYPTO_TFM_RES_BAD_BLOCK_LEN    0x00800000
  87#define CRYPTO_TFM_RES_BAD_FLAGS        0x01000000
  88
  89/*
  90 * Miscellaneous stuff.
  91 */
  92#define CRYPTO_MAX_ALG_NAME             64
  93
  94/*
  95 * The macro CRYPTO_MINALIGN_ATTR (along with the void * type in the actual
  96 * declaration) is used to ensure that the crypto_tfm context structure is
  97 * aligned correctly for the given architecture so that there are no alignment
  98 * faults for C data types.  In particular, this is required on platforms such
  99 * as arm where pointers are 32-bit aligned but there are data types such as
 100 * u64 which require 64-bit alignment.
 101 */
 102#if defined(ARCH_KMALLOC_MINALIGN)
 103#define CRYPTO_MINALIGN ARCH_KMALLOC_MINALIGN
 104#elif defined(ARCH_SLAB_MINALIGN)
 105#define CRYPTO_MINALIGN ARCH_SLAB_MINALIGN
 106#else
 107#define CRYPTO_MINALIGN __alignof__(unsigned long long)
 108#endif
 109
 110#define CRYPTO_MINALIGN_ATTR __attribute__ ((__aligned__(CRYPTO_MINALIGN)))
 111
 112struct scatterlist;
 113struct crypto_ablkcipher;
 114struct crypto_async_request;
 115struct crypto_aead;
 116struct crypto_blkcipher;
 117struct crypto_hash;
 118struct crypto_rng;
 119struct crypto_tfm;
 120struct crypto_type;
 121struct aead_givcrypt_request;
 122struct skcipher_givcrypt_request;
 123
 124typedef void (*crypto_completion_t)(struct crypto_async_request *req, int err);
 125
 126struct crypto_async_request {
 127        struct list_head list;
 128        crypto_completion_t complete;
 129        void *data;
 130        struct crypto_tfm *tfm;
 131
 132        u32 flags;
 133};
 134
 135struct ablkcipher_request {
 136        struct crypto_async_request base;
 137
 138        unsigned int nbytes;
 139
 140        void *info;
 141
 142        struct scatterlist *src;
 143        struct scatterlist *dst;
 144
 145        void *__ctx[] CRYPTO_MINALIGN_ATTR;
 146};
 147
 148/**
 149 *      struct aead_request - AEAD request
 150 *      @base: Common attributes for async crypto requests
 151 *      @assoclen: Length in bytes of associated data for authentication
 152 *      @cryptlen: Length of data to be encrypted or decrypted
 153 *      @iv: Initialisation vector
 154 *      @assoc: Associated data
 155 *      @src: Source data
 156 *      @dst: Destination data
 157 *      @__ctx: Start of private context data
 158 */
 159struct aead_request {
 160        struct crypto_async_request base;
 161
 162        unsigned int assoclen;
 163        unsigned int cryptlen;
 164
 165        u8 *iv;
 166
 167        struct scatterlist *assoc;
 168        struct scatterlist *src;
 169        struct scatterlist *dst;
 170
 171        void *__ctx[] CRYPTO_MINALIGN_ATTR;
 172};
 173
 174struct blkcipher_desc {
 175        struct crypto_blkcipher *tfm;
 176        void *info;
 177        u32 flags;
 178};
 179
 180struct cipher_desc {
 181        struct crypto_tfm *tfm;
 182        void (*crfn)(struct crypto_tfm *tfm, u8 *dst, const u8 *src);
 183        unsigned int (*prfn)(const struct cipher_desc *desc, u8 *dst,
 184                             const u8 *src, unsigned int nbytes);
 185        void *info;
 186};
 187
 188struct hash_desc {
 189        struct crypto_hash *tfm;
 190        u32 flags;
 191};
 192
 193/*
 194 * Algorithms: modular crypto algorithm implementations, managed
 195 * via crypto_register_alg() and crypto_unregister_alg().
 196 */
 197struct ablkcipher_alg {
 198        int (*setkey)(struct crypto_ablkcipher *tfm, const u8 *key,
 199                      unsigned int keylen);
 200        int (*encrypt)(struct ablkcipher_request *req);
 201        int (*decrypt)(struct ablkcipher_request *req);
 202        int (*givencrypt)(struct skcipher_givcrypt_request *req);
 203        int (*givdecrypt)(struct skcipher_givcrypt_request *req);
 204
 205        const char *geniv;
 206
 207        unsigned int min_keysize;
 208        unsigned int max_keysize;
 209        unsigned int ivsize;
 210};
 211
 212struct aead_alg {
 213        int (*setkey)(struct crypto_aead *tfm, const u8 *key,
 214                      unsigned int keylen);
 215        int (*setauthsize)(struct crypto_aead *tfm, unsigned int authsize);
 216        int (*encrypt)(struct aead_request *req);
 217        int (*decrypt)(struct aead_request *req);
 218        int (*givencrypt)(struct aead_givcrypt_request *req);
 219        int (*givdecrypt)(struct aead_givcrypt_request *req);
 220
 221        const char *geniv;
 222
 223        unsigned int ivsize;
 224        unsigned int maxauthsize;
 225};
 226
 227struct blkcipher_alg {
 228        int (*setkey)(struct crypto_tfm *tfm, const u8 *key,
 229                      unsigned int keylen);
 230        int (*encrypt)(struct blkcipher_desc *desc,
 231                       struct scatterlist *dst, struct scatterlist *src,
 232                       unsigned int nbytes);
 233        int (*decrypt)(struct blkcipher_desc *desc,
 234                       struct scatterlist *dst, struct scatterlist *src,
 235                       unsigned int nbytes);
 236
 237        const char *geniv;
 238
 239        unsigned int min_keysize;
 240        unsigned int max_keysize;
 241        unsigned int ivsize;
 242};
 243
 244struct cipher_alg {
 245        unsigned int cia_min_keysize;
 246        unsigned int cia_max_keysize;
 247        int (*cia_setkey)(struct crypto_tfm *tfm, const u8 *key,
 248                          unsigned int keylen);
 249        void (*cia_encrypt)(struct crypto_tfm *tfm, u8 *dst, const u8 *src);
 250        void (*cia_decrypt)(struct crypto_tfm *tfm, u8 *dst, const u8 *src);
 251};
 252
 253struct compress_alg {
 254        int (*coa_compress)(struct crypto_tfm *tfm, const u8 *src,
 255                            unsigned int slen, u8 *dst, unsigned int *dlen);
 256        int (*coa_decompress)(struct crypto_tfm *tfm, const u8 *src,
 257                              unsigned int slen, u8 *dst, unsigned int *dlen);
 258};
 259
 260struct rng_alg {
 261        int (*rng_make_random)(struct crypto_rng *tfm, u8 *rdata,
 262                               unsigned int dlen);
 263        int (*rng_reset)(struct crypto_rng *tfm, u8 *seed, unsigned int slen);
 264
 265        unsigned int seedsize;
 266};
 267
 268
 269#define cra_ablkcipher  cra_u.ablkcipher
 270#define cra_aead        cra_u.aead
 271#define cra_blkcipher   cra_u.blkcipher
 272#define cra_cipher      cra_u.cipher
 273#define cra_compress    cra_u.compress
 274#define cra_rng         cra_u.rng
 275
 276struct crypto_alg {
 277        struct list_head cra_list;
 278        struct list_head cra_users;
 279
 280        u32 cra_flags;
 281        unsigned int cra_blocksize;
 282        unsigned int cra_ctxsize;
 283        unsigned int cra_alignmask;
 284
 285        int cra_priority;
 286        atomic_t cra_refcnt;
 287
 288        char cra_name[CRYPTO_MAX_ALG_NAME];
 289        char cra_driver_name[CRYPTO_MAX_ALG_NAME];
 290
 291        const struct crypto_type *cra_type;
 292
 293        union {
 294                struct ablkcipher_alg ablkcipher;
 295                struct aead_alg aead;
 296                struct blkcipher_alg blkcipher;
 297                struct cipher_alg cipher;
 298                struct compress_alg compress;
 299                struct rng_alg rng;
 300        } cra_u;
 301
 302        int (*cra_init)(struct crypto_tfm *tfm);
 303        void (*cra_exit)(struct crypto_tfm *tfm);
 304        void (*cra_destroy)(struct crypto_alg *alg);
 305        
 306        struct module *cra_module;
 307};
 308
 309/*
 310 * Algorithm registration interface.
 311 */
 312int crypto_register_alg(struct crypto_alg *alg);
 313int crypto_unregister_alg(struct crypto_alg *alg);
 314
 315/*
 316 * Algorithm query interface.
 317 */
 318int crypto_has_alg(const char *name, u32 type, u32 mask);
 319
 320/*
 321 * Transforms: user-instantiated objects which encapsulate algorithms
 322 * and core processing logic.  Managed via crypto_alloc_*() and
 323 * crypto_free_*(), as well as the various helpers below.
 324 */
 325
 326struct ablkcipher_tfm {
 327        int (*setkey)(struct crypto_ablkcipher *tfm, const u8 *key,
 328                      unsigned int keylen);
 329        int (*encrypt)(struct ablkcipher_request *req);
 330        int (*decrypt)(struct ablkcipher_request *req);
 331        int (*givencrypt)(struct skcipher_givcrypt_request *req);
 332        int (*givdecrypt)(struct skcipher_givcrypt_request *req);
 333
 334        struct crypto_ablkcipher *base;
 335
 336        unsigned int ivsize;
 337        unsigned int reqsize;
 338};
 339
 340struct aead_tfm {
 341        int (*setkey)(struct crypto_aead *tfm, const u8 *key,
 342                      unsigned int keylen);
 343        int (*encrypt)(struct aead_request *req);
 344        int (*decrypt)(struct aead_request *req);
 345        int (*givencrypt)(struct aead_givcrypt_request *req);
 346        int (*givdecrypt)(struct aead_givcrypt_request *req);
 347
 348        struct crypto_aead *base;
 349
 350        unsigned int ivsize;
 351        unsigned int authsize;
 352        unsigned int reqsize;
 353};
 354
 355struct blkcipher_tfm {
 356        void *iv;
 357        int (*setkey)(struct crypto_tfm *tfm, const u8 *key,
 358                      unsigned int keylen);
 359        int (*encrypt)(struct blkcipher_desc *desc, struct scatterlist *dst,
 360                       struct scatterlist *src, unsigned int nbytes);
 361        int (*decrypt)(struct blkcipher_desc *desc, struct scatterlist *dst,
 362                       struct scatterlist *src, unsigned int nbytes);
 363};
 364
 365struct cipher_tfm {
 366        int (*cit_setkey)(struct crypto_tfm *tfm,
 367                          const u8 *key, unsigned int keylen);
 368        void (*cit_encrypt_one)(struct crypto_tfm *tfm, u8 *dst, const u8 *src);
 369        void (*cit_decrypt_one)(struct crypto_tfm *tfm, u8 *dst, const u8 *src);
 370};
 371
 372struct hash_tfm {
 373        int (*init)(struct hash_desc *desc);
 374        int (*update)(struct hash_desc *desc,
 375                      struct scatterlist *sg, unsigned int nsg);
 376        int (*final)(struct hash_desc *desc, u8 *out);
 377        int (*digest)(struct hash_desc *desc, struct scatterlist *sg,
 378                      unsigned int nsg, u8 *out);
 379        int (*setkey)(struct crypto_hash *tfm, const u8 *key,
 380                      unsigned int keylen);
 381        unsigned int digestsize;
 382};
 383
 384struct compress_tfm {
 385        int (*cot_compress)(struct crypto_tfm *tfm,
 386                            const u8 *src, unsigned int slen,
 387                            u8 *dst, unsigned int *dlen);
 388        int (*cot_decompress)(struct crypto_tfm *tfm,
 389                              const u8 *src, unsigned int slen,
 390                              u8 *dst, unsigned int *dlen);
 391};
 392
 393struct rng_tfm {
 394        int (*rng_gen_random)(struct crypto_rng *tfm, u8 *rdata,
 395                              unsigned int dlen);
 396        int (*rng_reset)(struct crypto_rng *tfm, u8 *seed, unsigned int slen);
 397};
 398
 399#define crt_ablkcipher  crt_u.ablkcipher
 400#define crt_aead        crt_u.aead
 401#define crt_blkcipher   crt_u.blkcipher
 402#define crt_cipher      crt_u.cipher
 403#define crt_hash        crt_u.hash
 404#define crt_compress    crt_u.compress
 405#define crt_rng         crt_u.rng
 406
 407struct crypto_tfm {
 408
 409        u32 crt_flags;
 410        
 411        union {
 412                struct ablkcipher_tfm ablkcipher;
 413                struct aead_tfm aead;
 414                struct blkcipher_tfm blkcipher;
 415                struct cipher_tfm cipher;
 416                struct hash_tfm hash;
 417                struct compress_tfm compress;
 418                struct rng_tfm rng;
 419        } crt_u;
 420
 421        void (*exit)(struct crypto_tfm *tfm);
 422        
 423        struct crypto_alg *__crt_alg;
 424
 425        void *__crt_ctx[] CRYPTO_MINALIGN_ATTR;
 426};
 427
 428struct crypto_ablkcipher {
 429        struct crypto_tfm base;
 430};
 431
 432struct crypto_aead {
 433        struct crypto_tfm base;
 434};
 435
 436struct crypto_blkcipher {
 437        struct crypto_tfm base;
 438};
 439
 440struct crypto_cipher {
 441        struct crypto_tfm base;
 442};
 443
 444struct crypto_comp {
 445        struct crypto_tfm base;
 446};
 447
 448struct crypto_hash {
 449        struct crypto_tfm base;
 450};
 451
 452struct crypto_rng {
 453        struct crypto_tfm base;
 454};
 455
 456enum {
 457        CRYPTOA_UNSPEC,
 458        CRYPTOA_ALG,
 459        CRYPTOA_TYPE,
 460        CRYPTOA_U32,
 461        __CRYPTOA_MAX,
 462};
 463
 464#define CRYPTOA_MAX (__CRYPTOA_MAX - 1)
 465
 466/* Maximum number of (rtattr) parameters for each template. */
 467#define CRYPTO_MAX_ATTRS 32
 468
 469struct crypto_attr_alg {
 470        char name[CRYPTO_MAX_ALG_NAME];
 471};
 472
 473struct crypto_attr_type {
 474        u32 type;
 475        u32 mask;
 476};
 477
 478struct crypto_attr_u32 {
 479        u32 num;
 480};
 481
 482/* 
 483 * Transform user interface.
 484 */
 485 
 486struct crypto_tfm *crypto_alloc_base(const char *alg_name, u32 type, u32 mask);
 487void crypto_destroy_tfm(void *mem, struct crypto_tfm *tfm);
 488
 489static inline void crypto_free_tfm(struct crypto_tfm *tfm)
 490{
 491        return crypto_destroy_tfm(tfm, tfm);
 492}
 493
 494int alg_test(const char *driver, const char *alg, u32 type, u32 mask);
 495
 496/*
 497 * Transform helpers which query the underlying algorithm.
 498 */
 499static inline const char *crypto_tfm_alg_name(struct crypto_tfm *tfm)
 500{
 501        return tfm->__crt_alg->cra_name;
 502}
 503
 504static inline const char *crypto_tfm_alg_driver_name(struct crypto_tfm *tfm)
 505{
 506        return tfm->__crt_alg->cra_driver_name;
 507}
 508
 509static inline int crypto_tfm_alg_priority(struct crypto_tfm *tfm)
 510{
 511        return tfm->__crt_alg->cra_priority;
 512}
 513
 514static inline const char *crypto_tfm_alg_modname(struct crypto_tfm *tfm)
 515{
 516        return module_name(tfm->__crt_alg->cra_module);
 517}
 518
 519static inline u32 crypto_tfm_alg_type(struct crypto_tfm *tfm)
 520{
 521        return tfm->__crt_alg->cra_flags & CRYPTO_ALG_TYPE_MASK;
 522}
 523
 524static inline unsigned int crypto_tfm_alg_blocksize(struct crypto_tfm *tfm)
 525{
 526        return tfm->__crt_alg->cra_blocksize;
 527}
 528
 529static inline unsigned int crypto_tfm_alg_alignmask(struct crypto_tfm *tfm)
 530{
 531        return tfm->__crt_alg->cra_alignmask;
 532}
 533
 534static inline u32 crypto_tfm_get_flags(struct crypto_tfm *tfm)
 535{
 536        return tfm->crt_flags;
 537}
 538
 539static inline void crypto_tfm_set_flags(struct crypto_tfm *tfm, u32 flags)
 540{
 541        tfm->crt_flags |= flags;
 542}
 543
 544static inline void crypto_tfm_clear_flags(struct crypto_tfm *tfm, u32 flags)
 545{
 546        tfm->crt_flags &= ~flags;
 547}
 548
 549static inline void *crypto_tfm_ctx(struct crypto_tfm *tfm)
 550{
 551        return tfm->__crt_ctx;
 552}
 553
 554static inline unsigned int crypto_tfm_ctx_alignment(void)
 555{
 556        struct crypto_tfm *tfm;
 557        return __alignof__(tfm->__crt_ctx);
 558}
 559
 560/*
 561 * API wrappers.
 562 */
 563static inline struct crypto_ablkcipher *__crypto_ablkcipher_cast(
 564        struct crypto_tfm *tfm)
 565{
 566        return (struct crypto_ablkcipher *)tfm;
 567}
 568
 569static inline u32 crypto_skcipher_type(u32 type)
 570{
 571        type &= ~(CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_GENIV);
 572        type |= CRYPTO_ALG_TYPE_BLKCIPHER;
 573        return type;
 574}
 575
 576static inline u32 crypto_skcipher_mask(u32 mask)
 577{
 578        mask &= ~(CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_GENIV);
 579        mask |= CRYPTO_ALG_TYPE_BLKCIPHER_MASK;
 580        return mask;
 581}
 582
 583struct crypto_ablkcipher *crypto_alloc_ablkcipher(const char *alg_name,
 584                                                  u32 type, u32 mask);
 585
 586static inline struct crypto_tfm *crypto_ablkcipher_tfm(
 587        struct crypto_ablkcipher *tfm)
 588{
 589        return &tfm->base;
 590}
 591
 592static inline void crypto_free_ablkcipher(struct crypto_ablkcipher *tfm)
 593{
 594        crypto_free_tfm(crypto_ablkcipher_tfm(tfm));
 595}
 596
 597static inline int crypto_has_ablkcipher(const char *alg_name, u32 type,
 598                                        u32 mask)
 599{
 600        return crypto_has_alg(alg_name, crypto_skcipher_type(type),
 601                              crypto_skcipher_mask(mask));
 602}
 603
 604static inline struct ablkcipher_tfm *crypto_ablkcipher_crt(
 605        struct crypto_ablkcipher *tfm)
 606{
 607        return &crypto_ablkcipher_tfm(tfm)->crt_ablkcipher;
 608}
 609
 610static inline unsigned int crypto_ablkcipher_ivsize(
 611        struct crypto_ablkcipher *tfm)
 612{
 613        return crypto_ablkcipher_crt(tfm)->ivsize;
 614}
 615
 616static inline unsigned int crypto_ablkcipher_blocksize(
 617        struct crypto_ablkcipher *tfm)
 618{
 619        return crypto_tfm_alg_blocksize(crypto_ablkcipher_tfm(tfm));
 620}
 621
 622static inline unsigned int crypto_ablkcipher_alignmask(
 623        struct crypto_ablkcipher *tfm)
 624{
 625        return crypto_tfm_alg_alignmask(crypto_ablkcipher_tfm(tfm));
 626}
 627
 628static inline u32 crypto_ablkcipher_get_flags(struct crypto_ablkcipher *tfm)
 629{
 630        return crypto_tfm_get_flags(crypto_ablkcipher_tfm(tfm));
 631}
 632
 633static inline void crypto_ablkcipher_set_flags(struct crypto_ablkcipher *tfm,
 634                                               u32 flags)
 635{
 636        crypto_tfm_set_flags(crypto_ablkcipher_tfm(tfm), flags);
 637}
 638
 639static inline void crypto_ablkcipher_clear_flags(struct crypto_ablkcipher *tfm,
 640                                                 u32 flags)
 641{
 642        crypto_tfm_clear_flags(crypto_ablkcipher_tfm(tfm), flags);
 643}
 644
 645static inline int crypto_ablkcipher_setkey(struct crypto_ablkcipher *tfm,
 646                                           const u8 *key, unsigned int keylen)
 647{
 648        struct ablkcipher_tfm *crt = crypto_ablkcipher_crt(tfm);
 649
 650        return crt->setkey(crt->base, key, keylen);
 651}
 652
 653static inline struct crypto_ablkcipher *crypto_ablkcipher_reqtfm(
 654        struct ablkcipher_request *req)
 655{
 656        return __crypto_ablkcipher_cast(req->base.tfm);
 657}
 658
 659static inline int crypto_ablkcipher_encrypt(struct ablkcipher_request *req)
 660{
 661        struct ablkcipher_tfm *crt =
 662                crypto_ablkcipher_crt(crypto_ablkcipher_reqtfm(req));
 663        return crt->encrypt(req);
 664}
 665
 666static inline int crypto_ablkcipher_decrypt(struct ablkcipher_request *req)
 667{
 668        struct ablkcipher_tfm *crt =
 669                crypto_ablkcipher_crt(crypto_ablkcipher_reqtfm(req));
 670        return crt->decrypt(req);
 671}
 672
 673static inline unsigned int crypto_ablkcipher_reqsize(
 674        struct crypto_ablkcipher *tfm)
 675{
 676        return crypto_ablkcipher_crt(tfm)->reqsize;
 677}
 678
 679static inline void ablkcipher_request_set_tfm(
 680        struct ablkcipher_request *req, struct crypto_ablkcipher *tfm)
 681{
 682        req->base.tfm = crypto_ablkcipher_tfm(crypto_ablkcipher_crt(tfm)->base);
 683}
 684
 685static inline struct ablkcipher_request *ablkcipher_request_cast(
 686        struct crypto_async_request *req)
 687{
 688        return container_of(req, struct ablkcipher_request, base);
 689}
 690
 691static inline struct ablkcipher_request *ablkcipher_request_alloc(
 692        struct crypto_ablkcipher *tfm, gfp_t gfp)
 693{
 694        struct ablkcipher_request *req;
 695
 696        req = kmalloc(sizeof(struct ablkcipher_request) +
 697                      crypto_ablkcipher_reqsize(tfm), gfp);
 698
 699        if (likely(req))
 700                ablkcipher_request_set_tfm(req, tfm);
 701
 702        return req;
 703}
 704
 705static inline void ablkcipher_request_free(struct ablkcipher_request *req)
 706{
 707        kzfree(req);
 708}
 709
 710static inline void ablkcipher_request_set_callback(
 711        struct ablkcipher_request *req,
 712        u32 flags, crypto_completion_t complete, void *data)
 713{
 714        req->base.complete = complete;
 715        req->base.data = data;
 716        req->base.flags = flags;
 717}
 718
 719static inline void ablkcipher_request_set_crypt(
 720        struct ablkcipher_request *req,
 721        struct scatterlist *src, struct scatterlist *dst,
 722        unsigned int nbytes, void *iv)
 723{
 724        req->src = src;
 725        req->dst = dst;
 726        req->nbytes = nbytes;
 727        req->info = iv;
 728}
 729
 730static inline struct crypto_aead *__crypto_aead_cast(struct crypto_tfm *tfm)
 731{
 732        return (struct crypto_aead *)tfm;
 733}
 734
 735struct crypto_aead *crypto_alloc_aead(const char *alg_name, u32 type, u32 mask);
 736
 737static inline struct crypto_tfm *crypto_aead_tfm(struct crypto_aead *tfm)
 738{
 739        return &tfm->base;
 740}
 741
 742static inline void crypto_free_aead(struct crypto_aead *tfm)
 743{
 744        crypto_free_tfm(crypto_aead_tfm(tfm));
 745}
 746
 747static inline struct aead_tfm *crypto_aead_crt(struct crypto_aead *tfm)
 748{
 749        return &crypto_aead_tfm(tfm)->crt_aead;
 750}
 751
 752static inline unsigned int crypto_aead_ivsize(struct crypto_aead *tfm)
 753{
 754        return crypto_aead_crt(tfm)->ivsize;
 755}
 756
 757static inline unsigned int crypto_aead_authsize(struct crypto_aead *tfm)
 758{
 759        return crypto_aead_crt(tfm)->authsize;
 760}
 761
 762static inline unsigned int crypto_aead_blocksize(struct crypto_aead *tfm)
 763{
 764        return crypto_tfm_alg_blocksize(crypto_aead_tfm(tfm));
 765}
 766
 767static inline unsigned int crypto_aead_alignmask(struct crypto_aead *tfm)
 768{
 769        return crypto_tfm_alg_alignmask(crypto_aead_tfm(tfm));
 770}
 771
 772static inline u32 crypto_aead_get_flags(struct crypto_aead *tfm)
 773{
 774        return crypto_tfm_get_flags(crypto_aead_tfm(tfm));
 775}
 776
 777static inline void crypto_aead_set_flags(struct crypto_aead *tfm, u32 flags)
 778{
 779        crypto_tfm_set_flags(crypto_aead_tfm(tfm), flags);
 780}
 781
 782static inline void crypto_aead_clear_flags(struct crypto_aead *tfm, u32 flags)
 783{
 784        crypto_tfm_clear_flags(crypto_aead_tfm(tfm), flags);
 785}
 786
 787static inline int crypto_aead_setkey(struct crypto_aead *tfm, const u8 *key,
 788                                     unsigned int keylen)
 789{
 790        struct aead_tfm *crt = crypto_aead_crt(tfm);
 791
 792        return crt->setkey(crt->base, key, keylen);
 793}
 794
 795int crypto_aead_setauthsize(struct crypto_aead *tfm, unsigned int authsize);
 796
 797static inline struct crypto_aead *crypto_aead_reqtfm(struct aead_request *req)
 798{
 799        return __crypto_aead_cast(req->base.tfm);
 800}
 801
 802static inline int crypto_aead_encrypt(struct aead_request *req)
 803{
 804        return crypto_aead_crt(crypto_aead_reqtfm(req))->encrypt(req);
 805}
 806
 807static inline int crypto_aead_decrypt(struct aead_request *req)
 808{
 809        return crypto_aead_crt(crypto_aead_reqtfm(req))->decrypt(req);
 810}
 811
 812static inline unsigned int crypto_aead_reqsize(struct crypto_aead *tfm)
 813{
 814        return crypto_aead_crt(tfm)->reqsize;
 815}
 816
 817static inline void aead_request_set_tfm(struct aead_request *req,
 818                                        struct crypto_aead *tfm)
 819{
 820        req->base.tfm = crypto_aead_tfm(crypto_aead_crt(tfm)->base);
 821}
 822
 823static inline struct aead_request *aead_request_alloc(struct crypto_aead *tfm,
 824                                                      gfp_t gfp)
 825{
 826        struct aead_request *req;
 827
 828        req = kmalloc(sizeof(*req) + crypto_aead_reqsize(tfm), gfp);
 829
 830        if (likely(req))
 831                aead_request_set_tfm(req, tfm);
 832
 833        return req;
 834}
 835
 836static inline void aead_request_free(struct aead_request *req)
 837{
 838        kzfree(req);
 839}
 840
 841static inline void aead_request_set_callback(struct aead_request *req,
 842                                             u32 flags,
 843                                             crypto_completion_t complete,
 844                                             void *data)
 845{
 846        req->base.complete = complete;
 847        req->base.data = data;
 848        req->base.flags = flags;
 849}
 850
 851static inline void aead_request_set_crypt(struct aead_request *req,
 852                                          struct scatterlist *src,
 853                                          struct scatterlist *dst,
 854                                          unsigned int cryptlen, u8 *iv)
 855{
 856        req->src = src;
 857        req->dst = dst;
 858        req->cryptlen = cryptlen;
 859        req->iv = iv;
 860}
 861
 862static inline void aead_request_set_assoc(struct aead_request *req,
 863                                          struct scatterlist *assoc,
 864                                          unsigned int assoclen)
 865{
 866        req->assoc = assoc;
 867        req->assoclen = assoclen;
 868}
 869
 870static inline struct crypto_blkcipher *__crypto_blkcipher_cast(
 871        struct crypto_tfm *tfm)
 872{
 873        return (struct crypto_blkcipher *)tfm;
 874}
 875
 876static inline struct crypto_blkcipher *crypto_blkcipher_cast(
 877        struct crypto_tfm *tfm)
 878{
 879        BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_BLKCIPHER);
 880        return __crypto_blkcipher_cast(tfm);
 881}
 882
 883static inline struct crypto_blkcipher *crypto_alloc_blkcipher(
 884        const char *alg_name, u32 type, u32 mask)
 885{
 886        type &= ~CRYPTO_ALG_TYPE_MASK;
 887        type |= CRYPTO_ALG_TYPE_BLKCIPHER;
 888        mask |= CRYPTO_ALG_TYPE_MASK;
 889
 890        return __crypto_blkcipher_cast(crypto_alloc_base(alg_name, type, mask));
 891}
 892
 893static inline struct crypto_tfm *crypto_blkcipher_tfm(
 894        struct crypto_blkcipher *tfm)
 895{
 896        return &tfm->base;
 897}
 898
 899static inline void crypto_free_blkcipher(struct crypto_blkcipher *tfm)
 900{
 901        crypto_free_tfm(crypto_blkcipher_tfm(tfm));
 902}
 903
 904static inline int crypto_has_blkcipher(const char *alg_name, u32 type, u32 mask)
 905{
 906        type &= ~CRYPTO_ALG_TYPE_MASK;
 907        type |= CRYPTO_ALG_TYPE_BLKCIPHER;
 908        mask |= CRYPTO_ALG_TYPE_MASK;
 909
 910        return crypto_has_alg(alg_name, type, mask);
 911}
 912
 913static inline const char *crypto_blkcipher_name(struct crypto_blkcipher *tfm)
 914{
 915        return crypto_tfm_alg_name(crypto_blkcipher_tfm(tfm));
 916}
 917
 918static inline struct blkcipher_tfm *crypto_blkcipher_crt(
 919        struct crypto_blkcipher *tfm)
 920{
 921        return &crypto_blkcipher_tfm(tfm)->crt_blkcipher;
 922}
 923
 924static inline struct blkcipher_alg *crypto_blkcipher_alg(
 925        struct crypto_blkcipher *tfm)
 926{
 927        return &crypto_blkcipher_tfm(tfm)->__crt_alg->cra_blkcipher;
 928}
 929
 930static inline unsigned int crypto_blkcipher_ivsize(struct crypto_blkcipher *tfm)
 931{
 932        return crypto_blkcipher_alg(tfm)->ivsize;
 933}
 934
 935static inline unsigned int crypto_blkcipher_blocksize(
 936        struct crypto_blkcipher *tfm)
 937{
 938        return crypto_tfm_alg_blocksize(crypto_blkcipher_tfm(tfm));
 939}
 940
 941static inline unsigned int crypto_blkcipher_alignmask(
 942        struct crypto_blkcipher *tfm)
 943{
 944        return crypto_tfm_alg_alignmask(crypto_blkcipher_tfm(tfm));
 945}
 946
 947static inline u32 crypto_blkcipher_get_flags(struct crypto_blkcipher *tfm)
 948{
 949        return crypto_tfm_get_flags(crypto_blkcipher_tfm(tfm));
 950}
 951
 952static inline void crypto_blkcipher_set_flags(struct crypto_blkcipher *tfm,
 953                                              u32 flags)
 954{
 955        crypto_tfm_set_flags(crypto_blkcipher_tfm(tfm), flags);
 956}
 957
 958static inline void crypto_blkcipher_clear_flags(struct crypto_blkcipher *tfm,
 959                                                u32 flags)
 960{
 961        crypto_tfm_clear_flags(crypto_blkcipher_tfm(tfm), flags);
 962}
 963
 964static inline int crypto_blkcipher_setkey(struct crypto_blkcipher *tfm,
 965                                          const u8 *key, unsigned int keylen)
 966{
 967        return crypto_blkcipher_crt(tfm)->setkey(crypto_blkcipher_tfm(tfm),
 968                                                 key, keylen);
 969}
 970
 971static inline int crypto_blkcipher_encrypt(struct blkcipher_desc *desc,
 972                                           struct scatterlist *dst,
 973                                           struct scatterlist *src,
 974                                           unsigned int nbytes)
 975{
 976        desc->info = crypto_blkcipher_crt(desc->tfm)->iv;
 977        return crypto_blkcipher_crt(desc->tfm)->encrypt(desc, dst, src, nbytes);
 978}
 979
 980static inline int crypto_blkcipher_encrypt_iv(struct blkcipher_desc *desc,
 981                                              struct scatterlist *dst,
 982                                              struct scatterlist *src,
 983                                              unsigned int nbytes)
 984{
 985        return crypto_blkcipher_crt(desc->tfm)->encrypt(desc, dst, src, nbytes);
 986}
 987
 988static inline int crypto_blkcipher_decrypt(struct blkcipher_desc *desc,
 989                                           struct scatterlist *dst,
 990                                           struct scatterlist *src,
 991                                           unsigned int nbytes)
 992{
 993        desc->info = crypto_blkcipher_crt(desc->tfm)->iv;
 994        return crypto_blkcipher_crt(desc->tfm)->decrypt(desc, dst, src, nbytes);
 995}
 996
 997static inline int crypto_blkcipher_decrypt_iv(struct blkcipher_desc *desc,
 998                                              struct scatterlist *dst,
 999                                              struct scatterlist *src,
1000                                              unsigned int nbytes)
1001{
1002        return crypto_blkcipher_crt(desc->tfm)->decrypt(desc, dst, src, nbytes);
1003}
1004
1005static inline void crypto_blkcipher_set_iv(struct crypto_blkcipher *tfm,
1006                                           const u8 *src, unsigned int len)
1007{
1008        memcpy(crypto_blkcipher_crt(tfm)->iv, src, len);
1009}
1010
1011static inline void crypto_blkcipher_get_iv(struct crypto_blkcipher *tfm,
1012                                           u8 *dst, unsigned int len)
1013{
1014        memcpy(dst, crypto_blkcipher_crt(tfm)->iv, len);
1015}
1016
1017static inline struct crypto_cipher *__crypto_cipher_cast(struct crypto_tfm *tfm)
1018{
1019        return (struct crypto_cipher *)tfm;
1020}
1021
1022static inline struct crypto_cipher *crypto_cipher_cast(struct crypto_tfm *tfm)
1023{
1024        BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
1025        return __crypto_cipher_cast(tfm);
1026}
1027
1028static inline struct crypto_cipher *crypto_alloc_cipher(const char *alg_name,
1029                                                        u32 type, u32 mask)
1030{
1031        type &= ~CRYPTO_ALG_TYPE_MASK;
1032        type |= CRYPTO_ALG_TYPE_CIPHER;
1033        mask |= CRYPTO_ALG_TYPE_MASK;
1034
1035        return __crypto_cipher_cast(crypto_alloc_base(alg_name, type, mask));
1036}
1037
1038static inline struct crypto_tfm *crypto_cipher_tfm(struct crypto_cipher *tfm)
1039{
1040        return &tfm->base;
1041}
1042
1043static inline void crypto_free_cipher(struct crypto_cipher *tfm)
1044{
1045        crypto_free_tfm(crypto_cipher_tfm(tfm));
1046}
1047
1048static inline int crypto_has_cipher(const char *alg_name, u32 type, u32 mask)
1049{
1050        type &= ~CRYPTO_ALG_TYPE_MASK;
1051        type |= CRYPTO_ALG_TYPE_CIPHER;
1052        mask |= CRYPTO_ALG_TYPE_MASK;
1053
1054        return crypto_has_alg(alg_name, type, mask);
1055}
1056
1057static inline struct cipher_tfm *crypto_cipher_crt(struct crypto_cipher *tfm)
1058{
1059        return &crypto_cipher_tfm(tfm)->crt_cipher;
1060}
1061
1062static inline unsigned int crypto_cipher_blocksize(struct crypto_cipher *tfm)
1063{
1064        return crypto_tfm_alg_blocksize(crypto_cipher_tfm(tfm));
1065}
1066
1067static inline unsigned int crypto_cipher_alignmask(struct crypto_cipher *tfm)
1068{
1069        return crypto_tfm_alg_alignmask(crypto_cipher_tfm(tfm));
1070}
1071
1072static inline u32 crypto_cipher_get_flags(struct crypto_cipher *tfm)
1073{
1074        return crypto_tfm_get_flags(crypto_cipher_tfm(tfm));
1075}
1076
1077static inline void crypto_cipher_set_flags(struct crypto_cipher *tfm,
1078                                           u32 flags)
1079{
1080        crypto_tfm_set_flags(crypto_cipher_tfm(tfm), flags);
1081}
1082
1083static inline void crypto_cipher_clear_flags(struct crypto_cipher *tfm,
1084                                             u32 flags)
1085{
1086        crypto_tfm_clear_flags(crypto_cipher_tfm(tfm), flags);
1087}
1088
1089static inline int crypto_cipher_setkey(struct crypto_cipher *tfm,
1090                                       const u8 *key, unsigned int keylen)
1091{
1092        return crypto_cipher_crt(tfm)->cit_setkey(crypto_cipher_tfm(tfm),
1093                                                  key, keylen);
1094}
1095
1096static inline void crypto_cipher_encrypt_one(struct crypto_cipher *tfm,
1097                                             u8 *dst, const u8 *src)
1098{
1099        crypto_cipher_crt(tfm)->cit_encrypt_one(crypto_cipher_tfm(tfm),
1100                                                dst, src);
1101}
1102
1103static inline void crypto_cipher_decrypt_one(struct crypto_cipher *tfm,
1104                                             u8 *dst, const u8 *src)
1105{
1106        crypto_cipher_crt(tfm)->cit_decrypt_one(crypto_cipher_tfm(tfm),
1107                                                dst, src);
1108}
1109
1110static inline struct crypto_hash *__crypto_hash_cast(struct crypto_tfm *tfm)
1111{
1112        return (struct crypto_hash *)tfm;
1113}
1114
1115static inline struct crypto_hash *crypto_hash_cast(struct crypto_tfm *tfm)
1116{
1117        BUG_ON((crypto_tfm_alg_type(tfm) ^ CRYPTO_ALG_TYPE_HASH) &
1118               CRYPTO_ALG_TYPE_HASH_MASK);
1119        return __crypto_hash_cast(tfm);
1120}
1121
1122static inline struct crypto_hash *crypto_alloc_hash(const char *alg_name,
1123                                                    u32 type, u32 mask)
1124{
1125        type &= ~CRYPTO_ALG_TYPE_MASK;
1126        mask &= ~CRYPTO_ALG_TYPE_MASK;
1127        type |= CRYPTO_ALG_TYPE_HASH;
1128        mask |= CRYPTO_ALG_TYPE_HASH_MASK;
1129
1130        return __crypto_hash_cast(crypto_alloc_base(alg_name, type, mask));
1131}
1132
1133static inline struct crypto_tfm *crypto_hash_tfm(struct crypto_hash *tfm)
1134{
1135        return &tfm->base;
1136}
1137
1138static inline void crypto_free_hash(struct crypto_hash *tfm)
1139{
1140        crypto_free_tfm(crypto_hash_tfm(tfm));
1141}
1142
1143static inline int crypto_has_hash(const char *alg_name, u32 type, u32 mask)
1144{
1145        type &= ~CRYPTO_ALG_TYPE_MASK;
1146        mask &= ~CRYPTO_ALG_TYPE_MASK;
1147        type |= CRYPTO_ALG_TYPE_HASH;
1148        mask |= CRYPTO_ALG_TYPE_HASH_MASK;
1149
1150        return crypto_has_alg(alg_name, type, mask);
1151}
1152
1153static inline struct hash_tfm *crypto_hash_crt(struct crypto_hash *tfm)
1154{
1155        return &crypto_hash_tfm(tfm)->crt_hash;
1156}
1157
1158static inline unsigned int crypto_hash_blocksize(struct crypto_hash *tfm)
1159{
1160        return crypto_tfm_alg_blocksize(crypto_hash_tfm(tfm));
1161}
1162
1163static inline unsigned int crypto_hash_alignmask(struct crypto_hash *tfm)
1164{
1165        return crypto_tfm_alg_alignmask(crypto_hash_tfm(tfm));
1166}
1167
1168static inline unsigned int crypto_hash_digestsize(struct crypto_hash *tfm)
1169{
1170        return crypto_hash_crt(tfm)->digestsize;
1171}
1172
1173static inline u32 crypto_hash_get_flags(struct crypto_hash *tfm)
1174{
1175        return crypto_tfm_get_flags(crypto_hash_tfm(tfm));
1176}
1177
1178static inline void crypto_hash_set_flags(struct crypto_hash *tfm, u32 flags)
1179{
1180        crypto_tfm_set_flags(crypto_hash_tfm(tfm), flags);
1181}
1182
1183static inline void crypto_hash_clear_flags(struct crypto_hash *tfm, u32 flags)
1184{
1185        crypto_tfm_clear_flags(crypto_hash_tfm(tfm), flags);
1186}
1187
1188static inline int crypto_hash_init(struct hash_desc *desc)
1189{
1190        return crypto_hash_crt(desc->tfm)->init(desc);
1191}
1192
1193static inline int crypto_hash_update(struct hash_desc *desc,
1194                                     struct scatterlist *sg,
1195                                     unsigned int nbytes)
1196{
1197        return crypto_hash_crt(desc->tfm)->update(desc, sg, nbytes);
1198}
1199
1200static inline int crypto_hash_final(struct hash_desc *desc, u8 *out)
1201{
1202        return crypto_hash_crt(desc->tfm)->final(desc, out);
1203}
1204
1205static inline int crypto_hash_digest(struct hash_desc *desc,
1206                                     struct scatterlist *sg,
1207                                     unsigned int nbytes, u8 *out)
1208{
1209        return crypto_hash_crt(desc->tfm)->digest(desc, sg, nbytes, out);
1210}
1211
1212static inline int crypto_hash_setkey(struct crypto_hash *hash,
1213                                     const u8 *key, unsigned int keylen)
1214{
1215        return crypto_hash_crt(hash)->setkey(hash, key, keylen);
1216}
1217
1218static inline struct crypto_comp *__crypto_comp_cast(struct crypto_tfm *tfm)
1219{
1220        return (struct crypto_comp *)tfm;
1221}
1222
1223static inline struct crypto_comp *crypto_comp_cast(struct crypto_tfm *tfm)
1224{
1225        BUG_ON((crypto_tfm_alg_type(tfm) ^ CRYPTO_ALG_TYPE_COMPRESS) &
1226               CRYPTO_ALG_TYPE_MASK);
1227        return __crypto_comp_cast(tfm);
1228}
1229
1230static inline struct crypto_comp *crypto_alloc_comp(const char *alg_name,
1231                                                    u32 type, u32 mask)
1232{
1233        type &= ~CRYPTO_ALG_TYPE_MASK;
1234        type |= CRYPTO_ALG_TYPE_COMPRESS;
1235        mask |= CRYPTO_ALG_TYPE_MASK;
1236
1237        return __crypto_comp_cast(crypto_alloc_base(alg_name, type, mask));
1238}
1239
1240static inline struct crypto_tfm *crypto_comp_tfm(struct crypto_comp *tfm)
1241{
1242        return &tfm->base;
1243}
1244
1245static inline void crypto_free_comp(struct crypto_comp *tfm)
1246{
1247        crypto_free_tfm(crypto_comp_tfm(tfm));
1248}
1249
1250static inline int crypto_has_comp(const char *alg_name, u32 type, u32 mask)
1251{
1252        type &= ~CRYPTO_ALG_TYPE_MASK;
1253        type |= CRYPTO_ALG_TYPE_COMPRESS;
1254        mask |= CRYPTO_ALG_TYPE_MASK;
1255
1256        return crypto_has_alg(alg_name, type, mask);
1257}
1258
1259static inline const char *crypto_comp_name(struct crypto_comp *tfm)
1260{
1261        return crypto_tfm_alg_name(crypto_comp_tfm(tfm));
1262}
1263
1264static inline struct compress_tfm *crypto_comp_crt(struct crypto_comp *tfm)
1265{
1266        return &crypto_comp_tfm(tfm)->crt_compress;
1267}
1268
1269static inline int crypto_comp_compress(struct crypto_comp *tfm,
1270                                       const u8 *src, unsigned int slen,
1271                                       u8 *dst, unsigned int *dlen)
1272{
1273        return crypto_comp_crt(tfm)->cot_compress(crypto_comp_tfm(tfm),
1274                                                  src, slen, dst, dlen);
1275}
1276
1277static inline int crypto_comp_decompress(struct crypto_comp *tfm,
1278                                         const u8 *src, unsigned int slen,
1279                                         u8 *dst, unsigned int *dlen)
1280{
1281        return crypto_comp_crt(tfm)->cot_decompress(crypto_comp_tfm(tfm),
1282                                                    src, slen, dst, dlen);
1283}
1284
1285#endif  /* _LINUX_CRYPTO_H */
1286
1287
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.