sha2-ce-core.S 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /*
  2. * sha2-ce-core.S - SHA-224/256 secure hash using ARMv8 Crypto Extensions
  3. *
  4. * Copyright (C) 2015 Linaro Ltd.
  5. * Author: Ard Biesheuvel <ard.biesheuvel@linaro.org>
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License version 2 as
  9. * published by the Free Software Foundation.
  10. */
  11. #include <linux/linkage.h>
  12. #include <asm/assembler.h>
  13. .text
  14. .fpu crypto-neon-fp-armv8
  15. k0 .req q7
  16. k1 .req q8
  17. rk .req r3
  18. ta0 .req q9
  19. ta1 .req q10
  20. tb0 .req q10
  21. tb1 .req q9
  22. dga .req q11
  23. dgb .req q12
  24. dg0 .req q13
  25. dg1 .req q14
  26. dg2 .req q15
  27. .macro add_only, ev, s0
  28. vmov dg2, dg0
  29. .ifnb \s0
  30. vld1.32 {k\ev}, [rk, :128]!
  31. .endif
  32. sha256h.32 dg0, dg1, tb\ev
  33. sha256h2.32 dg1, dg2, tb\ev
  34. .ifnb \s0
  35. vadd.u32 ta\ev, q\s0, k\ev
  36. .endif
  37. .endm
  38. .macro add_update, ev, s0, s1, s2, s3
  39. sha256su0.32 q\s0, q\s1
  40. add_only \ev, \s1
  41. sha256su1.32 q\s0, q\s2, q\s3
  42. .endm
  43. .align 6
  44. .Lsha256_rcon:
  45. .word 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5
  46. .word 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5
  47. .word 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3
  48. .word 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174
  49. .word 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc
  50. .word 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da
  51. .word 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7
  52. .word 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967
  53. .word 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13
  54. .word 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85
  55. .word 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3
  56. .word 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070
  57. .word 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5
  58. .word 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3
  59. .word 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208
  60. .word 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
  61. /*
  62. * void sha2_ce_transform(struct sha256_state *sst, u8 const *src,
  63. int blocks);
  64. */
  65. ENTRY(sha2_ce_transform)
  66. /* load state */
  67. vld1.32 {dga-dgb}, [r0]
  68. /* load input */
  69. 0: vld1.32 {q0-q1}, [r1]!
  70. vld1.32 {q2-q3}, [r1]!
  71. subs r2, r2, #1
  72. #ifndef CONFIG_CPU_BIG_ENDIAN
  73. vrev32.8 q0, q0
  74. vrev32.8 q1, q1
  75. vrev32.8 q2, q2
  76. vrev32.8 q3, q3
  77. #endif
  78. /* load first round constant */
  79. adr rk, .Lsha256_rcon
  80. vld1.32 {k0}, [rk, :128]!
  81. vadd.u32 ta0, q0, k0
  82. vmov dg0, dga
  83. vmov dg1, dgb
  84. add_update 1, 0, 1, 2, 3
  85. add_update 0, 1, 2, 3, 0
  86. add_update 1, 2, 3, 0, 1
  87. add_update 0, 3, 0, 1, 2
  88. add_update 1, 0, 1, 2, 3
  89. add_update 0, 1, 2, 3, 0
  90. add_update 1, 2, 3, 0, 1
  91. add_update 0, 3, 0, 1, 2
  92. add_update 1, 0, 1, 2, 3
  93. add_update 0, 1, 2, 3, 0
  94. add_update 1, 2, 3, 0, 1
  95. add_update 0, 3, 0, 1, 2
  96. add_only 1, 1
  97. add_only 0, 2
  98. add_only 1, 3
  99. add_only 0
  100. /* update state */
  101. vadd.u32 dga, dga, dg0
  102. vadd.u32 dgb, dgb, dg1
  103. bne 0b
  104. /* store new state */
  105. vst1.32 {dga-dgb}, [r0]
  106. bx lr
  107. ENDPROC(sha2_ce_transform)