sha512.h 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * Cryptographic API.
  4. *
  5. * SHA-512 and SHA-384 Secure Hash Algorithm.
  6. *
  7. * Adapted for OCTEON by Aaro Koskinen <aaro.koskinen@iki.fi>.
  8. *
  9. * Based on crypto/sha512_generic.c, which is:
  10. *
  11. * Copyright (c) Jean-Luc Cooke <jlcooke@certainkey.com>
  12. * Copyright (c) Andrew McDonald <andrew@mcdonald.org.uk>
  13. * Copyright (c) 2003 Kyle McMartin <kyle@debian.org>
  14. */
  15. #include <asm/octeon/crypto.h>
  16. #include <asm/octeon/octeon.h>
  17. /*
  18. * We pass everything as 64-bit. OCTEON can handle misaligned data.
  19. */
  20. static void sha512_blocks(struct sha512_block_state *state,
  21. const u8 *data, size_t nblocks)
  22. {
  23. struct octeon_cop2_state cop2_state;
  24. unsigned long flags;
  25. if (!octeon_has_crypto())
  26. return sha512_blocks_generic(state, data, nblocks);
  27. flags = octeon_crypto_enable(&cop2_state);
  28. write_octeon_64bit_hash_sha512(state->h[0], 0);
  29. write_octeon_64bit_hash_sha512(state->h[1], 1);
  30. write_octeon_64bit_hash_sha512(state->h[2], 2);
  31. write_octeon_64bit_hash_sha512(state->h[3], 3);
  32. write_octeon_64bit_hash_sha512(state->h[4], 4);
  33. write_octeon_64bit_hash_sha512(state->h[5], 5);
  34. write_octeon_64bit_hash_sha512(state->h[6], 6);
  35. write_octeon_64bit_hash_sha512(state->h[7], 7);
  36. do {
  37. const u64 *block = (const u64 *)data;
  38. write_octeon_64bit_block_sha512(block[0], 0);
  39. write_octeon_64bit_block_sha512(block[1], 1);
  40. write_octeon_64bit_block_sha512(block[2], 2);
  41. write_octeon_64bit_block_sha512(block[3], 3);
  42. write_octeon_64bit_block_sha512(block[4], 4);
  43. write_octeon_64bit_block_sha512(block[5], 5);
  44. write_octeon_64bit_block_sha512(block[6], 6);
  45. write_octeon_64bit_block_sha512(block[7], 7);
  46. write_octeon_64bit_block_sha512(block[8], 8);
  47. write_octeon_64bit_block_sha512(block[9], 9);
  48. write_octeon_64bit_block_sha512(block[10], 10);
  49. write_octeon_64bit_block_sha512(block[11], 11);
  50. write_octeon_64bit_block_sha512(block[12], 12);
  51. write_octeon_64bit_block_sha512(block[13], 13);
  52. write_octeon_64bit_block_sha512(block[14], 14);
  53. octeon_sha512_start(block[15]);
  54. data += SHA512_BLOCK_SIZE;
  55. } while (--nblocks);
  56. state->h[0] = read_octeon_64bit_hash_sha512(0);
  57. state->h[1] = read_octeon_64bit_hash_sha512(1);
  58. state->h[2] = read_octeon_64bit_hash_sha512(2);
  59. state->h[3] = read_octeon_64bit_hash_sha512(3);
  60. state->h[4] = read_octeon_64bit_hash_sha512(4);
  61. state->h[5] = read_octeon_64bit_hash_sha512(5);
  62. state->h[6] = read_octeon_64bit_hash_sha512(6);
  63. state->h[7] = read_octeon_64bit_hash_sha512(7);
  64. octeon_crypto_disable(&cop2_state, flags);
  65. }