home *** CD-ROM | disk | FTP | other *** search
/ The Hacker's Encyclopedia 1998 / hackers_encyclopedia.iso / programs / kc9_src.arj / BCRYPT.C next >
Encoding:
C/C++ Source or Header  |  1991-10-07  |  22.5 KB  |  828 lines

  1. /*
  2.  
  3. **  BCRYPT - High speed un*x password encryption/compare routines
  4.  
  5. **  Originally written by VIz, modifications by Doctor Dissector
  6.  
  7. **
  8.  
  9. **  Filename   : bcrypt.c
  10.  
  11. **
  12.  
  13. **  Description: the actual bcrypt encryption engine and related functions
  14.  
  15. **
  16.  
  17. **  Updated    : 10/07/91
  18.  
  19. */
  20.  
  21.  
  22.  
  23. /*=[ VIz's Original Disclaimer ]============================================*/
  24.  
  25.  
  26.  
  27. /*
  28.  
  29. **                             LARD
  30.  
  31. **                       "The power of LARD"
  32.  
  33. **                            by VIz
  34.  
  35. **
  36.  
  37. **  I am not responsible for any use of this program by anyone,
  38.  
  39. **  on any machine for any purpose, anywhere at anytime....
  40.  
  41. */
  42.  
  43.  
  44.  
  45. /*=[ Testing ]==============================================================*/
  46.  
  47.  
  48.  
  49. /*
  50.  
  51. **  For testing purposes, bcrypt() can be called similarly to the original
  52.  
  53. **  crypt() function, as "char *bcrypt(char *plaintext, char *salt)".
  54.  
  55. **  This method is not an efficient method for cracking passwords, but
  56.  
  57. **  is a simple way to test bcrypt()'s results for validity.  In order
  58.  
  59. **  to enable this function, un-comment the definition "TESTING" in
  60.  
  61. **  the file bcrypt.h and re-compile.  Also, if you are testing under the
  62.  
  63. **  MS/PC-DOS environment with Turbo C, Turbo C++, Borland C++, or
  64.  
  65. **  Microsoft compilers, be sure to call the bcrypt_init() function before
  66.  
  67. **  the testing is done and bcrypt_done() when testing is complete.  For
  68.  
  69. **  full implementation details, see "Implementation" below.
  70.  
  71. */
  72.  
  73.  
  74.  
  75. /*=[ Implementation ]=======================================================*/
  76.  
  77.  
  78.  
  79. /*
  80.  
  81. **  ----------------------------------------------
  82.  
  83. **  Example variables:
  84.  
  85. **
  86.  
  87. **      U32  SL[2];
  88.  
  89. **      BU64 pwcode, resultcode;
  90.  
  91. **      char pw[14];
  92.  
  93. **      int  match;
  94.  
  95. **  ----------------------------------------------
  96.  
  97. **  Before doing anything:
  98.  
  99. **
  100.  
  101. **      bcrypt_init();
  102.  
  103. **  ----------------------------------------------
  104.  
  105. **  For EACH account:
  106.  
  107. **
  108.  
  109. **      bcrypt_salt_to_E(pw[0], pw[1], SL);
  110.  
  111. **      pwcode=bcrypt_pw_to_BU64(pw+2);
  112.  
  113. **  ----------------------------------------------
  114.  
  115. **  For each new word:
  116.  
  117. **
  118.  
  119. **      bcrypt_set_word(word);
  120.  
  121. **  ----------------------------------------------
  122.  
  123. **  For each comparision:
  124.  
  125. **
  126.  
  127. **      resultcode=bcrypt_encode(SL[0], SL[1]);
  128.  
  129. **      if ((pwcode.L.U==resultcode.L.U) && (pwcode.R.U==resultcode.R.U))
  130.  
  131. **          match=1;
  132.  
  133. **      else
  134.  
  135. **          match=0;
  136.  
  137. **  ----------------------------------------------
  138.  
  139. **  After everything is done (MS/PC-DOS ONLY)
  140.  
  141. **
  142.  
  143. **      bcrypt_done();
  144.  
  145. **  ----------------------------------------------
  146.  
  147. */
  148.  
  149.  
  150.  
  151. /*=[ Include Files ]========================================================*/
  152.  
  153.  
  154.  
  155. #include "bcrypt.h"
  156.  
  157.  
  158.  
  159. /*=[ Static Variables ]=====================================================*/
  160.  
  161.  
  162.  
  163. static char KS[16][48];             /* Key Schedule */
  164.  
  165. static BU32 UKS[16][4];             /* Key Schedule In Alternate Form */
  166.  
  167.  
  168.  
  169. /* S-Boxes, S2, S3, S (S is master S-Box) */
  170.  
  171. static U32 S2[8][64];
  172.  
  173.  
  174.  
  175. #if defined(_MICROSOFT) || defined(_TURBO)
  176.  
  177. static U32 *S3[4],                  /* S-Box, far malloc'd form */
  178.  
  179.            *S[4];                   /* Permuted S-Box S3, far-malloc'd form */
  180.  
  181. #else
  182.  
  183. static U32 S3[4][4096],             /* S-Box */
  184.  
  185.            S[4][4096];              /* Permuted S-Box S3 */
  186.  
  187. #endif
  188.  
  189.  
  190.  
  191. /*==========================================================================*/
  192.  
  193.  
  194.  
  195. U32 CV0(INU)
  196.  
  197.     REG U32 INU;
  198.  
  199. {
  200.  
  201.     REG BU32 in, out;
  202.  
  203.  
  204.  
  205.     in.U=INU;
  206.  
  207.     out.U=0;
  208.  
  209.     out.N.b0=in.N.b4;
  210.  
  211.     out.N.b1=in.N.b10;
  212.  
  213.     out.N.b2=in.N.b0;
  214.  
  215.     out.N.b3=in.N.b6;
  216.  
  217.     out.N.b4=in.N.b1;
  218.  
  219.     out.N.b5=in.N.b7;
  220.  
  221.     out.N.b6=in.N.b2;
  222.  
  223.     out.N.b7=in.N.b8;
  224.  
  225.     out.N.b8=in.N.b9;
  226.  
  227.     out.N.b9=in.N.b3;
  228.  
  229.     out.N.b10=in.N.b11;
  230.  
  231.     out.N.b11=in.N.b5;
  232.  
  233.  
  234.  
  235.     return(out.U);
  236.  
  237. }
  238.  
  239.  
  240.  
  241. /*==========================================================================*/
  242.  
  243.  
  244.  
  245. U32 CV1(INU)
  246.  
  247.     REG U32 INU;
  248.  
  249. {
  250.  
  251.     REG BU32 in, out;
  252.  
  253.  
  254.  
  255.     in.U=INU;
  256.  
  257.     out.U=0;
  258.  
  259.     out.N.b0=in.N.b4;
  260.  
  261.     out.N.b1=in.N.b10;
  262.  
  263.     out.N.b2=in.N.b0;
  264.  
  265.     out.N.b3=in.N.b6;
  266.  
  267.     out.N.b4=in.N.b1;
  268.  
  269.     out.N.b5=in.N.b7;
  270.  
  271.     out.N.b6=in.N.b2;
  272.  
  273.     out.N.b7=in.N.b8;
  274.  
  275.     out.N.b8=in.N.b3;
  276.  
  277.     out.N.b9=in.N.b9;
  278.  
  279.     out.N.b10=in.N.b5;
  280.  
  281.     out.N.b11=in.N.b11;
  282.  
  283.  
  284.  
  285.     return(out.U);
  286.  
  287. }
  288.  
  289.  
  290.  
  291. /*==========================================================================*/
  292.  
  293.  
  294.  
  295. BU32 EN(in)
  296.  
  297.     BU32 in;
  298.  
  299. {
  300.  
  301.     REG BU32 out;
  302.  
  303.  
  304.  
  305.     out.N.b0=in.N.b14;
  306.  
  307.     out.N.b1=in.N.b30;
  308.  
  309.     out.N.b2=in.N.b31;
  310.  
  311.     out.N.b3=in.N.b15;
  312.  
  313.     out.N.b4=in.N.b0;
  314.  
  315.     out.N.b5=in.N.b16;
  316.  
  317.     out.N.b6=in.N.b1;
  318.  
  319.     out.N.b7=in.N.b17;
  320.  
  321.     out.N.b8=in.N.b2;
  322.  
  323.     out.N.b9=in.N.b18;
  324.  
  325.     out.N.b10=in.N.b3;
  326.  
  327.     out.N.b11=in.N.b19;
  328.  
  329.     out.N.b12=in.N.b4;
  330.  
  331.     out.N.b13=in.N.b20;
  332.  
  333.     out.N.b14=in.N.b5;
  334.  
  335.     out.N.b15=in.N.b21;
  336.  
  337.     out.N.b16=in.N.b6;
  338.  
  339.     out.N.b17=in.N.b22;
  340.  
  341.     out.N.b18=in.N.b7;
  342.  
  343.     out.N.b19=in.N.b23;
  344.  
  345.     out.N.b20=in.N.b8;
  346.  
  347.     out.N.b21=in.N.b24;
  348.  
  349.     out.N.b22=in.N.b9;
  350.  
  351.     out.N.b23=in.N.b25;
  352.  
  353.     out.N.b24=in.N.b10;
  354.  
  355.     out.N.b25=in.N.b26;
  356.  
  357.     out.N.b26=in.N.b11;
  358.  
  359.     out.N.b27=in.N.b27;
  360.  
  361.     out.N.b28=in.N.b12;
  362.  
  363.     out.N.b29=in.N.b28;
  364.  
  365.     out.N.b30=in.N.b13;
  366.  
  367.     out.N.b31=in.N.b29;
  368.  
  369.  
  370.  
  371.     return(out);
  372.  
  373. }
  374.  
  375.  
  376.  
  377. /*==========================================================================*/
  378.  
  379.  
  380.  
  381. BU32 DE(in)
  382.  
  383.     BU32 in;
  384.  
  385. {
  386.  
  387.     REG BU32 out;
  388.  
  389.  
  390.  
  391.     out.N.b0=in.N.b4;
  392.  
  393.     out.N.b1=in.N.b6;
  394.  
  395.     out.N.b2=in.N.b8;
  396.  
  397.     out.N.b3=in.N.b10;
  398.  
  399.     out.N.b4=in.N.b12;
  400.  
  401.     out.N.b5=in.N.b14;
  402.  
  403.     out.N.b6=in.N.b16;
  404.  
  405.     out.N.b7=in.N.b18;
  406.  
  407.     out.N.b8=in.N.b20;
  408.  
  409.     out.N.b9=in.N.b22;
  410.  
  411.     out.N.b10=in.N.b24;
  412.  
  413.     out.N.b11=in.N.b26;
  414.  
  415.     out.N.b12=in.N.b28;
  416.  
  417.     out.N.b13=in.N.b30;
  418.  
  419.     out.N.b14=in.N.b0;
  420.  
  421.     out.N.b15=in.N.b3;
  422.  
  423.     out.N.b16=in.N.b5;
  424.  
  425.     out.N.b17=in.N.b7;
  426.  
  427.     out.N.b18=in.N.b9;
  428.  
  429.     out.N.b19=in.N.b11;
  430.  
  431.     out.N.b20=in.N.b13;
  432.  
  433.     out.N.b21=in.N.b15;
  434.  
  435.     out.N.b22=in.N.b17;
  436.  
  437.     out.N.b23=in.N.b19;
  438.  
  439.     out.N.b24=in.N.b21;
  440.  
  441.     out.N.b25=in.N.b23;
  442.  
  443.     out.N.b26=in.N.b25;
  444.  
  445.     out.N.b27=in.N.b27;
  446.  
  447.     out.N.b28=in.N.b29;
  448.  
  449.     out.N.b29=in.N.b31;
  450.  
  451.     out.N.b30=in.N.b1;
  452.  
  453.     out.N.b31=in.N.b2;
  454.  
  455.  
  456.  
  457.     return(out);
  458.  
  459. }
  460.  
  461. /*==========================================================================*/
  462.  
  463.  
  464.  
  465. BU64 IP(B)
  466.  
  467.     BU64 B;
  468.  
  469. {
  470.  
  471.     REG BU64 Ret;
  472.  
  473.  
  474.  
  475.     Ret.L.N.b31=B.R.N.b6;
  476.  
  477.     Ret.L.N.b30=B.R.N.b14;
  478.  
  479.     Ret.L.N.b29=B.R.N.b22;
  480.  
  481.     Ret.L.N.b28=B.R.N.b30;
  482.  
  483.     Ret.L.N.b27=B.L.N.b6;
  484.  
  485.     Ret.L.N.b26=B.L.N.b14;
  486.  
  487.     Ret.L.N.b25=B.L.N.b22;
  488.  
  489.     Ret.L.N.b24=B.L.N.b30;
  490.  
  491.     Ret.L.N.b23=B.R.N.b4;
  492.  
  493.     Ret.L.N.b22=B.R.N.b12;
  494.  
  495.     Ret.L.N.b21=B.R.N.b20;
  496.  
  497.     Ret.L.N.b20=B.R.N.b28;
  498.  
  499.     Ret.L.N.b19=B.L.N.b4;
  500.  
  501.     Ret.L.N.b18=B.L.N.b12;
  502.  
  503.     Ret.L.N.b17=B.L.N.b20;
  504.  
  505.     Ret.L.N.b16=B.L.N.b28;
  506.  
  507.     Ret.L.N.b15=B.R.N.b2;
  508.  
  509.     Ret.L.N.b14=B.R.N.b10;
  510.  
  511.     Ret.L.N.b13=B.R.N.b18;
  512.  
  513.     Ret.L.N.b12=B.R.N.b26;
  514.  
  515.     Ret.L.N.b11=B.L.N.b2;
  516.  
  517.     Ret.L.N.b10=B.L.N.b10;
  518.  
  519.     Ret.L.N.b9=B.L.N.b18;
  520.  
  521.     Ret.L.N.b8=B.L.N.b26;
  522.  
  523.     Ret.L.N.b7=B.R.N.b0;
  524.  
  525.     Ret.L.N.b6=B.R.N.b8;
  526.  
  527.     Ret.L.N.b5=B.R.N.b16;
  528.  
  529.     Ret.L.N.b4=B.R.N.b24;
  530.  
  531.     Ret.L.N.b3=B.L.N.b0;
  532.  
  533.     Ret.L.N.b2=B.L.N.b8;
  534.  
  535.     Ret.L.N.b1=B.L.N.b16;
  536.  
  537.     Ret.L.N.b0=B.L.N.b24;
  538.  
  539.  
  540.  
  541.     Ret.R.N.b31=B.R.N.b7;
  542.  
  543.     Ret.R.N.b30=B.R.N.b15;
  544.  
  545.     Ret.R.N.b29=B.R.N.b23;
  546.  
  547.     Ret.R.N.b28=B.R.N.b31;
  548.  
  549.     Ret.R.N.b27=B.L.N.b7;
  550.  
  551.     Ret.R.N.b26=B.L.N.b15;
  552.  
  553.     Ret.R.N.b25=B.L.N.b23;
  554.  
  555.     Ret.R.N.b24=B.L.N.b31;
  556.  
  557.     Ret.R.N.b23=B.R.N.b5;
  558.  
  559.     Ret.R.N.b22=B.R.N.b13;
  560.  
  561.     Ret.R.N.b21=B.R.N.b21;
  562.  
  563.     Ret.R.N.b20=B.R.N.b29;
  564.  
  565.     Ret.R.N.b19=B.L.N.b5;
  566.  
  567.     Ret.R.N.b18=B.L.N.b13;
  568.  
  569.     Ret.R.N.b17=B.L.N.b21;
  570.  
  571.     Ret.R.N.b16=B.L.N.b29;
  572.  
  573.     Ret.R.N.b15=B.R.N.b3;
  574.  
  575.     Ret.R.N.b14=B.R.N.b11;
  576.  
  577.     Ret.R.N.b13=B.R.N.b19;
  578.  
  579.     Ret.R.N.b12=B.R.N.b27;
  580.  
  581.     Ret.R.N.b11=B.L.N.b3;
  582.  
  583.     Ret.R.N.b10=B.L.N.b11;
  584.  
  585.     Ret.R.N.b9=B.L.N.b19;
  586.  
  587.     Ret.R.N.b8=B.L.N.b27;
  588.  
  589.     Ret.R.N.b7=B.R.N.b1;
  590.  
  591.     Ret.R.N.b6=B.R.N.b9;
  592.  
  593.     Ret.R.N.b5=B.R.N.b17;
  594.  
  595.     Ret.R.N.b4=B.R.N.b25;
  596.  
  597.     Ret.R.N.b3=B.L.N.b1;
  598.  
  599.     Ret.R.N.b2=B.L.N.b9;
  600.  
  601.     Ret.R.N.b1=B.L.N.b17;
  602.  
  603.     Ret.R.N.b0=B.L.N.b25;
  604.  
  605.  
  606.  
  607.     return(Ret);
  608.  
  609. }
  610.  
  611.  
  612.  
  613. /*==========================================================================*/
  614.  
  615.  
  616.  
  617. #define ENCODE_R(x) \
  618.  
  619.     I.U  = ret.R.FE1.b31_26;\
  620.  
  621.     I.F12.b11_6 = ret.R.FE1.b5_0;\
  622.  
  623.     T.U  = (I.U ^ (I.U >> 1)) & SL0;\
  624.  
  625.     I.U ^= (T.U | (T.U << 1)) ^ UKS[x][0].U;\
  626.  
  627.     Y.U  = S[0][I.U];\
  628.  
  629.     I.U  = ret.R.FE0.b29_18;\
  630.  
  631.     T.U  = (I.U ^ (I.U >> 1)) & SL1;\
  632.  
  633.     I.U ^= (T.U | (T.U << 1)) ^ UKS[x][1].U;\
  634.  
  635.     Y.U |= S[1][I.U];\
  636.  
  637.     I.U  = ret.R.FE1.b21_10 ^ UKS[x][2].U;\
  638.  
  639.     Y.U |= S[2][I.U];\
  640.  
  641.     I.U  = ret.R.FE0.b13_2 ^ UKS[x][3].U;\
  642.  
  643.     Y.U |= S[3][I.U];\
  644.  
  645.     ret.L.U ^= Y.U
  646.  
  647.  
  648.  
  649. #define ENCODE_L(x) \
  650.  
  651.     I.U  = ret.L.FE1.b31_26;\
  652.  
  653.     I.F12.b11_6 = ret.L.FE1.b5_0;\
  654.  
  655.     T.U  = (I.U ^ (I.U >> 1)) & SL0;\
  656.  
  657.     I.U ^= (T.U | (T.U << 1)) ^ UKS[x][0].U;\
  658.  
  659.     Y.U  = S[0][I.U];\
  660.  
  661.     I.U  = ret.L.FE0.b29_18;\
  662.  
  663.     T.U  = (I.U ^ (I.U >> 1)) & SL1;\
  664.  
  665.     I.U ^= (T.U | (T.U << 1)) ^ UKS[x][1].U;\
  666.  
  667.     Y.U |= S[1][I.U];\
  668.  
  669.     I.U  = ret.L.FE1.b21_10 ^ UKS[x][2].U;\
  670.  
  671.     Y.U |= S[2][I.U];\
  672.  
  673.     I.U  = ret.L.FE0.b13_2 ^ UKS[x][3].U;\
  674.  
  675.     Y.U |= S[3][I.U];\
  676.  
  677.     ret.R.U ^= Y.U
  678.  
  679.  
  680.  
  681. /*==========================================================================*/
  682.  
  683.  
  684.  
  685. BU64 bcrypt_encode(SL0, SL1)
  686.  
  687.     REG U32  SL0, SL1;
  688.  
  689. {
  690.  
  691.     REG char count;
  692.  
  693.     REG BU32 I, T, Y;
  694.  
  695.     REG BU64 ret;
  696.  
  697.  
  698.  
  699.     ret.R.U=ret.L.U=0;
  700.  
  701.     for(count=25; count>0; count--) {
  702.  
  703.         ENCODE_R(0);
  704.  
  705.         ENCODE_L(1);
  706.  
  707.         ENCODE_R(2);
  708.  
  709.         ENCODE_L(3);
  710.  
  711.         ENCODE_R(4);
  712.  
  713.         ENCODE_L(5);
  714.  
  715.         ENCODE_R(6);
  716.  
  717.         ENCODE_L(7);
  718.  
  719.         ENCODE_R(8);
  720.  
  721.         ENCODE_L(9);
  722.  
  723.         ENCODE_R(10);
  724.  
  725.         ENCODE_L(11);
  726.  
  727.         ENCODE_R(12);
  728.  
  729.         ENCODE_L(13);
  730.  
  731.         ENCODE_R(14);
  732.  
  733.         ENCODE_L(15);
  734.  
  735.         T=ret.R;
  736.  
  737.         ret.R=ret.L;
  738.  
  739.         ret.L=T;
  740.  
  741.     }
  742.  
  743.     return(ret);
  744.  
  745. }
  746.  
  747.  
  748.  
  749. /*==========================================================================*/
  750.  
  751.  
  752.  
  753. void bcrypt_salt_to_E(salt0, salt1, SL)
  754.  
  755.     REG  char salt0, salt1;
  756.  
  757.     REG  U32  SL[2];
  758.  
  759. {
  760.  
  761.     REG  int  j;
  762.  
  763.  
  764.  
  765.     if(salt0>'Z')
  766.  
  767.         salt0-=6;
  768.  
  769.     if(salt0>'9')
  770.  
  771.         salt0-=7;
  772.  
  773.     salt0-='.';
  774.  
  775.     if (salt1>'Z')
  776.  
  777.         salt1-=6;
  778.  
  779.     if(salt1>'9')
  780.  
  781.         salt1-=7;
  782.  
  783.     salt1-='.';
  784.  
  785.     for(j=0, SL[0]=0; j<6; j++)
  786.  
  787.         SL[0] |= ((salt0 >> j) & 0x1) << ((5-j)*2);
  788.  
  789.     for(j=0, SL[1]=0; j<6; j++)
  790.  
  791.         SL[1] |= ((salt1 >> j) & 0x1) << ((5-j)*2);
  792.  
  793. }
  794.  
  795.  
  796.  
  797. /*==========================================================================*/
  798.  
  799.  
  800.  
  801. #define ROTATE_ONE(a) \
  802.  
  803.     j=a[0];\
  804.  
  805.     a[ 0]=a[ 1], a[ 1]=a[ 2], a[ 2]=a[ 3], a[ 3]=a[ 4],\
  806.  
  807.     a[ 4]=a[ 5], a[ 5]=a[ 6], a[ 6]=a[ 7], a[ 7]=a[ 8],\
  808.  
  809.     a[ 8]=a[ 9], a[ 9]=a[10], a[10]=a[11], a[11]=a[12],\
  810.  
  811.     a[12]=a[13], a[13]=a[14], a[14]=a[15], a[15]=a[16],\
  812.  
  813.     a[16]=a[17], a[17]=a[18], a[18]=a[19], a[19]=a[20],\
  814.  
  815.     a[20]=a[21], a[21]=a[22], a[22]=a[23], a[23]=a[24],\
  816.  
  817.     a[24]=a[25], a[25]=a[26], a[26]=a[27], a[27]=j
  818.  
  819.  
  820.  
  821. #define ROTATE_TWO(a) \
  822.  
  823.     j=a[0];\
  824.  
  825.     k=a[1];\
  826.  
  827.     a[ 0]=a[ 2], a[ 1]=a[ 3], a[ 2]=a[ 4], a[ 3]=a[ 5],\
  828.  
  829.     a[ 4]=a[ 6], a[ 5]=a[ 7], a[ 6]=a[ 8], a[ 7]=a[ 9],\
  830.  
  831.     a[ 8]=a[10], a[ 9]=a[11], a[10]=a[12], a[11]=a[13],\
  832.  
  833.     a[12]=a[14], a[13]=a[15], a[14]=a[16], a[15]=a[17],\
  834.  
  835.     a[16]=a[18], a[17]=a[19], a[18]=a[20], a[19]=a[21],\
  836.  
  837.     a[20]=a[22], a[21]=a[23], a[22]=a[24], a[23]=a[25],\
  838.  
  839.     a[24]=a[26], a[25]=a[27], a[26]=j,     a[27]=k
  840.  
  841.  
  842.  
  843. /*==========================================================================*/
  844.  
  845.  
  846.  
  847. void bcrypt_set_word(word)
  848.  
  849.     REG    char *word;
  850.  
  851. {
  852.  
  853.     REG    int  i, j, k;
  854.  
  855.     static union char_union t;
  856.  
  857.     static char block[66], C[28], D[28];
  858.  
  859.  
  860.  
  861.     for(i=0; ((t.c=(*word++))!=NULL) && (i<64); ) {
  862.  
  863.         block[i++]=t.bits.b6;
  864.  
  865.         block[i++]=t.bits.b5;
  866.  
  867.         block[i++]=t.bits.b4;
  868.  
  869.         block[i++]=t.bits.b3;
  870.  
  871.         block[i++]=t.bits.b2;
  872.  
  873.         block[i++]=t.bits.b1;
  874.  
  875.         block[i++]=t.bits.b0;
  876.  
  877.         block[i++]=0;
  878.  
  879.     }
  880.  
  881.     for(; i<66; i++)
  882.  
  883.         block[i]=0;
  884.  
  885.  
  886.  
  887.     /* Permuted choice 1 (C) */
  888.  
  889.     C[ 0]=block[56], C[ 1]=block[48], C[ 2]=block[40], C[ 3]=block[32],
  890.  
  891.     C[ 4]=block[24], C[ 5]=block[16], C[ 6]=block[ 8], C[ 7]=block[ 0],
  892.  
  893.     C[ 8]=block[57], C[ 9]=block[49], C[10]=block[41], C[11]=block[33],
  894.  
  895.     C[12]=block[25], C[13]=block[17], C[14]=block[ 9], C[15]=block[ 1],
  896.  
  897.     C[16]=block[58], C[17]=block[50], C[18]=block[42], C[19]=block[34],
  898.  
  899.     C[20]=block[26], C[21]=block[18], C[22]=block[10], C[23]=block[ 2],
  900.  
  901.     C[24]=block[59], C[25]=block[51], C[26]=block[43], C[27]=block[35];
  902.  
  903.  
  904.  
  905.     /* Permuted choice 1 (D) */
  906.  
  907.     D[ 0]=block[62], D[ 1]=block[54], D[ 2]=block[46], D[ 3]=block[38],
  908.  
  909.     D[ 4]=block[30], D[ 5]=block[22], D[ 6]=block[14], D[ 7]=block[ 6],
  910.  
  911.     D[ 8]=block[61], D[ 9]=block[53], D[10]=block[45], D[11]=block[37],
  912.  
  913.     D[12]=block[29], D[13]=block[21], D[14]=block[13], D[15]=block[ 5],
  914.  
  915.     D[16]=block[60], D[17]=block[52], D[18]=block[44], D[19]=block[36],
  916.  
  917.     D[20]=block[28], D[21]=block[20], D[22]=block[12], D[23]=block[ 4],
  918.  
  919.     D[24]=block[27], D[25]=block[19], D[26]=block[11], D[27]=block[ 3];
  920.  
  921.  
  922.  
  923.     for (i=0; i<16; i++) {
  924.  
  925.         if (SHIFTS_M1[i]) {
  926.  
  927.             ROTATE_TWO(C);
  928.  
  929.             ROTATE_TWO(D);
  930.  
  931.         }
  932.  
  933.         else {
  934.  
  935.             ROTATE_ONE(C);
  936.  
  937.             ROTATE_ONE(D);
  938.  
  939.         }
  940.  
  941.  
  942.  
  943.         /* Permuted choice 2 (C) */
  944.  
  945.         KS[i][ 0]=C[13], KS[i][ 1]=C[16], KS[i][ 2]=C[10], KS[i][ 3]=C[23],
  946.  
  947.         KS[i][ 4]=C[ 0], KS[i][ 5]=C[ 4], KS[i][ 6]=C[ 2], KS[i][ 7]=C[27],
  948.  
  949.         KS[i][ 8]=C[14], KS[i][ 9]=C[ 5], KS[i][10]=C[20], KS[i][11]=C[ 9],
  950.  
  951.         KS[i][12]=C[22], KS[i][13]=C[18], KS[i][14]=C[11], KS[i][15]=C[ 3],
  952.  
  953.         KS[i][16]=C[25], KS[i][17]=C[ 7], KS[i][18]=C[15], KS[i][19]=C[ 6],
  954.  
  955.         KS[i][20]=C[26], KS[i][21]=C[19], KS[i][22]=C[12], KS[i][23]=C[ 1];
  956.  
  957.  
  958.  
  959.         /* Permuted choice 2 (D) */
  960.  
  961.         KS[i][24]=D[12], KS[i][25]=D[23], KS[i][26]=D[ 2], KS[i][27]=D[ 8],
  962.  
  963.         KS[i][28]=D[18], KS[i][29]=D[26], KS[i][30]=D[ 1], KS[i][31]=D[11],
  964.  
  965.         KS[i][32]=D[22], KS[i][33]=D[16], KS[i][34]=D[ 4], KS[i][35]=D[19],
  966.  
  967.         KS[i][36]=D[15], KS[i][37]=D[20], KS[i][38]=D[10], KS[i][39]=D[27],
  968.  
  969.         KS[i][40]=D[ 5], KS[i][41]=D[24], KS[i][42]=D[17], KS[i][43]=D[13],
  970.  
  971.         KS[i][44]=D[21], KS[i][45]=D[ 7], KS[i][46]=D[ 0], KS[i][47]=D[ 3];
  972.  
  973.     }
  974.  
  975.  
  976.  
  977.     for(i=0; i<16; i++) {
  978.  
  979.         for(j=0, k=0; j<4; j++, k+=6) {
  980.  
  981.             UKS[i][j].U     = 0;
  982.  
  983.             UKS[i][j].N.b11 = KS[i][k+0];
  984.  
  985.             UKS[i][j].N.b9  = KS[i][k+1];
  986.  
  987.             UKS[i][j].N.b8  = KS[i][k+2];
  988.  
  989.             UKS[i][j].N.b7  = KS[i][k+3];
  990.  
  991.             UKS[i][j].N.b6  = KS[i][k+4];
  992.  
  993.             UKS[i][j].N.b10 = KS[i][k+5];
  994.  
  995.  
  996.  
  997.             UKS[i][j].N.b5 = KS[i][k+24];
  998.  
  999.             UKS[i][j].N.b3 = KS[i][k+25];
  1000.  
  1001.             UKS[i][j].N.b2 = KS[i][k+26];
  1002.  
  1003.             UKS[i][j].N.b1 = KS[i][k+27];
  1004.  
  1005.             UKS[i][j].N.b0 = KS[i][k+28];
  1006.  
  1007.             UKS[i][j].N.b4 = KS[i][k+29];
  1008.  
  1009.         }
  1010.  
  1011.         UKS[i][0].U = CV0(UKS[i][0].U);
  1012.  
  1013.         UKS[i][1].U = CV1(UKS[i][1].U);
  1014.  
  1015.         UKS[i][2].U = CV1(UKS[i][2].U);
  1016.  
  1017.         UKS[i][3].U = CV1(UKS[i][3].U);
  1018.  
  1019.     }
  1020.  
  1021. }
  1022.  
  1023.  
  1024.  
  1025. /*==========================================================================*/
  1026.  
  1027.  
  1028.  
  1029. BU64 bcrypt_pw_to_BU64(pw)
  1030.  
  1031.     char *pw;
  1032.  
  1033. {
  1034.  
  1035.     REG    int i;
  1036.  
  1037.     REG    BU64 b;
  1038.  
  1039.     static char temp[11];
  1040.  
  1041.  
  1042.  
  1043.     for(i=0; i<11; i++) {
  1044.  
  1045.         temp[i]=pw[i];
  1046.  
  1047.         if (temp[i]>='a')
  1048.  
  1049.             temp[i]-=6;
  1050.  
  1051.         if (temp[i]>='A')
  1052.  
  1053.             temp[i]-=7;
  1054.  
  1055.         temp[i]-='.';
  1056.  
  1057.     }
  1058.  
  1059.     b.L.B6.b0_5    = temp[0];
  1060.  
  1061.     b.L.B6.b6_11   = temp[1];
  1062.  
  1063.     b.L.B6.b12_17  = temp[2];
  1064.  
  1065.     b.L.B6.b18_23  = temp[3];
  1066.  
  1067.     b.L.B6.b24_29  = temp[4];
  1068.  
  1069.     b.L.B6.b30_31  = temp[5] >> 4;
  1070.  
  1071.     b.R.B6_.b0_3   = temp[5];
  1072.  
  1073.     b.R.B6_.b4_9   = temp[6];
  1074.  
  1075.     b.R.B6_.b10_15 = temp[7];
  1076.  
  1077.     b.R.B6_.b16_21 = temp[8];
  1078.  
  1079.     b.R.B6_.b22_27 = temp[9];
  1080.  
  1081.     b.R.B6_.b28_31 = temp[10] >> 2;
  1082.  
  1083.  
  1084.  
  1085.     b=IP(b);
  1086.  
  1087.     b.L=EN(b.L);
  1088.  
  1089.     b.R=EN(b.R);
  1090.  
  1091.  
  1092.  
  1093.     return(b);
  1094.  
  1095. }
  1096.  
  1097.  
  1098.  
  1099. /*==========================================================================*/
  1100.  
  1101.  
  1102.  
  1103. #ifdef TESTING
  1104.  
  1105. BU64 FP(B)
  1106.  
  1107.     BU64 B;
  1108.  
  1109. {
  1110.  
  1111.     REG BU64 Ret;
  1112.  
  1113.  
  1114.  
  1115.     Ret.L.N.b31=B.R.N.b24;
  1116.  
  1117.     Ret.L.N.b30=B.L.N.b24;
  1118.  
  1119.     Ret.L.N.b29=B.R.N.b16;
  1120.  
  1121.     Ret.L.N.b28=B.L.N.b16;
  1122.  
  1123.     Ret.L.N.b27=B.R.N.b8;
  1124.  
  1125.     Ret.L.N.b26=B.L.N.b8;
  1126.  
  1127.     Ret.L.N.b25=B.R.N.b0;
  1128.  
  1129.     Ret.L.N.b24=B.L.N.b0;
  1130.  
  1131.     Ret.L.N.b23=B.R.N.b25;
  1132.  
  1133.     Ret.L.N.b22=B.L.N.b25;
  1134.  
  1135.     Ret.L.N.b21=B.R.N.b17;
  1136.  
  1137.     Ret.L.N.b20=B.L.N.b17;
  1138.  
  1139.     Ret.L.N.b19=B.R.N.b9;
  1140.  
  1141.     Ret.L.N.b18=B.L.N.b9;
  1142.  
  1143.     Ret.L.N.b17=B.R.N.b1;
  1144.  
  1145.     Ret.L.N.b16=B.L.N.b1;
  1146.  
  1147.     Ret.L.N.b15=B.R.N.b26;
  1148.  
  1149.     Ret.L.N.b14=B.L.N.b26;
  1150.  
  1151.     Ret.L.N.b13=B.R.N.b18;
  1152.  
  1153.     Ret.L.N.b12=B.L.N.b18;
  1154.  
  1155.     Ret.L.N.b11=B.R.N.b10;
  1156.  
  1157.     Ret.L.N.b10=B.L.N.b10;
  1158.  
  1159.     Ret.L.N.b9=B.R.N.b2;
  1160.  
  1161.     Ret.L.N.b8=B.L.N.b2;
  1162.  
  1163.     Ret.L.N.b7=B.R.N.b27;
  1164.  
  1165.     Ret.L.N.b6=B.L.N.b27;
  1166.  
  1167.     Ret.L.N.b5=B.R.N.b19;
  1168.  
  1169.     Ret.L.N.b4=B.L.N.b19;
  1170.  
  1171.     Ret.L.N.b3=B.R.N.b11;
  1172.  
  1173.     Ret.L.N.b2=B.L.N.b11;
  1174.  
  1175.     Ret.L.N.b1=B.R.N.b3;
  1176.  
  1177.     Ret.L.N.b0=B.L.N.b3;
  1178.  
  1179.  
  1180.  
  1181.     Ret.R.N.b31=B.R.N.b28;
  1182.  
  1183.     Ret.R.N.b30=B.L.N.b28;
  1184.  
  1185.     Ret.R.N.b29=B.R.N.b20;
  1186.  
  1187.     Ret.R.N.b28=B.L.N.b20;
  1188.  
  1189.     Ret.R.N.b27=B.R.N.b12;
  1190.  
  1191.     Ret.R.N.b26=B.L.N.b12;
  1192.  
  1193.     Ret.R.N.b25=B.R.N.b4;
  1194.  
  1195.     Ret.R.N.b24=B.L.N.b4;
  1196.  
  1197.     Ret.R.N.b23=B.R.N.b29;
  1198.  
  1199.     Ret.R.N.b22=B.L.N.b29;
  1200.  
  1201.     Ret.R.N.b21=B.R.N.b21;
  1202.  
  1203.     Ret.R.N.b20=B.L.N.b21;
  1204.  
  1205.     Ret.R.N.b19=B.R.N.b13;
  1206.  
  1207.     Ret.R.N.b18=B.L.N.b13;
  1208.  
  1209.     Ret.R.N.b17=B.R.N.b5;
  1210.  
  1211.     Ret.R.N.b16=B.L.N.b5;
  1212.  
  1213.     Ret.R.N.b15=B.R.N.b30;
  1214.  
  1215.     Ret.R.N.b14=B.L.N.b30;
  1216.  
  1217.     Ret.R.N.b13=B.R.N.b22;
  1218.  
  1219.     Ret.R.N.b12=B.L.N.b22;
  1220.  
  1221.     Ret.R.N.b11=B.R.N.b14;
  1222.  
  1223.     Ret.R.N.b10=B.L.N.b14;
  1224.  
  1225.     Ret.R.N.b9=B.R.N.b6;
  1226.  
  1227.     Ret.R.N.b8=B.L.N.b6;
  1228.  
  1229.     Ret.R.N.b7=B.R.N.b31;
  1230.  
  1231.     Ret.R.N.b6=B.L.N.b31;
  1232.  
  1233.     Ret.R.N.b5=B.R.N.b23;
  1234.  
  1235.     Ret.R.N.b4=B.L.N.b23;
  1236.  
  1237.     Ret.R.N.b3=B.R.N.b15;
  1238.  
  1239.     Ret.R.N.b2=B.L.N.b15;
  1240.  
  1241.     Ret.R.N.b1=B.R.N.b7;
  1242.  
  1243.     Ret.R.N.b0=B.L.N.b7;
  1244.  
  1245.  
  1246.  
  1247.     return(Ret);
  1248.  
  1249. }
  1250.  
  1251.  
  1252.  
  1253. /*==========================================================================*/
  1254.  
  1255.  
  1256.  
  1257. void bcrypt_BU64_to_pw(b, pw)
  1258.  
  1259.     BU64 b;
  1260.  
  1261.     char *pw;
  1262.  
  1263. {
  1264.  
  1265.     REG int i;
  1266.  
  1267.  
  1268.  
  1269.     pw[0]    = b.L.B6.b0_5;
  1270.  
  1271.     pw[1]    = b.L.B6.b6_11;
  1272.  
  1273.     pw[2]    = b.L.B6.b12_17;
  1274.  
  1275.     pw[3]    = b.L.B6.b18_23;
  1276.  
  1277.     pw[4]    = b.L.B6.b24_29;
  1278.  
  1279.     pw[5]    = b.L.B6.b30_31;
  1280.  
  1281.     pw[5]  <<= 4;
  1282.  
  1283.     pw[5]   |= b.R.B6_.b0_3;
  1284.  
  1285.     pw[6]    = b.R.B6_.b4_9;
  1286.  
  1287.     pw[7]    = b.R.B6_.b10_15;
  1288.  
  1289.     pw[8]    = b.R.B6_.b16_21;
  1290.  
  1291.     pw[9]    = b.R.B6_.b22_27;
  1292.  
  1293.     pw[10]   = b.R.B6_.b28_31;
  1294.  
  1295.     pw[10] <<= 2;
  1296.  
  1297.  
  1298.  
  1299.     for(i=0; i<11; i++) {
  1300.  
  1301.         pw[i]+='.';
  1302.  
  1303.         if(pw[i]>'9')
  1304.  
  1305.             pw[i]+=7;
  1306.  
  1307.         if(pw[i]>'Z')
  1308.  
  1309.             pw[i]+=6;
  1310.  
  1311.     }
  1312.  
  1313.     pw[i]=0;
  1314.  
  1315. }
  1316.  
  1317.  
  1318.  
  1319. /*===========================================================================*/
  1320.  
  1321.  
  1322.  
  1323. char *bcrypt(plaintext, salt)
  1324.  
  1325.     char *plaintext, *salt;
  1326.  
  1327. {
  1328.  
  1329.     REG    BU64   b;
  1330.  
  1331.     static U32    SL[2];
  1332.  
  1333.     static char iobuf[16];
  1334.  
  1335.  
  1336.  
  1337.     iobuf[0]=salt[0];
  1338.  
  1339.     iobuf[1]=salt[1];
  1340.  
  1341.     bcrypt_set_word(plaintext);
  1342.  
  1343.     bcrypt_salt_to_E(salt[0], salt[1], SL);
  1344.  
  1345.     b=bcrypt_encode(SL[0], SL[1]);
  1346.  
  1347.     b.L=DE(b.L);
  1348.  
  1349.     b.R=DE(b.R);
  1350.  
  1351.     b=FP(b);
  1352.  
  1353.     bcrypt_BU64_to_pw(b, iobuf+2);
  1354.  
  1355.     return(iobuf);
  1356.  
  1357. }
  1358.  
  1359. #endif
  1360.  
  1361.  
  1362.  
  1363. /*==========================================================================*/
  1364.  
  1365.  
  1366.  
  1367. #if defined(_TURBO) || defined(_MICROSOFT)
  1368.  
  1369. void bcrypt_done()
  1370.  
  1371. {
  1372.  
  1373.     int i;
  1374.  
  1375.  
  1376.  
  1377.     for(i=0; i<4; i++) {
  1378.  
  1379.  
  1380.  
  1381. #ifdef _TURBO
  1382.  
  1383.         if (S3[i])
  1384.  
  1385.             farfree(S3[i]);
  1386.  
  1387.         if (S[i])
  1388.  
  1389.             farfree(S[i]);
  1390.  
  1391. #endif
  1392.  
  1393.  
  1394.  
  1395. #ifdef _MICROSOFT
  1396.  
  1397.         if (S3[i])
  1398.  
  1399.             _ffree(S3[i]);
  1400.  
  1401.         if (S[i])
  1402.  
  1403.             _ffree(S[i]);
  1404.  
  1405. #endif
  1406.  
  1407.  
  1408.  
  1409.     }
  1410.  
  1411. }
  1412.  
  1413. #endif
  1414.  
  1415.  
  1416.  
  1417. /*==========================================================================*/
  1418.  
  1419.  
  1420.  
  1421. void bcrypt_init()
  1422.  
  1423. {
  1424.  
  1425.     BU32 T, F;
  1426.  
  1427.     int  i, j, k;
  1428.  
  1429.  
  1430.  
  1431. #ifdef _TURBO
  1432.  
  1433.     for(i=0; i<4; i++) {
  1434.  
  1435.         S3[i]=(U32 *)farmalloc(sizeof(U32)*4096);
  1436.  
  1437.         S[i]=(U32 *)farmalloc(sizeof(U32)*4096);
  1438.  
  1439.         if ((!S3[i]) || (!S[i])) {
  1440.  
  1441.             bcrypt_done();
  1442.  
  1443.             exit(1);
  1444.  
  1445.         }
  1446.  
  1447.     }
  1448.  
  1449. #endif
  1450.  
  1451.  
  1452.  
  1453. #ifdef _MICROSOFT
  1454.  
  1455.     for(i=0; i<4; i++) {
  1456.  
  1457.         S3[i]=(U32 *)_fmalloc(sizeof(U32)*4096);
  1458.  
  1459.         S[i]=(U32 *)_fmalloc(sizeof(U32)*4096);
  1460.  
  1461.         if ((!S3[i]) || (!S[i])) {
  1462.  
  1463.             bcrypt_done();
  1464.  
  1465.             exit(1);
  1466.  
  1467.         }
  1468.  
  1469.     }
  1470.  
  1471. #endif
  1472.  
  1473.  
  1474.  
  1475.     for(i=0; i<64; i++) {
  1476.  
  1477.         T.U=0;
  1478.  
  1479.         F.U=(U32) OS[0][i];
  1480.  
  1481.         T.N.b23=F.N.b3;
  1482.  
  1483.         T.N.b15=F.N.b2;
  1484.  
  1485.         T.N.b9=F.N.b1;
  1486.  
  1487.         T.N.b1=F.N.b0;
  1488.  
  1489.         S2[0][i]=T.U;
  1490.  
  1491.     }
  1492.  
  1493.     for(i=0; i<64; i++) {
  1494.  
  1495.         T.U=0;
  1496.  
  1497.         F.U=(U32) OS[1][i];
  1498.  
  1499.         T.N.b30=F.N.b1;
  1500.  
  1501.         T.N.b19=F.N.b3;
  1502.  
  1503.         T.N.b14=F.N.b0;
  1504.  
  1505.         T.N.b4=F.N.b2;
  1506.  
  1507.         S2[1][i]=T.U;
  1508.  
  1509.     }
  1510.  
  1511.     for(i=0; i<64; i++) {
  1512.  
  1513.         T.U=0;
  1514.  
  1515.         F.U=(U32) OS[2][i];
  1516.  
  1517.         T.N.b26=F.N.b0;
  1518.  
  1519.         T.N.b16=F.N.b2;
  1520.  
  1521.         T.N.b8=F.N.b3;
  1522.  
  1523.         T.N.b2=F.N.b1;
  1524.  
  1525.         S2[2][i]=T.U;
  1526.  
  1527.     }
  1528.  
  1529.     for(i=0; i<64; i++) {
  1530.  
  1531.         T.U=0;
  1532.  
  1533.         F.U=(U32) OS[3][i];
  1534.  
  1535.         T.N.b31=F.N.b0;
  1536.  
  1537.         T.N.b22=F.N.b1;
  1538.  
  1539.         T.N.b12=F.N.b2;
  1540.  
  1541.         T.N.b6=F.N.b3;
  1542.  
  1543.         S2[3][i]=T.U;
  1544.  
  1545.     }
  1546.  
  1547.     for(i=0; i<64; i++) {
  1548.  
  1549.         T.U=0;
  1550.  
  1551.         F.U=(U32) OS[4][i];
  1552.  
  1553.         T.N.b29=F.N.b0;
  1554.  
  1555.         T.N.b24=F.N.b3;
  1556.  
  1557.         T.N.b18=F.N.b2;
  1558.  
  1559.         T.N.b7=F.N.b1;
  1560.  
  1561.         S2[4][i]=T.U;
  1562.  
  1563.     }
  1564.  
  1565.     for(i=0; i<64; i++) {
  1566.  
  1567.         T.U=0;
  1568.  
  1569.         F.U=(U32) OS[5][i];
  1570.  
  1571.         T.N.b28=F.N.b3;
  1572.  
  1573.         T.N.b21=F.N.b1;
  1574.  
  1575.         T.N.b13=F.N.b0;
  1576.  
  1577.         T.N.b3=F.N.b2;
  1578.  
  1579.         S2[5][i]=T.U;
  1580.  
  1581.     }
  1582.  
  1583.     for(i=0; i<64; i++) {
  1584.  
  1585.         T.U=0;
  1586.  
  1587.         F.U=(U32) OS[6][i];
  1588.  
  1589.         T.N.b25=F.N.b0;
  1590.  
  1591.         T.N.b20=F.N.b2;
  1592.  
  1593.         T.N.b10=F.N.b1;
  1594.  
  1595.         T.N.b0=F.N.b3;
  1596.  
  1597.         S2[6][i]=T.U;
  1598.  
  1599.     }
  1600.  
  1601.     for(i=0; i<64; i++) {
  1602.  
  1603.         T.U=0;
  1604.  
  1605.         F.U=(U32) OS[7][i];
  1606.  
  1607.         T.N.b27=F.N.b3;
  1608.  
  1609.         T.N.b17=F.N.b1;
  1610.  
  1611.         T.N.b11=F.N.b0;
  1612.  
  1613.         T.N.b5=F.N.b2;
  1614.  
  1615.         S2[7][i]=T.U;
  1616.  
  1617.     }
  1618.  
  1619.     for(k=0; k<4; k++) {
  1620.  
  1621.         for(i=0; i<64; i++) {
  1622.  
  1623.             for(j=0; j<64; j++) {
  1624.  
  1625.                 F.U=S2[k][i] | S2[k+4][j];
  1626.  
  1627.                 F=EN(F);
  1628.  
  1629.                 S3[k][(i*64)+j]=F.U;
  1630.  
  1631.             }
  1632.  
  1633.         }
  1634.  
  1635.     }
  1636.  
  1637.     for(j=0; j<4096; j++)
  1638.  
  1639.         S[0][CV0((U32) j)]=S3[0][j];
  1640.  
  1641.     for(j=0; j<4096; j++)
  1642.  
  1643.         S[1][CV1((U32) j)]=S3[1][j];
  1644.  
  1645.     for(j=0; j<4096; j++)
  1646.  
  1647.         S[2][CV1((U32) j)]=S3[2][j];
  1648.  
  1649.     for(j=0; j<4096; j++)
  1650.  
  1651.         S[3][CV1((U32) j)]=S3[3][j];
  1652.  
  1653. }
  1654.  
  1655.