diff options
author | Loc Ho <lho@amcc.com> | 2008-05-14 08:41:47 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2008-07-10 08:35:13 -0400 |
commit | 004a403c2e954734090a69aedc7f4f822bdcc142 (patch) | |
tree | e8fadd76113132126e308e01e7cd7cdf6b9d44d6 /include/linux/crypto.h | |
parent | 534fe2c1c3ffbbc3db66dba0783c82d3b345fd33 (diff) |
[CRYPTO] hash: Add asynchronous hash support
This patch adds asynchronous hash and digest support.
Signed-off-by: Loc Ho <lho@amcc.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'include/linux/crypto.h')
-rw-r--r-- | include/linux/crypto.h | 187 |
1 files changed, 183 insertions, 4 deletions
diff --git a/include/linux/crypto.h b/include/linux/crypto.h index 425824bd49f3..b6efe569128d 100644 --- a/include/linux/crypto.h +++ b/include/linux/crypto.h | |||
@@ -30,15 +30,17 @@ | |||
30 | */ | 30 | */ |
31 | #define CRYPTO_ALG_TYPE_MASK 0x0000000f | 31 | #define CRYPTO_ALG_TYPE_MASK 0x0000000f |
32 | #define CRYPTO_ALG_TYPE_CIPHER 0x00000001 | 32 | #define CRYPTO_ALG_TYPE_CIPHER 0x00000001 |
33 | #define CRYPTO_ALG_TYPE_DIGEST 0x00000002 | 33 | #define CRYPTO_ALG_TYPE_COMPRESS 0x00000002 |
34 | #define CRYPTO_ALG_TYPE_HASH 0x00000003 | 34 | #define CRYPTO_ALG_TYPE_AEAD 0x00000003 |
35 | #define CRYPTO_ALG_TYPE_BLKCIPHER 0x00000004 | 35 | #define CRYPTO_ALG_TYPE_BLKCIPHER 0x00000004 |
36 | #define CRYPTO_ALG_TYPE_ABLKCIPHER 0x00000005 | 36 | #define CRYPTO_ALG_TYPE_ABLKCIPHER 0x00000005 |
37 | #define CRYPTO_ALG_TYPE_GIVCIPHER 0x00000006 | 37 | #define CRYPTO_ALG_TYPE_GIVCIPHER 0x00000006 |
38 | #define CRYPTO_ALG_TYPE_COMPRESS 0x00000008 | 38 | #define CRYPTO_ALG_TYPE_DIGEST 0x00000008 |
39 | #define CRYPTO_ALG_TYPE_AEAD 0x00000009 | 39 | #define CRYPTO_ALG_TYPE_HASH 0x00000009 |
40 | #define CRYPTO_ALG_TYPE_AHASH 0x0000000a | ||
40 | 41 | ||
41 | #define CRYPTO_ALG_TYPE_HASH_MASK 0x0000000e | 42 | #define CRYPTO_ALG_TYPE_HASH_MASK 0x0000000e |
43 | #define CRYPTO_ALG_TYPE_AHASH_MASK 0x0000000c | ||
42 | #define CRYPTO_ALG_TYPE_BLKCIPHER_MASK 0x0000000c | 44 | #define CRYPTO_ALG_TYPE_BLKCIPHER_MASK 0x0000000c |
43 | 45 | ||
44 | #define CRYPTO_ALG_LARVAL 0x00000010 | 46 | #define CRYPTO_ALG_LARVAL 0x00000010 |
@@ -102,6 +104,7 @@ struct crypto_async_request; | |||
102 | struct crypto_aead; | 104 | struct crypto_aead; |
103 | struct crypto_blkcipher; | 105 | struct crypto_blkcipher; |
104 | struct crypto_hash; | 106 | struct crypto_hash; |
107 | struct crypto_ahash; | ||
105 | struct crypto_tfm; | 108 | struct crypto_tfm; |
106 | struct crypto_type; | 109 | struct crypto_type; |
107 | struct aead_givcrypt_request; | 110 | struct aead_givcrypt_request; |
@@ -131,6 +134,18 @@ struct ablkcipher_request { | |||
131 | void *__ctx[] CRYPTO_MINALIGN_ATTR; | 134 | void *__ctx[] CRYPTO_MINALIGN_ATTR; |
132 | }; | 135 | }; |
133 | 136 | ||
137 | struct ahash_request { | ||
138 | struct crypto_async_request base; | ||
139 | |||
140 | void *info; | ||
141 | |||
142 | unsigned int nbytes; | ||
143 | struct scatterlist *src; | ||
144 | u8 *result; | ||
145 | |||
146 | void *__ctx[] CRYPTO_MINALIGN_ATTR; | ||
147 | }; | ||
148 | |||
134 | /** | 149 | /** |
135 | * struct aead_request - AEAD request | 150 | * struct aead_request - AEAD request |
136 | * @base: Common attributes for async crypto requests | 151 | * @base: Common attributes for async crypto requests |
@@ -195,6 +210,17 @@ struct ablkcipher_alg { | |||
195 | unsigned int ivsize; | 210 | unsigned int ivsize; |
196 | }; | 211 | }; |
197 | 212 | ||
213 | struct ahash_alg { | ||
214 | int (*init)(struct ahash_request *req); | ||
215 | int (*update)(struct ahash_request *req); | ||
216 | int (*final)(struct ahash_request *req); | ||
217 | int (*digest)(struct ahash_request *req); | ||
218 | int (*setkey)(struct crypto_ahash *tfm, const u8 *key, | ||
219 | unsigned int keylen); | ||
220 | |||
221 | unsigned int digestsize; | ||
222 | }; | ||
223 | |||
198 | struct aead_alg { | 224 | struct aead_alg { |
199 | int (*setkey)(struct crypto_aead *tfm, const u8 *key, | 225 | int (*setkey)(struct crypto_aead *tfm, const u8 *key, |
200 | unsigned int keylen); | 226 | unsigned int keylen); |
@@ -272,6 +298,7 @@ struct compress_alg { | |||
272 | #define cra_cipher cra_u.cipher | 298 | #define cra_cipher cra_u.cipher |
273 | #define cra_digest cra_u.digest | 299 | #define cra_digest cra_u.digest |
274 | #define cra_hash cra_u.hash | 300 | #define cra_hash cra_u.hash |
301 | #define cra_ahash cra_u.ahash | ||
275 | #define cra_compress cra_u.compress | 302 | #define cra_compress cra_u.compress |
276 | 303 | ||
277 | struct crypto_alg { | 304 | struct crypto_alg { |
@@ -298,6 +325,7 @@ struct crypto_alg { | |||
298 | struct cipher_alg cipher; | 325 | struct cipher_alg cipher; |
299 | struct digest_alg digest; | 326 | struct digest_alg digest; |
300 | struct hash_alg hash; | 327 | struct hash_alg hash; |
328 | struct ahash_alg ahash; | ||
301 | struct compress_alg compress; | 329 | struct compress_alg compress; |
302 | } cra_u; | 330 | } cra_u; |
303 | 331 | ||
@@ -383,6 +411,19 @@ struct hash_tfm { | |||
383 | unsigned int digestsize; | 411 | unsigned int digestsize; |
384 | }; | 412 | }; |
385 | 413 | ||
414 | struct ahash_tfm { | ||
415 | int (*init)(struct ahash_request *req); | ||
416 | int (*update)(struct ahash_request *req); | ||
417 | int (*final)(struct ahash_request *req); | ||
418 | int (*digest)(struct ahash_request *req); | ||
419 | int (*setkey)(struct crypto_ahash *tfm, const u8 *key, | ||
420 | unsigned int keylen); | ||
421 | |||
422 | unsigned int digestsize; | ||
423 | struct crypto_ahash *base; | ||
424 | unsigned int reqsize; | ||
425 | }; | ||
426 | |||
386 | struct compress_tfm { | 427 | struct compress_tfm { |
387 | int (*cot_compress)(struct crypto_tfm *tfm, | 428 | int (*cot_compress)(struct crypto_tfm *tfm, |
388 | const u8 *src, unsigned int slen, | 429 | const u8 *src, unsigned int slen, |
@@ -397,6 +438,7 @@ struct compress_tfm { | |||
397 | #define crt_blkcipher crt_u.blkcipher | 438 | #define crt_blkcipher crt_u.blkcipher |
398 | #define crt_cipher crt_u.cipher | 439 | #define crt_cipher crt_u.cipher |
399 | #define crt_hash crt_u.hash | 440 | #define crt_hash crt_u.hash |
441 | #define crt_ahash crt_u.ahash | ||
400 | #define crt_compress crt_u.compress | 442 | #define crt_compress crt_u.compress |
401 | 443 | ||
402 | struct crypto_tfm { | 444 | struct crypto_tfm { |
@@ -409,6 +451,7 @@ struct crypto_tfm { | |||
409 | struct blkcipher_tfm blkcipher; | 451 | struct blkcipher_tfm blkcipher; |
410 | struct cipher_tfm cipher; | 452 | struct cipher_tfm cipher; |
411 | struct hash_tfm hash; | 453 | struct hash_tfm hash; |
454 | struct ahash_tfm ahash; | ||
412 | struct compress_tfm compress; | 455 | struct compress_tfm compress; |
413 | } crt_u; | 456 | } crt_u; |
414 | 457 | ||
@@ -441,6 +484,10 @@ struct crypto_hash { | |||
441 | struct crypto_tfm base; | 484 | struct crypto_tfm base; |
442 | }; | 485 | }; |
443 | 486 | ||
487 | struct crypto_ahash { | ||
488 | struct crypto_tfm base; | ||
489 | }; | ||
490 | |||
444 | enum { | 491 | enum { |
445 | CRYPTOA_UNSPEC, | 492 | CRYPTOA_UNSPEC, |
446 | CRYPTOA_ALG, | 493 | CRYPTOA_ALG, |
@@ -1264,5 +1311,137 @@ static inline int crypto_comp_decompress(struct crypto_comp *tfm, | |||
1264 | src, slen, dst, dlen); | 1311 | src, slen, dst, dlen); |
1265 | } | 1312 | } |
1266 | 1313 | ||
1314 | static inline struct crypto_ahash *__crypto_ahash_cast(struct crypto_tfm *tfm) | ||
1315 | { | ||
1316 | return (struct crypto_ahash *)tfm; | ||
1317 | } | ||
1318 | |||
1319 | static inline struct crypto_ahash *crypto_alloc_ahash(const char *alg_name, | ||
1320 | u32 type, u32 mask) | ||
1321 | { | ||
1322 | type &= ~CRYPTO_ALG_TYPE_MASK; | ||
1323 | mask &= ~CRYPTO_ALG_TYPE_MASK; | ||
1324 | type |= CRYPTO_ALG_TYPE_AHASH; | ||
1325 | mask |= CRYPTO_ALG_TYPE_AHASH_MASK; | ||
1326 | |||
1327 | return __crypto_ahash_cast(crypto_alloc_base(alg_name, type, mask)); | ||
1328 | } | ||
1329 | |||
1330 | static inline struct crypto_tfm *crypto_ahash_tfm(struct crypto_ahash *tfm) | ||
1331 | { | ||
1332 | return &tfm->base; | ||
1333 | } | ||
1334 | |||
1335 | static inline void crypto_free_ahash(struct crypto_ahash *tfm) | ||
1336 | { | ||
1337 | crypto_free_tfm(crypto_ahash_tfm(tfm)); | ||
1338 | } | ||
1339 | |||
1340 | static inline unsigned int crypto_ahash_alignmask( | ||
1341 | struct crypto_ahash *tfm) | ||
1342 | { | ||
1343 | return crypto_tfm_alg_alignmask(crypto_ahash_tfm(tfm)); | ||
1344 | } | ||
1345 | |||
1346 | static inline struct ahash_tfm *crypto_ahash_crt(struct crypto_ahash *tfm) | ||
1347 | { | ||
1348 | return &crypto_ahash_tfm(tfm)->crt_ahash; | ||
1349 | } | ||
1350 | |||
1351 | static inline unsigned int crypto_ahash_digestsize(struct crypto_ahash *tfm) | ||
1352 | { | ||
1353 | return crypto_ahash_crt(tfm)->digestsize; | ||
1354 | } | ||
1355 | |||
1356 | static inline u32 crypto_ahash_get_flags(struct crypto_ahash *tfm) | ||
1357 | { | ||
1358 | return crypto_tfm_get_flags(crypto_ahash_tfm(tfm)); | ||
1359 | } | ||
1360 | |||
1361 | static inline void crypto_ahash_set_flags(struct crypto_ahash *tfm, u32 flags) | ||
1362 | { | ||
1363 | crypto_tfm_set_flags(crypto_ahash_tfm(tfm), flags); | ||
1364 | } | ||
1365 | |||
1366 | static inline void crypto_ahash_clear_flags(struct crypto_ahash *tfm, u32 flags) | ||
1367 | { | ||
1368 | crypto_tfm_clear_flags(crypto_ahash_tfm(tfm), flags); | ||
1369 | } | ||
1370 | |||
1371 | static inline struct crypto_ahash *crypto_ahash_reqtfm( | ||
1372 | struct ahash_request *req) | ||
1373 | { | ||
1374 | return __crypto_ahash_cast(req->base.tfm); | ||
1375 | } | ||
1376 | |||
1377 | static inline unsigned int crypto_ahash_reqsize(struct crypto_ahash *tfm) | ||
1378 | { | ||
1379 | return crypto_ahash_crt(tfm)->reqsize; | ||
1380 | } | ||
1381 | |||
1382 | static inline int crypto_ahash_setkey(struct crypto_ahash *tfm, | ||
1383 | const u8 *key, unsigned int keylen) | ||
1384 | { | ||
1385 | struct ahash_tfm *crt = crypto_ahash_crt(tfm); | ||
1386 | |||
1387 | return crt->setkey(crt->base, key, keylen); | ||
1388 | } | ||
1389 | |||
1390 | static inline int crypto_ahash_digest(struct ahash_request *req) | ||
1391 | { | ||
1392 | struct ahash_tfm *crt = crypto_ahash_crt(crypto_ahash_reqtfm(req)); | ||
1393 | return crt->digest(req); | ||
1394 | } | ||
1395 | |||
1396 | static inline void ahash_request_set_tfm(struct ahash_request *req, | ||
1397 | struct crypto_ahash *tfm) | ||
1398 | { | ||
1399 | req->base.tfm = crypto_ahash_tfm(crypto_ahash_crt(tfm)->base); | ||
1400 | } | ||
1401 | |||
1402 | static inline struct ahash_request *ahash_request_alloc( | ||
1403 | struct crypto_ahash *tfm, gfp_t gfp) | ||
1404 | { | ||
1405 | struct ahash_request *req; | ||
1406 | |||
1407 | req = kmalloc(sizeof(struct ahash_request) + | ||
1408 | crypto_ahash_reqsize(tfm), gfp); | ||
1409 | |||
1410 | if (likely(req)) | ||
1411 | ahash_request_set_tfm(req, tfm); | ||
1412 | |||
1413 | return req; | ||
1414 | } | ||
1415 | |||
1416 | static inline void ahash_request_free(struct ahash_request *req) | ||
1417 | { | ||
1418 | kfree(req); | ||
1419 | } | ||
1420 | |||
1421 | static inline struct ahash_request *ahash_request_cast( | ||
1422 | struct crypto_async_request *req) | ||
1423 | { | ||
1424 | return container_of(req, struct ahash_request, base); | ||
1425 | } | ||
1426 | |||
1427 | static inline void ahash_request_set_callback(struct ahash_request *req, | ||
1428 | u32 flags, | ||
1429 | crypto_completion_t complete, | ||
1430 | void *data) | ||
1431 | { | ||
1432 | req->base.complete = complete; | ||
1433 | req->base.data = data; | ||
1434 | req->base.flags = flags; | ||
1435 | } | ||
1436 | |||
1437 | static inline void ahash_request_set_crypt(struct ahash_request *req, | ||
1438 | struct scatterlist *src, u8 *result, | ||
1439 | unsigned int nbytes) | ||
1440 | { | ||
1441 | req->src = src; | ||
1442 | req->nbytes = nbytes; | ||
1443 | req->result = result; | ||
1444 | } | ||
1445 | |||
1267 | #endif /* _LINUX_CRYPTO_H */ | 1446 | #endif /* _LINUX_CRYPTO_H */ |
1268 | 1447 | ||