diff options
author | Stephan Mueller <smueller@chronox.de> | 2014-11-11 23:26:41 -0500 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2014-11-13 09:31:39 -0500 |
commit | 90240ffb127729713cd7d9c1b5c1c0c9451681cd (patch) | |
tree | 9939c24279e6f7491682619fda25431bf64e86ed /include/crypto | |
parent | 5d8c723f61f2e6dacbd02d80a516115993c4f292 (diff) |
crypto: doc - AHASH API documentation
The API function calls exported by the kernel crypto API for AHASHes
to be used by consumers are documented.
Signed-off-by: Stephan Mueller <smueller@chronox.de>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'include/crypto')
-rw-r--r-- | include/crypto/hash.h | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/include/crypto/hash.h b/include/crypto/hash.h index bf458fc272aa..b2c193acc1ab 100644 --- a/include/crypto/hash.h +++ b/include/crypto/hash.h | |||
@@ -202,11 +202,35 @@ struct crypto_shash { | |||
202 | struct crypto_tfm base; | 202 | struct crypto_tfm base; |
203 | }; | 203 | }; |
204 | 204 | ||
205 | /** | ||
206 | * DOC: Asynchronous Message Digest API | ||
207 | * | ||
208 | * The asynchronous message digest API is used with the ciphers of type | ||
209 | * CRYPTO_ALG_TYPE_AHASH (listed as type "ahash" in /proc/crypto) | ||
210 | * | ||
211 | * The asynchronous cipher operation discussion provided for the | ||
212 | * CRYPTO_ALG_TYPE_ABLKCIPHER API applies here as well. | ||
213 | */ | ||
214 | |||
205 | static inline struct crypto_ahash *__crypto_ahash_cast(struct crypto_tfm *tfm) | 215 | static inline struct crypto_ahash *__crypto_ahash_cast(struct crypto_tfm *tfm) |
206 | { | 216 | { |
207 | return container_of(tfm, struct crypto_ahash, base); | 217 | return container_of(tfm, struct crypto_ahash, base); |
208 | } | 218 | } |
209 | 219 | ||
220 | /** | ||
221 | * crypto_alloc_ahash() - allocate ahash cipher handle | ||
222 | * @alg_name: is the cra_name / name or cra_driver_name / driver name of the | ||
223 | * ahash cipher | ||
224 | * @type: specifies the type of the cipher | ||
225 | * @mask: specifies the mask for the cipher | ||
226 | * | ||
227 | * Allocate a cipher handle for an ahash. The returned struct | ||
228 | * crypto_ahash is the cipher handle that is required for any subsequent | ||
229 | * API invocation for that ahash. | ||
230 | * | ||
231 | * Return: allocated cipher handle in case of success; IS_ERR() is true in case | ||
232 | * of an error, PTR_ERR() returns the error code. | ||
233 | */ | ||
210 | struct crypto_ahash *crypto_alloc_ahash(const char *alg_name, u32 type, | 234 | struct crypto_ahash *crypto_alloc_ahash(const char *alg_name, u32 type, |
211 | u32 mask); | 235 | u32 mask); |
212 | 236 | ||
@@ -215,6 +239,10 @@ static inline struct crypto_tfm *crypto_ahash_tfm(struct crypto_ahash *tfm) | |||
215 | return &tfm->base; | 239 | return &tfm->base; |
216 | } | 240 | } |
217 | 241 | ||
242 | /** | ||
243 | * crypto_free_ahash() - zeroize and free the ahash handle | ||
244 | * @tfm: cipher handle to be freed | ||
245 | */ | ||
218 | static inline void crypto_free_ahash(struct crypto_ahash *tfm) | 246 | static inline void crypto_free_ahash(struct crypto_ahash *tfm) |
219 | { | 247 | { |
220 | crypto_destroy_tfm(tfm, crypto_ahash_tfm(tfm)); | 248 | crypto_destroy_tfm(tfm, crypto_ahash_tfm(tfm)); |
@@ -238,6 +266,16 @@ static inline struct hash_alg_common *crypto_hash_alg_common( | |||
238 | return __crypto_hash_alg_common(crypto_ahash_tfm(tfm)->__crt_alg); | 266 | return __crypto_hash_alg_common(crypto_ahash_tfm(tfm)->__crt_alg); |
239 | } | 267 | } |
240 | 268 | ||
269 | /** | ||
270 | * crypto_ahash_digestsize() - obtain message digest size | ||
271 | * @tfm: cipher handle | ||
272 | * | ||
273 | * The size for the message digest created by the message digest cipher | ||
274 | * referenced with the cipher handle is returned. | ||
275 | * | ||
276 | * | ||
277 | * Return: message digest size of cipher | ||
278 | */ | ||
241 | static inline unsigned int crypto_ahash_digestsize(struct crypto_ahash *tfm) | 279 | static inline unsigned int crypto_ahash_digestsize(struct crypto_ahash *tfm) |
242 | { | 280 | { |
243 | return crypto_hash_alg_common(tfm)->digestsize; | 281 | return crypto_hash_alg_common(tfm)->digestsize; |
@@ -263,12 +301,32 @@ static inline void crypto_ahash_clear_flags(struct crypto_ahash *tfm, u32 flags) | |||
263 | crypto_tfm_clear_flags(crypto_ahash_tfm(tfm), flags); | 301 | crypto_tfm_clear_flags(crypto_ahash_tfm(tfm), flags); |
264 | } | 302 | } |
265 | 303 | ||
304 | /** | ||
305 | * crypto_ahash_reqtfm() - obtain cipher handle from request | ||
306 | * @req: asynchronous request handle that contains the reference to the ahash | ||
307 | * cipher handle | ||
308 | * | ||
309 | * Return the ahash cipher handle that is registered with the asynchronous | ||
310 | * request handle ahash_request. | ||
311 | * | ||
312 | * Return: ahash cipher handle | ||
313 | */ | ||
266 | static inline struct crypto_ahash *crypto_ahash_reqtfm( | 314 | static inline struct crypto_ahash *crypto_ahash_reqtfm( |
267 | struct ahash_request *req) | 315 | struct ahash_request *req) |
268 | { | 316 | { |
269 | return __crypto_ahash_cast(req->base.tfm); | 317 | return __crypto_ahash_cast(req->base.tfm); |
270 | } | 318 | } |
271 | 319 | ||
320 | /** | ||
321 | * crypto_ahash_reqsize() - obtain size of the request data structure | ||
322 | * @tfm: cipher handle | ||
323 | * | ||
324 | * Return the size of the ahash state size. With the crypto_ahash_export | ||
325 | * function, the caller can export the state into a buffer whose size is | ||
326 | * defined with this function. | ||
327 | * | ||
328 | * Return: size of the ahash state | ||
329 | */ | ||
272 | static inline unsigned int crypto_ahash_reqsize(struct crypto_ahash *tfm) | 330 | static inline unsigned int crypto_ahash_reqsize(struct crypto_ahash *tfm) |
273 | { | 331 | { |
274 | return tfm->reqsize; | 332 | return tfm->reqsize; |
@@ -279,38 +337,166 @@ static inline void *ahash_request_ctx(struct ahash_request *req) | |||
279 | return req->__ctx; | 337 | return req->__ctx; |
280 | } | 338 | } |
281 | 339 | ||
340 | /** | ||
341 | * crypto_ahash_setkey - set key for cipher handle | ||
342 | * @tfm: cipher handle | ||
343 | * @key: buffer holding the key | ||
344 | * @keylen: length of the key in bytes | ||
345 | * | ||
346 | * The caller provided key is set for the ahash cipher. The cipher | ||
347 | * handle must point to a keyed hash in order for this function to succeed. | ||
348 | * | ||
349 | * Return: 0 if the setting of the key was successful; < 0 if an error occurred | ||
350 | */ | ||
282 | int crypto_ahash_setkey(struct crypto_ahash *tfm, const u8 *key, | 351 | int crypto_ahash_setkey(struct crypto_ahash *tfm, const u8 *key, |
283 | unsigned int keylen); | 352 | unsigned int keylen); |
353 | |||
354 | /** | ||
355 | * crypto_ahash_finup() - update and finalize message digest | ||
356 | * @req: reference to the ahash_request handle that holds all information | ||
357 | * needed to perform the cipher operation | ||
358 | * | ||
359 | * This function is a "short-hand" for the function calls of | ||
360 | * crypto_ahash_update and crypto_shash_final. The parameters have the same | ||
361 | * meaning as discussed for those separate functions. | ||
362 | * | ||
363 | * Return: 0 if the message digest creation was successful; < 0 if an error | ||
364 | * occurred | ||
365 | */ | ||
284 | int crypto_ahash_finup(struct ahash_request *req); | 366 | int crypto_ahash_finup(struct ahash_request *req); |
367 | |||
368 | /** | ||
369 | * crypto_ahash_final() - calculate message digest | ||
370 | * @req: reference to the ahash_request handle that holds all information | ||
371 | * needed to perform the cipher operation | ||
372 | * | ||
373 | * Finalize the message digest operation and create the message digest | ||
374 | * based on all data added to the cipher handle. The message digest is placed | ||
375 | * into the output buffer registered with the ahash_request handle. | ||
376 | * | ||
377 | * Return: 0 if the message digest creation was successful; < 0 if an error | ||
378 | * occurred | ||
379 | */ | ||
285 | int crypto_ahash_final(struct ahash_request *req); | 380 | int crypto_ahash_final(struct ahash_request *req); |
381 | |||
382 | /** | ||
383 | * crypto_ahash_digest() - calculate message digest for a buffer | ||
384 | * @req: reference to the ahash_request handle that holds all information | ||
385 | * needed to perform the cipher operation | ||
386 | * | ||
387 | * This function is a "short-hand" for the function calls of crypto_ahash_init, | ||
388 | * crypto_ahash_update and crypto_ahash_final. The parameters have the same | ||
389 | * meaning as discussed for those separate three functions. | ||
390 | * | ||
391 | * Return: 0 if the message digest creation was successful; < 0 if an error | ||
392 | * occurred | ||
393 | */ | ||
286 | int crypto_ahash_digest(struct ahash_request *req); | 394 | int crypto_ahash_digest(struct ahash_request *req); |
287 | 395 | ||
396 | /** | ||
397 | * crypto_ahash_export() - extract current message digest state | ||
398 | * @req: reference to the ahash_request handle whose state is exported | ||
399 | * @out: output buffer of sufficient size that can hold the hash state | ||
400 | * | ||
401 | * This function exports the hash state of the ahash_request handle into the | ||
402 | * caller-allocated output buffer out which must have sufficient size (e.g. by | ||
403 | * calling crypto_ahash_reqsize). | ||
404 | * | ||
405 | * Return: 0 if the export was successful; < 0 if an error occurred | ||
406 | */ | ||
288 | static inline int crypto_ahash_export(struct ahash_request *req, void *out) | 407 | static inline int crypto_ahash_export(struct ahash_request *req, void *out) |
289 | { | 408 | { |
290 | return crypto_ahash_reqtfm(req)->export(req, out); | 409 | return crypto_ahash_reqtfm(req)->export(req, out); |
291 | } | 410 | } |
292 | 411 | ||
412 | /** | ||
413 | * crypto_ahash_import() - import message digest state | ||
414 | * @req: reference to ahash_request handle the state is imported into | ||
415 | * @in: buffer holding the state | ||
416 | * | ||
417 | * This function imports the hash state into the ahash_request handle from the | ||
418 | * input buffer. That buffer should have been generated with the | ||
419 | * crypto_ahash_export function. | ||
420 | * | ||
421 | * Return: 0 if the import was successful; < 0 if an error occurred | ||
422 | */ | ||
293 | static inline int crypto_ahash_import(struct ahash_request *req, const void *in) | 423 | static inline int crypto_ahash_import(struct ahash_request *req, const void *in) |
294 | { | 424 | { |
295 | return crypto_ahash_reqtfm(req)->import(req, in); | 425 | return crypto_ahash_reqtfm(req)->import(req, in); |
296 | } | 426 | } |
297 | 427 | ||
428 | /** | ||
429 | * crypto_ahash_init() - (re)initialize message digest handle | ||
430 | * @req: ahash_request handle that already is initialized with all necessary | ||
431 | * data using the ahash_request_* API functions | ||
432 | * | ||
433 | * The call (re-)initializes the message digest referenced by the ahash_request | ||
434 | * handle. Any potentially existing state created by previous operations is | ||
435 | * discarded. | ||
436 | * | ||
437 | * Return: 0 if the message digest initialization was successful; < 0 if an | ||
438 | * error occurred | ||
439 | */ | ||
298 | static inline int crypto_ahash_init(struct ahash_request *req) | 440 | static inline int crypto_ahash_init(struct ahash_request *req) |
299 | { | 441 | { |
300 | return crypto_ahash_reqtfm(req)->init(req); | 442 | return crypto_ahash_reqtfm(req)->init(req); |
301 | } | 443 | } |
302 | 444 | ||
445 | /** | ||
446 | * crypto_ahash_update() - add data to message digest for processing | ||
447 | * @req: ahash_request handle that was previously initialized with the | ||
448 | * crypto_ahash_init call. | ||
449 | * | ||
450 | * Updates the message digest state of the &ahash_request handle. The input data | ||
451 | * is pointed to by the scatter/gather list registered in the &ahash_request | ||
452 | * handle | ||
453 | * | ||
454 | * Return: 0 if the message digest update was successful; < 0 if an error | ||
455 | * occurred | ||
456 | */ | ||
303 | static inline int crypto_ahash_update(struct ahash_request *req) | 457 | static inline int crypto_ahash_update(struct ahash_request *req) |
304 | { | 458 | { |
305 | return crypto_ahash_reqtfm(req)->update(req); | 459 | return crypto_ahash_reqtfm(req)->update(req); |
306 | } | 460 | } |
307 | 461 | ||
462 | /** | ||
463 | * DOC: Asynchronous Hash Request Handle | ||
464 | * | ||
465 | * The &ahash_request data structure contains all pointers to data | ||
466 | * required for the asynchronous cipher operation. This includes the cipher | ||
467 | * handle (which can be used by multiple &ahash_request instances), pointer | ||
468 | * to plaintext and the message digest output buffer, asynchronous callback | ||
469 | * function, etc. It acts as a handle to the ahash_request_* API calls in a | ||
470 | * similar way as ahash handle to the crypto_ahash_* API calls. | ||
471 | */ | ||
472 | |||
473 | /** | ||
474 | * ahash_request_set_tfm() - update cipher handle reference in request | ||
475 | * @req: request handle to be modified | ||
476 | * @tfm: cipher handle that shall be added to the request handle | ||
477 | * | ||
478 | * Allow the caller to replace the existing ahash handle in the request | ||
479 | * data structure with a different one. | ||
480 | */ | ||
308 | static inline void ahash_request_set_tfm(struct ahash_request *req, | 481 | static inline void ahash_request_set_tfm(struct ahash_request *req, |
309 | struct crypto_ahash *tfm) | 482 | struct crypto_ahash *tfm) |
310 | { | 483 | { |
311 | req->base.tfm = crypto_ahash_tfm(tfm); | 484 | req->base.tfm = crypto_ahash_tfm(tfm); |
312 | } | 485 | } |
313 | 486 | ||
487 | /** | ||
488 | * ahash_request_alloc() - allocate request data structure | ||
489 | * @tfm: cipher handle to be registered with the request | ||
490 | * @gfp: memory allocation flag that is handed to kmalloc by the API call. | ||
491 | * | ||
492 | * Allocate the request data structure that must be used with the ahash | ||
493 | * message digest API calls. During | ||
494 | * the allocation, the provided ahash handle | ||
495 | * is registered in the request data structure. | ||
496 | * | ||
497 | * Return: allocated request handle in case of success; IS_ERR() is true in case | ||
498 | * of an error, PTR_ERR() returns the error code. | ||
499 | */ | ||
314 | static inline struct ahash_request *ahash_request_alloc( | 500 | static inline struct ahash_request *ahash_request_alloc( |
315 | struct crypto_ahash *tfm, gfp_t gfp) | 501 | struct crypto_ahash *tfm, gfp_t gfp) |
316 | { | 502 | { |
@@ -325,6 +511,10 @@ static inline struct ahash_request *ahash_request_alloc( | |||
325 | return req; | 511 | return req; |
326 | } | 512 | } |
327 | 513 | ||
514 | /** | ||
515 | * ahash_request_free() - zeroize and free the request data structure | ||
516 | * @req: request data structure cipher handle to be freed | ||
517 | */ | ||
328 | static inline void ahash_request_free(struct ahash_request *req) | 518 | static inline void ahash_request_free(struct ahash_request *req) |
329 | { | 519 | { |
330 | kzfree(req); | 520 | kzfree(req); |
@@ -336,6 +526,31 @@ static inline struct ahash_request *ahash_request_cast( | |||
336 | return container_of(req, struct ahash_request, base); | 526 | return container_of(req, struct ahash_request, base); |
337 | } | 527 | } |
338 | 528 | ||
529 | /** | ||
530 | * ahash_request_set_callback() - set asynchronous callback function | ||
531 | * @req: request handle | ||
532 | * @flags: specify zero or an ORing of the flags | ||
533 | * CRYPTO_TFM_REQ_MAY_BACKLOG the request queue may back log and | ||
534 | * increase the wait queue beyond the initial maximum size; | ||
535 | * CRYPTO_TFM_REQ_MAY_SLEEP the request processing may sleep | ||
536 | * @compl: callback function pointer to be registered with the request handle | ||
537 | * @data: The data pointer refers to memory that is not used by the kernel | ||
538 | * crypto API, but provided to the callback function for it to use. Here, | ||
539 | * the caller can provide a reference to memory the callback function can | ||
540 | * operate on. As the callback function is invoked asynchronously to the | ||
541 | * related functionality, it may need to access data structures of the | ||
542 | * related functionality which can be referenced using this pointer. The | ||
543 | * callback function can access the memory via the "data" field in the | ||
544 | * &crypto_async_request data structure provided to the callback function. | ||
545 | * | ||
546 | * This function allows setting the callback function that is triggered once | ||
547 | * the cipher operation completes. | ||
548 | * | ||
549 | * The callback function is registered with the &ahash_request handle and | ||
550 | * must comply with the following template | ||
551 | * | ||
552 | * void callback_function(struct crypto_async_request *req, int error) | ||
553 | */ | ||
339 | static inline void ahash_request_set_callback(struct ahash_request *req, | 554 | static inline void ahash_request_set_callback(struct ahash_request *req, |
340 | u32 flags, | 555 | u32 flags, |
341 | crypto_completion_t compl, | 556 | crypto_completion_t compl, |
@@ -346,6 +561,19 @@ static inline void ahash_request_set_callback(struct ahash_request *req, | |||
346 | req->base.flags = flags; | 561 | req->base.flags = flags; |
347 | } | 562 | } |
348 | 563 | ||
564 | /** | ||
565 | * ahash_request_set_crypt() - set data buffers | ||
566 | * @req: ahash_request handle to be updated | ||
567 | * @src: source scatter/gather list | ||
568 | * @result: buffer that is filled with the message digest -- the caller must | ||
569 | * ensure that the buffer has sufficient space by, for example, calling | ||
570 | * crypto_ahash_digestsize() | ||
571 | * @nbytes: number of bytes to process from the source scatter/gather list | ||
572 | * | ||
573 | * By using this call, the caller references the source scatter/gather list. | ||
574 | * The source scatter/gather list points to the data the message digest is to | ||
575 | * be calculated for. | ||
576 | */ | ||
349 | static inline void ahash_request_set_crypt(struct ahash_request *req, | 577 | static inline void ahash_request_set_crypt(struct ahash_request *req, |
350 | struct scatterlist *src, u8 *result, | 578 | struct scatterlist *src, u8 *result, |
351 | unsigned int nbytes) | 579 | unsigned int nbytes) |