crypt.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /*
  2. * UFC-crypt: ultra fast crypt(3) implementation
  3. *
  4. * Copyright (C) 1991-2019 Free Software Foundation, Inc.
  5. *
  6. * This library is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * This library is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with this library; see the file COPYING.LIB. If not,
  18. * see <http://www.gnu.org/licenses/>.
  19. *
  20. * @(#)crypt.c 2.25 12/20/96
  21. *
  22. * Semiportable C version
  23. *
  24. */
  25. #include "crypt-private.h"
  26. #ifdef _UFC_32_
  27. /*
  28. * 32 bit version
  29. */
  30. #define SBA(sb, v) (*(long32*)((char*)(sb)+(v)))
  31. void
  32. _ufc_doit_r (ufc_long itr, struct crypt_data * __restrict __data,
  33. ufc_long *res)
  34. {
  35. int i;
  36. long32 s, *k;
  37. long32 *sb01 = (long32*)__data->sb0;
  38. long32 *sb23 = (long32*)__data->sb2;
  39. long32 l1, l2, r1, r2;
  40. l1 = (long32)res[0]; l2 = (long32)res[1];
  41. r1 = (long32)res[2]; r2 = (long32)res[3];
  42. while(itr--) {
  43. k = (long32*)__data->keysched;
  44. for(i=8; i--; ) {
  45. s = *k++ ^ r1;
  46. l1 ^= SBA(sb01, s & 0xffff); l2 ^= SBA(sb01, (s & 0xffff)+4);
  47. l1 ^= SBA(sb01, s >>= 16 ); l2 ^= SBA(sb01, (s )+4);
  48. s = *k++ ^ r2;
  49. l1 ^= SBA(sb23, s & 0xffff); l2 ^= SBA(sb23, (s & 0xffff)+4);
  50. l1 ^= SBA(sb23, s >>= 16 ); l2 ^= SBA(sb23, (s )+4);
  51. s = *k++ ^ l1;
  52. r1 ^= SBA(sb01, s & 0xffff); r2 ^= SBA(sb01, (s & 0xffff)+4);
  53. r1 ^= SBA(sb01, s >>= 16 ); r2 ^= SBA(sb01, (s )+4);
  54. s = *k++ ^ l2;
  55. r1 ^= SBA(sb23, s & 0xffff); r2 ^= SBA(sb23, (s & 0xffff)+4);
  56. r1 ^= SBA(sb23, s >>= 16 ); r2 ^= SBA(sb23, (s )+4);
  57. }
  58. s=l1; l1=r1; r1=s; s=l2; l2=r2; r2=s;
  59. }
  60. res[0] = l1; res[1] = l2; res[2] = r1; res[3] = r2;
  61. }
  62. #endif
  63. #ifdef _UFC_64_
  64. /*
  65. * 64 bit version
  66. */
  67. #define SBA(sb, v) (*(long64*)((char*)(sb)+(v)))
  68. void
  69. _ufc_doit_r (ufc_long itr, struct crypt_data * __restrict __data,
  70. ufc_long *res)
  71. {
  72. int i;
  73. long64 l, r, s, *k;
  74. long64 *sb01 = (long64*)__data->sb0;
  75. long64 *sb23 = (long64*)__data->sb2;
  76. l = (((long64)res[0]) << 32) | ((long64)res[1]);
  77. r = (((long64)res[2]) << 32) | ((long64)res[3]);
  78. while(itr--) {
  79. k = (long64*)__data->keysched;
  80. for(i=8; i--; ) {
  81. s = *k++ ^ r;
  82. l ^= SBA(sb23, (s ) & 0xffff);
  83. l ^= SBA(sb23, (s >>= 16) & 0xffff);
  84. l ^= SBA(sb01, (s >>= 16) & 0xffff);
  85. l ^= SBA(sb01, (s >>= 16) );
  86. s = *k++ ^ l;
  87. r ^= SBA(sb23, (s ) & 0xffff);
  88. r ^= SBA(sb23, (s >>= 16) & 0xffff);
  89. r ^= SBA(sb01, (s >>= 16) & 0xffff);
  90. r ^= SBA(sb01, (s >>= 16) );
  91. }
  92. s=l; l=r; r=s;
  93. }
  94. res[0] = l >> 32; res[1] = l & 0xffffffff;
  95. res[2] = r >> 32; res[3] = r & 0xffffffff;
  96. }
  97. #endif