cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

xfrm_algo.c (14858B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * xfrm algorithm interface
      4 *
      5 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
      6 */
      7
      8#include <crypto/hash.h>
      9#include <crypto/skcipher.h>
     10#include <linux/module.h>
     11#include <linux/kernel.h>
     12#include <linux/pfkeyv2.h>
     13#include <linux/crypto.h>
     14#include <linux/scatterlist.h>
     15#include <net/xfrm.h>
     16#if IS_ENABLED(CONFIG_INET_ESP) || IS_ENABLED(CONFIG_INET6_ESP)
     17#include <net/esp.h>
     18#endif
     19
     20/*
     21 * Algorithms supported by IPsec.  These entries contain properties which
     22 * are used in key negotiation and xfrm processing, and are used to verify
     23 * that instantiated crypto transforms have correct parameters for IPsec
     24 * purposes.
     25 */
     26static struct xfrm_algo_desc aead_list[] = {
     27{
     28	.name = "rfc4106(gcm(aes))",
     29
     30	.uinfo = {
     31		.aead = {
     32			.geniv = "seqiv",
     33			.icv_truncbits = 64,
     34		}
     35	},
     36
     37	.pfkey_supported = 1,
     38
     39	.desc = {
     40		.sadb_alg_id = SADB_X_EALG_AES_GCM_ICV8,
     41		.sadb_alg_ivlen = 8,
     42		.sadb_alg_minbits = 128,
     43		.sadb_alg_maxbits = 256
     44	}
     45},
     46{
     47	.name = "rfc4106(gcm(aes))",
     48
     49	.uinfo = {
     50		.aead = {
     51			.geniv = "seqiv",
     52			.icv_truncbits = 96,
     53		}
     54	},
     55
     56	.pfkey_supported = 1,
     57
     58	.desc = {
     59		.sadb_alg_id = SADB_X_EALG_AES_GCM_ICV12,
     60		.sadb_alg_ivlen = 8,
     61		.sadb_alg_minbits = 128,
     62		.sadb_alg_maxbits = 256
     63	}
     64},
     65{
     66	.name = "rfc4106(gcm(aes))",
     67
     68	.uinfo = {
     69		.aead = {
     70			.geniv = "seqiv",
     71			.icv_truncbits = 128,
     72		}
     73	},
     74
     75	.pfkey_supported = 1,
     76
     77	.desc = {
     78		.sadb_alg_id = SADB_X_EALG_AES_GCM_ICV16,
     79		.sadb_alg_ivlen = 8,
     80		.sadb_alg_minbits = 128,
     81		.sadb_alg_maxbits = 256
     82	}
     83},
     84{
     85	.name = "rfc4309(ccm(aes))",
     86
     87	.uinfo = {
     88		.aead = {
     89			.geniv = "seqiv",
     90			.icv_truncbits = 64,
     91		}
     92	},
     93
     94	.pfkey_supported = 1,
     95
     96	.desc = {
     97		.sadb_alg_id = SADB_X_EALG_AES_CCM_ICV8,
     98		.sadb_alg_ivlen = 8,
     99		.sadb_alg_minbits = 128,
    100		.sadb_alg_maxbits = 256
    101	}
    102},
    103{
    104	.name = "rfc4309(ccm(aes))",
    105
    106	.uinfo = {
    107		.aead = {
    108			.geniv = "seqiv",
    109			.icv_truncbits = 96,
    110		}
    111	},
    112
    113	.pfkey_supported = 1,
    114
    115	.desc = {
    116		.sadb_alg_id = SADB_X_EALG_AES_CCM_ICV12,
    117		.sadb_alg_ivlen = 8,
    118		.sadb_alg_minbits = 128,
    119		.sadb_alg_maxbits = 256
    120	}
    121},
    122{
    123	.name = "rfc4309(ccm(aes))",
    124
    125	.uinfo = {
    126		.aead = {
    127			.geniv = "seqiv",
    128			.icv_truncbits = 128,
    129		}
    130	},
    131
    132	.pfkey_supported = 1,
    133
    134	.desc = {
    135		.sadb_alg_id = SADB_X_EALG_AES_CCM_ICV16,
    136		.sadb_alg_ivlen = 8,
    137		.sadb_alg_minbits = 128,
    138		.sadb_alg_maxbits = 256
    139	}
    140},
    141{
    142	.name = "rfc4543(gcm(aes))",
    143
    144	.uinfo = {
    145		.aead = {
    146			.geniv = "seqiv",
    147			.icv_truncbits = 128,
    148		}
    149	},
    150
    151	.pfkey_supported = 1,
    152
    153	.desc = {
    154		.sadb_alg_id = SADB_X_EALG_NULL_AES_GMAC,
    155		.sadb_alg_ivlen = 8,
    156		.sadb_alg_minbits = 128,
    157		.sadb_alg_maxbits = 256
    158	}
    159},
    160{
    161	.name = "rfc7539esp(chacha20,poly1305)",
    162
    163	.uinfo = {
    164		.aead = {
    165			.geniv = "seqiv",
    166			.icv_truncbits = 128,
    167		}
    168	},
    169
    170	.pfkey_supported = 0,
    171},
    172};
    173
    174static struct xfrm_algo_desc aalg_list[] = {
    175{
    176	.name = "digest_null",
    177
    178	.uinfo = {
    179		.auth = {
    180			.icv_truncbits = 0,
    181			.icv_fullbits = 0,
    182		}
    183	},
    184
    185	.pfkey_supported = 1,
    186
    187	.desc = {
    188		.sadb_alg_id = SADB_X_AALG_NULL,
    189		.sadb_alg_ivlen = 0,
    190		.sadb_alg_minbits = 0,
    191		.sadb_alg_maxbits = 0
    192	}
    193},
    194{
    195	.name = "hmac(md5)",
    196	.compat = "md5",
    197
    198	.uinfo = {
    199		.auth = {
    200			.icv_truncbits = 96,
    201			.icv_fullbits = 128,
    202		}
    203	},
    204
    205	.pfkey_supported = 1,
    206
    207	.desc = {
    208		.sadb_alg_id = SADB_AALG_MD5HMAC,
    209		.sadb_alg_ivlen = 0,
    210		.sadb_alg_minbits = 128,
    211		.sadb_alg_maxbits = 128
    212	}
    213},
    214{
    215	.name = "hmac(sha1)",
    216	.compat = "sha1",
    217
    218	.uinfo = {
    219		.auth = {
    220			.icv_truncbits = 96,
    221			.icv_fullbits = 160,
    222		}
    223	},
    224
    225	.pfkey_supported = 1,
    226
    227	.desc = {
    228		.sadb_alg_id = SADB_AALG_SHA1HMAC,
    229		.sadb_alg_ivlen = 0,
    230		.sadb_alg_minbits = 160,
    231		.sadb_alg_maxbits = 160
    232	}
    233},
    234{
    235	.name = "hmac(sha256)",
    236	.compat = "sha256",
    237
    238	.uinfo = {
    239		.auth = {
    240			.icv_truncbits = 96,
    241			.icv_fullbits = 256,
    242		}
    243	},
    244
    245	.pfkey_supported = 1,
    246
    247	.desc = {
    248		.sadb_alg_id = SADB_X_AALG_SHA2_256HMAC,
    249		.sadb_alg_ivlen = 0,
    250		.sadb_alg_minbits = 256,
    251		.sadb_alg_maxbits = 256
    252	}
    253},
    254{
    255	.name = "hmac(sha384)",
    256
    257	.uinfo = {
    258		.auth = {
    259			.icv_truncbits = 192,
    260			.icv_fullbits = 384,
    261		}
    262	},
    263
    264	.pfkey_supported = 1,
    265
    266	.desc = {
    267		.sadb_alg_id = SADB_X_AALG_SHA2_384HMAC,
    268		.sadb_alg_ivlen = 0,
    269		.sadb_alg_minbits = 384,
    270		.sadb_alg_maxbits = 384
    271	}
    272},
    273{
    274	.name = "hmac(sha512)",
    275
    276	.uinfo = {
    277		.auth = {
    278			.icv_truncbits = 256,
    279			.icv_fullbits = 512,
    280		}
    281	},
    282
    283	.pfkey_supported = 1,
    284
    285	.desc = {
    286		.sadb_alg_id = SADB_X_AALG_SHA2_512HMAC,
    287		.sadb_alg_ivlen = 0,
    288		.sadb_alg_minbits = 512,
    289		.sadb_alg_maxbits = 512
    290	}
    291},
    292{
    293	.name = "hmac(rmd160)",
    294	.compat = "rmd160",
    295
    296	.uinfo = {
    297		.auth = {
    298			.icv_truncbits = 96,
    299			.icv_fullbits = 160,
    300		}
    301	},
    302
    303	.pfkey_supported = 1,
    304
    305	.desc = {
    306		.sadb_alg_id = SADB_X_AALG_RIPEMD160HMAC,
    307		.sadb_alg_ivlen = 0,
    308		.sadb_alg_minbits = 160,
    309		.sadb_alg_maxbits = 160
    310	}
    311},
    312{
    313	.name = "xcbc(aes)",
    314
    315	.uinfo = {
    316		.auth = {
    317			.icv_truncbits = 96,
    318			.icv_fullbits = 128,
    319		}
    320	},
    321
    322	.pfkey_supported = 1,
    323
    324	.desc = {
    325		.sadb_alg_id = SADB_X_AALG_AES_XCBC_MAC,
    326		.sadb_alg_ivlen = 0,
    327		.sadb_alg_minbits = 128,
    328		.sadb_alg_maxbits = 128
    329	}
    330},
    331{
    332	/* rfc4494 */
    333	.name = "cmac(aes)",
    334
    335	.uinfo = {
    336		.auth = {
    337			.icv_truncbits = 96,
    338			.icv_fullbits = 128,
    339		}
    340	},
    341
    342	.pfkey_supported = 0,
    343},
    344{
    345	.name = "hmac(sm3)",
    346	.compat = "sm3",
    347
    348	.uinfo = {
    349		.auth = {
    350			.icv_truncbits = 256,
    351			.icv_fullbits = 256,
    352		}
    353	},
    354
    355	.pfkey_supported = 1,
    356
    357	.desc = {
    358		.sadb_alg_id = SADB_X_AALG_SM3_256HMAC,
    359		.sadb_alg_ivlen = 0,
    360		.sadb_alg_minbits = 256,
    361		.sadb_alg_maxbits = 256
    362	}
    363},
    364};
    365
    366static struct xfrm_algo_desc ealg_list[] = {
    367{
    368	.name = "ecb(cipher_null)",
    369	.compat = "cipher_null",
    370
    371	.uinfo = {
    372		.encr = {
    373			.blockbits = 8,
    374			.defkeybits = 0,
    375		}
    376	},
    377
    378	.pfkey_supported = 1,
    379
    380	.desc = {
    381		.sadb_alg_id =	SADB_EALG_NULL,
    382		.sadb_alg_ivlen = 0,
    383		.sadb_alg_minbits = 0,
    384		.sadb_alg_maxbits = 0
    385	}
    386},
    387{
    388	.name = "cbc(des)",
    389	.compat = "des",
    390
    391	.uinfo = {
    392		.encr = {
    393			.geniv = "echainiv",
    394			.blockbits = 64,
    395			.defkeybits = 64,
    396		}
    397	},
    398
    399	.pfkey_supported = 1,
    400
    401	.desc = {
    402		.sadb_alg_id = SADB_EALG_DESCBC,
    403		.sadb_alg_ivlen = 8,
    404		.sadb_alg_minbits = 64,
    405		.sadb_alg_maxbits = 64
    406	}
    407},
    408{
    409	.name = "cbc(des3_ede)",
    410	.compat = "des3_ede",
    411
    412	.uinfo = {
    413		.encr = {
    414			.geniv = "echainiv",
    415			.blockbits = 64,
    416			.defkeybits = 192,
    417		}
    418	},
    419
    420	.pfkey_supported = 1,
    421
    422	.desc = {
    423		.sadb_alg_id = SADB_EALG_3DESCBC,
    424		.sadb_alg_ivlen = 8,
    425		.sadb_alg_minbits = 192,
    426		.sadb_alg_maxbits = 192
    427	}
    428},
    429{
    430	.name = "cbc(cast5)",
    431	.compat = "cast5",
    432
    433	.uinfo = {
    434		.encr = {
    435			.geniv = "echainiv",
    436			.blockbits = 64,
    437			.defkeybits = 128,
    438		}
    439	},
    440
    441	.pfkey_supported = 1,
    442
    443	.desc = {
    444		.sadb_alg_id = SADB_X_EALG_CASTCBC,
    445		.sadb_alg_ivlen = 8,
    446		.sadb_alg_minbits = 40,
    447		.sadb_alg_maxbits = 128
    448	}
    449},
    450{
    451	.name = "cbc(blowfish)",
    452	.compat = "blowfish",
    453
    454	.uinfo = {
    455		.encr = {
    456			.geniv = "echainiv",
    457			.blockbits = 64,
    458			.defkeybits = 128,
    459		}
    460	},
    461
    462	.pfkey_supported = 1,
    463
    464	.desc = {
    465		.sadb_alg_id = SADB_X_EALG_BLOWFISHCBC,
    466		.sadb_alg_ivlen = 8,
    467		.sadb_alg_minbits = 40,
    468		.sadb_alg_maxbits = 448
    469	}
    470},
    471{
    472	.name = "cbc(aes)",
    473	.compat = "aes",
    474
    475	.uinfo = {
    476		.encr = {
    477			.geniv = "echainiv",
    478			.blockbits = 128,
    479			.defkeybits = 128,
    480		}
    481	},
    482
    483	.pfkey_supported = 1,
    484
    485	.desc = {
    486		.sadb_alg_id = SADB_X_EALG_AESCBC,
    487		.sadb_alg_ivlen = 8,
    488		.sadb_alg_minbits = 128,
    489		.sadb_alg_maxbits = 256
    490	}
    491},
    492{
    493	.name = "cbc(serpent)",
    494	.compat = "serpent",
    495
    496	.uinfo = {
    497		.encr = {
    498			.geniv = "echainiv",
    499			.blockbits = 128,
    500			.defkeybits = 128,
    501		}
    502	},
    503
    504	.pfkey_supported = 1,
    505
    506	.desc = {
    507		.sadb_alg_id = SADB_X_EALG_SERPENTCBC,
    508		.sadb_alg_ivlen = 8,
    509		.sadb_alg_minbits = 128,
    510		.sadb_alg_maxbits = 256,
    511	}
    512},
    513{
    514	.name = "cbc(camellia)",
    515	.compat = "camellia",
    516
    517	.uinfo = {
    518		.encr = {
    519			.geniv = "echainiv",
    520			.blockbits = 128,
    521			.defkeybits = 128,
    522		}
    523	},
    524
    525	.pfkey_supported = 1,
    526
    527	.desc = {
    528		.sadb_alg_id = SADB_X_EALG_CAMELLIACBC,
    529		.sadb_alg_ivlen = 8,
    530		.sadb_alg_minbits = 128,
    531		.sadb_alg_maxbits = 256
    532	}
    533},
    534{
    535	.name = "cbc(twofish)",
    536	.compat = "twofish",
    537
    538	.uinfo = {
    539		.encr = {
    540			.geniv = "echainiv",
    541			.blockbits = 128,
    542			.defkeybits = 128,
    543		}
    544	},
    545
    546	.pfkey_supported = 1,
    547
    548	.desc = {
    549		.sadb_alg_id = SADB_X_EALG_TWOFISHCBC,
    550		.sadb_alg_ivlen = 8,
    551		.sadb_alg_minbits = 128,
    552		.sadb_alg_maxbits = 256
    553	}
    554},
    555{
    556	.name = "rfc3686(ctr(aes))",
    557
    558	.uinfo = {
    559		.encr = {
    560			.geniv = "seqiv",
    561			.blockbits = 128,
    562			.defkeybits = 160, /* 128-bit key + 32-bit nonce */
    563		}
    564	},
    565
    566	.pfkey_supported = 1,
    567
    568	.desc = {
    569		.sadb_alg_id = SADB_X_EALG_AESCTR,
    570		.sadb_alg_ivlen	= 8,
    571		.sadb_alg_minbits = 160,
    572		.sadb_alg_maxbits = 288
    573	}
    574},
    575{
    576	.name = "cbc(sm4)",
    577	.compat = "sm4",
    578
    579	.uinfo = {
    580		.encr = {
    581			.geniv = "echainiv",
    582			.blockbits = 128,
    583			.defkeybits = 128,
    584		}
    585	},
    586
    587	.pfkey_supported = 1,
    588
    589	.desc = {
    590		.sadb_alg_id = SADB_X_EALG_SM4CBC,
    591		.sadb_alg_ivlen	= 16,
    592		.sadb_alg_minbits = 128,
    593		.sadb_alg_maxbits = 256
    594	}
    595},
    596};
    597
    598static struct xfrm_algo_desc calg_list[] = {
    599{
    600	.name = "deflate",
    601	.uinfo = {
    602		.comp = {
    603			.threshold = 90,
    604		}
    605	},
    606	.pfkey_supported = 1,
    607	.desc = { .sadb_alg_id = SADB_X_CALG_DEFLATE }
    608},
    609{
    610	.name = "lzs",
    611	.uinfo = {
    612		.comp = {
    613			.threshold = 90,
    614		}
    615	},
    616	.pfkey_supported = 1,
    617	.desc = { .sadb_alg_id = SADB_X_CALG_LZS }
    618},
    619{
    620	.name = "lzjh",
    621	.uinfo = {
    622		.comp = {
    623			.threshold = 50,
    624		}
    625	},
    626	.pfkey_supported = 1,
    627	.desc = { .sadb_alg_id = SADB_X_CALG_LZJH }
    628},
    629};
    630
    631static inline int aalg_entries(void)
    632{
    633	return ARRAY_SIZE(aalg_list);
    634}
    635
    636static inline int ealg_entries(void)
    637{
    638	return ARRAY_SIZE(ealg_list);
    639}
    640
    641static inline int calg_entries(void)
    642{
    643	return ARRAY_SIZE(calg_list);
    644}
    645
    646struct xfrm_algo_list {
    647	struct xfrm_algo_desc *algs;
    648	int entries;
    649	u32 type;
    650	u32 mask;
    651};
    652
    653static const struct xfrm_algo_list xfrm_aead_list = {
    654	.algs = aead_list,
    655	.entries = ARRAY_SIZE(aead_list),
    656	.type = CRYPTO_ALG_TYPE_AEAD,
    657	.mask = CRYPTO_ALG_TYPE_MASK,
    658};
    659
    660static const struct xfrm_algo_list xfrm_aalg_list = {
    661	.algs = aalg_list,
    662	.entries = ARRAY_SIZE(aalg_list),
    663	.type = CRYPTO_ALG_TYPE_HASH,
    664	.mask = CRYPTO_ALG_TYPE_HASH_MASK,
    665};
    666
    667static const struct xfrm_algo_list xfrm_ealg_list = {
    668	.algs = ealg_list,
    669	.entries = ARRAY_SIZE(ealg_list),
    670	.type = CRYPTO_ALG_TYPE_SKCIPHER,
    671	.mask = CRYPTO_ALG_TYPE_MASK,
    672};
    673
    674static const struct xfrm_algo_list xfrm_calg_list = {
    675	.algs = calg_list,
    676	.entries = ARRAY_SIZE(calg_list),
    677	.type = CRYPTO_ALG_TYPE_COMPRESS,
    678	.mask = CRYPTO_ALG_TYPE_MASK,
    679};
    680
    681static struct xfrm_algo_desc *xfrm_find_algo(
    682	const struct xfrm_algo_list *algo_list,
    683	int match(const struct xfrm_algo_desc *entry, const void *data),
    684	const void *data, int probe)
    685{
    686	struct xfrm_algo_desc *list = algo_list->algs;
    687	int i, status;
    688
    689	for (i = 0; i < algo_list->entries; i++) {
    690		if (!match(list + i, data))
    691			continue;
    692
    693		if (list[i].available)
    694			return &list[i];
    695
    696		if (!probe)
    697			break;
    698
    699		status = crypto_has_alg(list[i].name, algo_list->type,
    700					algo_list->mask);
    701		if (!status)
    702			break;
    703
    704		list[i].available = status;
    705		return &list[i];
    706	}
    707	return NULL;
    708}
    709
    710static int xfrm_alg_id_match(const struct xfrm_algo_desc *entry,
    711			     const void *data)
    712{
    713	return entry->desc.sadb_alg_id == (unsigned long)data;
    714}
    715
    716struct xfrm_algo_desc *xfrm_aalg_get_byid(int alg_id)
    717{
    718	return xfrm_find_algo(&xfrm_aalg_list, xfrm_alg_id_match,
    719			      (void *)(unsigned long)alg_id, 1);
    720}
    721EXPORT_SYMBOL_GPL(xfrm_aalg_get_byid);
    722
    723struct xfrm_algo_desc *xfrm_ealg_get_byid(int alg_id)
    724{
    725	return xfrm_find_algo(&xfrm_ealg_list, xfrm_alg_id_match,
    726			      (void *)(unsigned long)alg_id, 1);
    727}
    728EXPORT_SYMBOL_GPL(xfrm_ealg_get_byid);
    729
    730struct xfrm_algo_desc *xfrm_calg_get_byid(int alg_id)
    731{
    732	return xfrm_find_algo(&xfrm_calg_list, xfrm_alg_id_match,
    733			      (void *)(unsigned long)alg_id, 1);
    734}
    735EXPORT_SYMBOL_GPL(xfrm_calg_get_byid);
    736
    737static int xfrm_alg_name_match(const struct xfrm_algo_desc *entry,
    738			       const void *data)
    739{
    740	const char *name = data;
    741
    742	return name && (!strcmp(name, entry->name) ||
    743			(entry->compat && !strcmp(name, entry->compat)));
    744}
    745
    746struct xfrm_algo_desc *xfrm_aalg_get_byname(const char *name, int probe)
    747{
    748	return xfrm_find_algo(&xfrm_aalg_list, xfrm_alg_name_match, name,
    749			      probe);
    750}
    751EXPORT_SYMBOL_GPL(xfrm_aalg_get_byname);
    752
    753struct xfrm_algo_desc *xfrm_ealg_get_byname(const char *name, int probe)
    754{
    755	return xfrm_find_algo(&xfrm_ealg_list, xfrm_alg_name_match, name,
    756			      probe);
    757}
    758EXPORT_SYMBOL_GPL(xfrm_ealg_get_byname);
    759
    760struct xfrm_algo_desc *xfrm_calg_get_byname(const char *name, int probe)
    761{
    762	return xfrm_find_algo(&xfrm_calg_list, xfrm_alg_name_match, name,
    763			      probe);
    764}
    765EXPORT_SYMBOL_GPL(xfrm_calg_get_byname);
    766
    767struct xfrm_aead_name {
    768	const char *name;
    769	int icvbits;
    770};
    771
    772static int xfrm_aead_name_match(const struct xfrm_algo_desc *entry,
    773				const void *data)
    774{
    775	const struct xfrm_aead_name *aead = data;
    776	const char *name = aead->name;
    777
    778	return aead->icvbits == entry->uinfo.aead.icv_truncbits && name &&
    779	       !strcmp(name, entry->name);
    780}
    781
    782struct xfrm_algo_desc *xfrm_aead_get_byname(const char *name, int icv_len, int probe)
    783{
    784	struct xfrm_aead_name data = {
    785		.name = name,
    786		.icvbits = icv_len,
    787	};
    788
    789	return xfrm_find_algo(&xfrm_aead_list, xfrm_aead_name_match, &data,
    790			      probe);
    791}
    792EXPORT_SYMBOL_GPL(xfrm_aead_get_byname);
    793
    794struct xfrm_algo_desc *xfrm_aalg_get_byidx(unsigned int idx)
    795{
    796	if (idx >= aalg_entries())
    797		return NULL;
    798
    799	return &aalg_list[idx];
    800}
    801EXPORT_SYMBOL_GPL(xfrm_aalg_get_byidx);
    802
    803struct xfrm_algo_desc *xfrm_ealg_get_byidx(unsigned int idx)
    804{
    805	if (idx >= ealg_entries())
    806		return NULL;
    807
    808	return &ealg_list[idx];
    809}
    810EXPORT_SYMBOL_GPL(xfrm_ealg_get_byidx);
    811
    812/*
    813 * Probe for the availability of crypto algorithms, and set the available
    814 * flag for any algorithms found on the system.  This is typically called by
    815 * pfkey during userspace SA add, update or register.
    816 */
    817void xfrm_probe_algs(void)
    818{
    819	int i, status;
    820
    821	BUG_ON(in_softirq());
    822
    823	for (i = 0; i < aalg_entries(); i++) {
    824		status = crypto_has_ahash(aalg_list[i].name, 0, 0);
    825		if (aalg_list[i].available != status)
    826			aalg_list[i].available = status;
    827	}
    828
    829	for (i = 0; i < ealg_entries(); i++) {
    830		status = crypto_has_skcipher(ealg_list[i].name, 0, 0);
    831		if (ealg_list[i].available != status)
    832			ealg_list[i].available = status;
    833	}
    834
    835	for (i = 0; i < calg_entries(); i++) {
    836		status = crypto_has_comp(calg_list[i].name, 0,
    837					 CRYPTO_ALG_ASYNC);
    838		if (calg_list[i].available != status)
    839			calg_list[i].available = status;
    840	}
    841}
    842EXPORT_SYMBOL_GPL(xfrm_probe_algs);
    843
    844int xfrm_count_pfkey_auth_supported(void)
    845{
    846	int i, n;
    847
    848	for (i = 0, n = 0; i < aalg_entries(); i++)
    849		if (aalg_list[i].available && aalg_list[i].pfkey_supported)
    850			n++;
    851	return n;
    852}
    853EXPORT_SYMBOL_GPL(xfrm_count_pfkey_auth_supported);
    854
    855int xfrm_count_pfkey_enc_supported(void)
    856{
    857	int i, n;
    858
    859	for (i = 0, n = 0; i < ealg_entries(); i++)
    860		if (ealg_list[i].available && ealg_list[i].pfkey_supported)
    861			n++;
    862	return n;
    863}
    864EXPORT_SYMBOL_GPL(xfrm_count_pfkey_enc_supported);
    865
    866MODULE_LICENSE("GPL");