Print this page
first pass

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libnsl/des/des_soft.c
          +++ new/usr/src/lib/libnsl/des/des_soft.c
↓ open down ↓ 154 lines elided ↑ open up ↑
 155  155          }
 156  156  }
 157  157  
 158  158  /*
 159  159   * Software encrypt or decrypt a block of data (multiple of 8 bytes)
 160  160   * Do the CBC ourselves if needed.
 161  161   */
 162  162  int
 163  163  __des_crypt(char *buf, unsigned len, struct desparams *desp)
 164  164  {
 165      -/* EXPORT DELETE START */
 166  165          short i;
 167  166          unsigned mode;
 168  167          unsigned dir;
 169  168          char nextiv[8];
 170  169          struct deskeydata softkey;
 171  170  
 172  171          mode = (unsigned)desp->des_mode;
 173  172          dir = (unsigned)desp->des_dir;
 174  173          (void) __des_setkey(desp->des_key, &softkey, dir);
 175  174          while (len != 0) {
↓ open down ↓ 18 lines elided ↑ open up ↑
 194  193                                  break;
 195  194                          }
 196  195                          break;
 197  196                  case ECB:
 198  197                          (void) __des_encrypt((uchar_t *)buf, &softkey);
 199  198                          break;
 200  199                  }
 201  200                  buf += 8;
 202  201                  len -= 8;
 203  202          }
 204      -/* EXPORT DELETE END */
 205  203          return (1);
 206  204  }
 207  205  
 208  206  
 209  207  /*
 210  208   * Set the key and direction for an encryption operation
 211  209   * We build the 16 key entries here
 212  210   */
 213  211  static int
 214  212  __des_setkey(uchar_t userkey[8], struct deskeydata *kd, unsigned dir)
 215  213  {
 216      -/* EXPORT DELETE START */
 217  214          int32_t C, D;
 218  215          short i;
 219  216  
 220  217          /*
 221  218           * First, generate C and D by permuting
 222  219           * the key. The low order bit of each
 223  220           * 8-bit char is not used, so C and D are only 28
 224  221           * bits apiece.
 225  222           */
 226  223          {
↓ open down ↓ 59 lines elided ↑ open up ↑
 286  283                                  if (C & (BIT28 >> PC2_C[bit]))
 287  284                                          c->long0 |= bbit >> k;
 288  285                                  if (D & (BIT28 >> PC2_D[bit]))
 289  286                                          c->long1 |= bbit >> k;
 290  287                                  bit++;
 291  288                          }
 292  289                          bbit >>= 8;
 293  290                  }
 294  291  
 295  292          }
 296      -/* EXPORT DELETE END */
 297  293          return (1);
 298  294  }
 299  295  
 300  296  
 301  297  
 302  298  /*
 303  299   * Do an encryption operation
 304  300   * Much pain is taken (with preprocessor) to avoid loops so the compiler
 305  301   * can do address arithmetic instead of doing it at runtime.
 306  302   * Note that the byte-to-chunk conversion is necessary to guarantee
 307  303   * processor byte-order independence.
 308  304   */
 309  305  static int
 310  306  __des_encrypt(uchar_t *data, struct deskeydata *kd)
 311  307  {
 312      -/* EXPORT DELETE START */
 313  308          chunk_t work1, work2;
 314  309  
 315  310          /*
 316  311           * Initial permutation
 317  312           * and byte to chunk conversion
 318  313           */
 319  314          {
 320  315                  const uint32_t *lp;
 321  316                  uint32_t l0, l1, w;
 322  317                  short i, pbit;
↓ open down ↓ 146 lines elided ↑ open up ↑
 469  464          }
 470  465          data[0] = work2.byte0;
 471  466          data[1] = work2.byte1;
 472  467          data[2] = work2.byte2;
 473  468          data[3] = work2.byte3;
 474  469          data[4] = work2.byte4;
 475  470          data[5] = work2.byte5;
 476  471          data[6] = work2.byte6;
 477  472          data[7] = work2.byte7;
 478  473  
 479      -/* EXPORT DELETE END */
 480  474          return (1);
 481  475  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX