Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 

166 Zeilen
4.3 KiB

  1. // Copyright 2010 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. // RIPEMD-160 block step.
  5. // In its own file so that a faster assembly or C version
  6. // can be substituted easily.
  7. package ripemd160
  8. import (
  9. "math/bits"
  10. )
  11. // work buffer indices and roll amounts for one line
  12. var _n = [80]uint{
  13. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  14. 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
  15. 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
  16. 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
  17. 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13,
  18. }
  19. var _r = [80]uint{
  20. 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
  21. 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
  22. 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
  23. 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
  24. 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6,
  25. }
  26. // same for the other parallel one
  27. var n_ = [80]uint{
  28. 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
  29. 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
  30. 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
  31. 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
  32. 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11,
  33. }
  34. var r_ = [80]uint{
  35. 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
  36. 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
  37. 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
  38. 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
  39. 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11,
  40. }
  41. func _Block(md *digest, p []byte) int {
  42. n := 0
  43. var x [16]uint32
  44. var alpha, beta uint32
  45. for len(p) >= BlockSize {
  46. a, b, c, d, e := md.s[0], md.s[1], md.s[2], md.s[3], md.s[4]
  47. aa, bb, cc, dd, ee := a, b, c, d, e
  48. j := 0
  49. for i := 0; i < 16; i++ {
  50. x[i] = uint32(p[j]) | uint32(p[j+1])<<8 | uint32(p[j+2])<<16 | uint32(p[j+3])<<24
  51. j += 4
  52. }
  53. // round 1
  54. i := 0
  55. for i < 16 {
  56. alpha = a + (b ^ c ^ d) + x[_n[i]]
  57. s := int(_r[i])
  58. alpha = bits.RotateLeft32(alpha, s) + e
  59. beta = bits.RotateLeft32(c, 10)
  60. a, b, c, d, e = e, alpha, b, beta, d
  61. // parallel line
  62. alpha = aa + (bb ^ (cc | ^dd)) + x[n_[i]] + 0x50a28be6
  63. s = int(r_[i])
  64. alpha = bits.RotateLeft32(alpha, s) + ee
  65. beta = bits.RotateLeft32(cc, 10)
  66. aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd
  67. i++
  68. }
  69. // round 2
  70. for i < 32 {
  71. alpha = a + (b&c | ^b&d) + x[_n[i]] + 0x5a827999
  72. s := int(_r[i])
  73. alpha = bits.RotateLeft32(alpha, s) + e
  74. beta = bits.RotateLeft32(c, 10)
  75. a, b, c, d, e = e, alpha, b, beta, d
  76. // parallel line
  77. alpha = aa + (bb&dd | cc&^dd) + x[n_[i]] + 0x5c4dd124
  78. s = int(r_[i])
  79. alpha = bits.RotateLeft32(alpha, s) + ee
  80. beta = bits.RotateLeft32(cc, 10)
  81. aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd
  82. i++
  83. }
  84. // round 3
  85. for i < 48 {
  86. alpha = a + (b | ^c ^ d) + x[_n[i]] + 0x6ed9eba1
  87. s := int(_r[i])
  88. alpha = bits.RotateLeft32(alpha, s) + e
  89. beta = bits.RotateLeft32(c, 10)
  90. a, b, c, d, e = e, alpha, b, beta, d
  91. // parallel line
  92. alpha = aa + (bb | ^cc ^ dd) + x[n_[i]] + 0x6d703ef3
  93. s = int(r_[i])
  94. alpha = bits.RotateLeft32(alpha, s) + ee
  95. beta = bits.RotateLeft32(cc, 10)
  96. aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd
  97. i++
  98. }
  99. // round 4
  100. for i < 64 {
  101. alpha = a + (b&d | c&^d) + x[_n[i]] + 0x8f1bbcdc
  102. s := int(_r[i])
  103. alpha = bits.RotateLeft32(alpha, s) + e
  104. beta = bits.RotateLeft32(c, 10)
  105. a, b, c, d, e = e, alpha, b, beta, d
  106. // parallel line
  107. alpha = aa + (bb&cc | ^bb&dd) + x[n_[i]] + 0x7a6d76e9
  108. s = int(r_[i])
  109. alpha = bits.RotateLeft32(alpha, s) + ee
  110. beta = bits.RotateLeft32(cc, 10)
  111. aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd
  112. i++
  113. }
  114. // round 5
  115. for i < 80 {
  116. alpha = a + (b ^ (c | ^d)) + x[_n[i]] + 0xa953fd4e
  117. s := int(_r[i])
  118. alpha = bits.RotateLeft32(alpha, s) + e
  119. beta = bits.RotateLeft32(c, 10)
  120. a, b, c, d, e = e, alpha, b, beta, d
  121. // parallel line
  122. alpha = aa + (bb ^ cc ^ dd) + x[n_[i]]
  123. s = int(r_[i])
  124. alpha = bits.RotateLeft32(alpha, s) + ee
  125. beta = bits.RotateLeft32(cc, 10)
  126. aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd
  127. i++
  128. }
  129. // combine results
  130. dd += c + md.s[1]
  131. md.s[1] = md.s[2] + d + ee
  132. md.s[2] = md.s[3] + e + aa
  133. md.s[3] = md.s[4] + a + bb
  134. md.s[4] = md.s[0] + b + cc
  135. md.s[0] = dd
  136. p = p[BlockSize:]
  137. n += BlockSize
  138. }
  139. return n
  140. }