mksp.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:5k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /*
  2.  *  mksp.c
  3.  *
  4.  *  Generate SP tables for DES-150 library
  5.  *
  6.  * The contents of this file are subject to the Mozilla Public
  7.  * License Version 1.1 (the "License"); you may not use this file
  8.  * except in compliance with the License. You may obtain a copy of
  9.  * the License at http://www.mozilla.org/MPL/
  10.  *
  11.  * Software distributed under the License is distributed on an "AS
  12.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  13.  * implied. See the License for the specific language governing
  14.  * rights and limitations under the License.
  15.  *
  16.  * The Original Code is the DES-150 library.
  17.  *
  18.  * The Initial Developer of the Original Code is Nelson B. Bolyard,
  19.  * nelsonb@iname.com.  Portions created by Nelson B. Bolyard are 
  20.  * Copyright (C) 1990, 2000  Nelson B. Bolyard, All Rights Reserved.
  21.  *
  22.  * Contributor(s):
  23.  *
  24.  * Alternatively, the contents of this file may be used under the
  25.  * terms of the GNU General Public License Version 2 or later (the
  26.  * "GPL"), in which case the provisions of the GPL are applicable
  27.  * instead of those above.  If you wish to allow use of your
  28.  * version of this file only under the terms of the GPL and not to
  29.  * allow others to use your version of this file under the MPL,
  30.  * indicate your decision by deleting the provisions above and
  31.  * replace them with the notice and other provisions required by
  32.  * the GPL.  If you do not delete the provisions above, a recipient
  33.  * may use your version of this file under either the MPL or the GPL.
  34.  */
  35. #include <stdio.h>
  36. /*
  37.  * sboxes - the tables for the s-box functions
  38.  *        from FIPS 46, pages 15-16.
  39.  */
  40. unsigned char S[8][64] = {
  41. /* Func S1 = */ {
  42. 14,  0,  4, 15, 13,  7,  1,  4,  2, 14, 15,  2, 11, 13,  8,  1,
  43.  3, 10, 10,  6,  6, 12, 12, 11,  5,  9,  9,  5,  0,  3,  7,  8,
  44.  4, 15,  1, 12, 14,  8,  8,  2, 13,  4,  6,  9,  2,  1, 11,  7,
  45. 15,  5, 12, 11,  9,  3,  7, 14,  3, 10, 10,  0,  5,  6,  0, 13
  46.     },
  47. /* Func S2 = */ {
  48. 15,  3,  1, 13,  8,  4, 14,  7,  6, 15, 11,  2,  3,  8,  4, 14,
  49.  9, 12,  7,  0,  2,  1, 13, 10, 12,  6,  0,  9,  5, 11, 10,  5,
  50.  0, 13, 14,  8,  7, 10, 11,  1, 10,  3,  4, 15, 13,  4,  1,  2,
  51.  5, 11,  8,  6, 12,  7,  6, 12,  9,  0,  3,  5,  2, 14, 15,  9
  52.     },
  53. /* Func S3 = */ {
  54. 10, 13,  0,  7,  9,  0, 14,  9,  6,  3,  3,  4, 15,  6,  5, 10,
  55.  1,  2, 13,  8, 12,  5,  7, 14, 11, 12,  4, 11,  2, 15,  8,  1,
  56. 13,  1,  6, 10,  4, 13,  9,  0,  8,  6, 15,  9,  3,  8,  0,  7,
  57. 11,  4,  1, 15,  2, 14, 12,  3,  5, 11, 10,  5, 14,  2,  7, 12
  58.     },
  59. /* Func S4 = */ {
  60.  7, 13, 13,  8, 14, 11,  3,  5,  0,  6,  6, 15,  9,  0, 10,  3,
  61.  1,  4,  2,  7,  8,  2,  5, 12, 11,  1, 12, 10,  4, 14, 15,  9,
  62. 10,  3,  6, 15,  9,  0,  0,  6, 12, 10, 11,  1,  7, 13, 13,  8,
  63. 15,  9,  1,  4,  3,  5, 14, 11,  5, 12,  2,  7,  8,  2,  4, 14
  64.     },
  65. /* Func S5 = */ {
  66.  2, 14, 12, 11,  4,  2,  1, 12,  7,  4, 10,  7, 11, 13,  6,  1,
  67.  8,  5,  5,  0,  3, 15, 15, 10, 13,  3,  0,  9, 14,  8,  9,  6,
  68.  4, 11,  2,  8,  1, 12, 11,  7, 10,  1, 13, 14,  7,  2,  8, 13,
  69. 15,  6,  9, 15, 12,  0,  5,  9,  6, 10,  3,  4,  0,  5, 14,  3
  70.     },
  71. /* Func S6 = */ {
  72. 12, 10,  1, 15, 10,  4, 15,  2,  9,  7,  2, 12,  6,  9,  8,  5,
  73.  0,  6, 13,  1,  3, 13,  4, 14, 14,  0,  7, 11,  5,  3, 11,  8,
  74.  9,  4, 14,  3, 15,  2,  5, 12,  2,  9,  8,  5, 12, 15,  3, 10,
  75.  7, 11,  0, 14,  4,  1, 10,  7,  1,  6, 13,  0, 11,  8,  6, 13
  76.     },
  77. /* Func S7 = */ {
  78.  4, 13, 11,  0,  2, 11, 14,  7, 15,  4,  0,  9,  8,  1, 13, 10,
  79.  3, 14, 12,  3,  9,  5,  7, 12,  5,  2, 10, 15,  6,  8,  1,  6,
  80.  1,  6,  4, 11, 11, 13, 13,  8, 12,  1,  3,  4,  7, 10, 14,  7,
  81. 10,  9, 15,  5,  6,  0,  8, 15,  0, 14,  5,  2,  9,  3,  2, 12
  82.     },
  83. /* Func S8 = */ {
  84. 13,  1,  2, 15,  8, 13,  4,  8,  6, 10, 15,  3, 11,  7,  1,  4,
  85. 10, 12,  9,  5,  3,  6, 14, 11,  5,  0,  0, 14, 12,  9,  7,  2,
  86.  7,  2, 11,  1,  4, 14,  1,  7,  9,  4, 12, 10, 14,  8,  2, 13,
  87.  0, 15,  6, 12, 10,  9, 13,  0, 15,  3,  3,  5,  5,  6,  8, 11
  88.     }
  89. };
  90. /*
  91.  * Permutation function for results from s-boxes
  92.  *   from FIPS 46 pages 12 and 16.
  93.  * P = 
  94.  */
  95. unsigned char P[32] = {
  96. 16,   7,  20,  21,  29,  12,  28,  17,
  97.  1,  15,  23,  26,   5,  18,  31,  10,
  98.  2,   8,  24,  14,  32,  27,   3,   9,
  99. 19,  13,  30,   6,  22,  11,   4,  25
  100. };
  101. unsigned int Pinv[32];
  102. unsigned int SP[8][64];
  103. void
  104. makePinv(void)
  105. {
  106.     int i;
  107.     unsigned int Pi = 0x80000000;
  108.     for (i = 0; i < 32; ++i) {
  109.      int j = 32 - P[i];
  110. Pinv[j] = Pi;
  111. Pi >>= 1;
  112.     }
  113. }
  114. void
  115. makeSP(void)
  116. {
  117.     int box;
  118.     for (box = 0; box < 8; ++box) {
  119. int item;
  120. printf("/* box S%d */ {n", box + 1);
  121.      for (item = 0; item < 64; ++item ) {
  122.     unsigned int s = S[box][item];
  123.     unsigned int val = 0;
  124.     unsigned int bitnum = (7-box) * 4;
  125.     for (; s; s >>= 1, ++bitnum) {
  126. if (s & 1) {
  127.     val |= Pinv[bitnum];
  128. }
  129.     }
  130.     val = (val << 3) | (val >> 29);
  131.     SP[box][item] = val;
  132. }
  133. for (item = 0; item < 64; item += 4) {
  134.     printf("t0x%08x, 0x%08x, 0x%08x, 0x%08x,n",
  135.     SP[box][item], SP[box][item+1], SP[box][item+2], SP[box][item+3]);
  136. }
  137. printf("    },n");
  138.     }
  139. }
  140. int
  141. main()
  142. {
  143.     makePinv();
  144.     makeSP();
  145.     return 0;
  146. }