Helper.java
上传用户:huihesys
上传日期:2007-01-04
资源大小:3877k
文件大小:29k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /* CVS ID: $Id: Helper.java,v 1.4 2000/04/06 08:02:02 wastl Exp $ */
  2. package net.wastl.webmail.misc;
  3. import javax.mail.*;
  4. import java.net.*;
  5. import java.math.*;
  6. import java.util.*;
  7. import gnu.regexp.*;
  8. import net.wastl.webmail.server.http.HTTPRequestHeader;
  9. /*
  10.  * Helper.java
  11.  *
  12.  * Created: Tue Sep  7 13:03:44 1999
  13.  *
  14.  * Copyright (C) 1999-2000 Sebastian Schaffert
  15.  * 
  16.  * This program is free software; you can redistribute it and/or
  17.  * modify it under the terms of the GNU General Public License
  18.  * as published by the Free Software Foundation; either version 2
  19.  * of the License, or (at your option) any later version.
  20.  * 
  21.  * This program is distributed in the hope that it will be useful,
  22.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  23.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  24.  * GNU General Public License for more details.
  25.  * 
  26.  * You should have received a copy of the GNU General Public License
  27.  * along with this program; if not, write to the Free Software
  28.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  29.  */
  30. /**
  31.  * Miscellaneous helper routines.
  32.  *
  33.  * Created: Tue Sep  7 13:03:44 1999
  34.  *
  35.  * @author Sebastian Schaffert
  36.  * @version
  37.  */
  38. public class Helper  {
  39.     
  40.     public Helper() {
  41.     }
  42.    private static final int ITERATIONS = 16;
  43.    private static final int con_salt[] =
  44.    {
  45.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  46.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  47.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  48.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  49.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  50.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
  51.       0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 
  52.       0x0A, 0x0B, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 
  53.       0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 
  54.       0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 
  55.       0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 
  56.       0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24, 
  57.       0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 
  58.       0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 
  59.       0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 
  60.       0x3D, 0x3E, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 
  61.    };
  62.    private static final boolean shifts2[] =
  63.    {
  64.       false, false, true, true, true, true, true, true,
  65.       false, true,  true, true, true, true, true, false
  66.    };
  67.    private static final int skb[][] =
  68.    {
  69.       {
  70.          /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
  71.          0x00000000, 0x00000010, 0x20000000, 0x20000010, 
  72.          0x00010000, 0x00010010, 0x20010000, 0x20010010, 
  73.          0x00000800, 0x00000810, 0x20000800, 0x20000810, 
  74.          0x00010800, 0x00010810, 0x20010800, 0x20010810, 
  75.          0x00000020, 0x00000030, 0x20000020, 0x20000030, 
  76.          0x00010020, 0x00010030, 0x20010020, 0x20010030, 
  77.          0x00000820, 0x00000830, 0x20000820, 0x20000830, 
  78.          0x00010820, 0x00010830, 0x20010820, 0x20010830, 
  79.          0x00080000, 0x00080010, 0x20080000, 0x20080010, 
  80.          0x00090000, 0x00090010, 0x20090000, 0x20090010, 
  81.          0x00080800, 0x00080810, 0x20080800, 0x20080810, 
  82.          0x00090800, 0x00090810, 0x20090800, 0x20090810, 
  83.          0x00080020, 0x00080030, 0x20080020, 0x20080030, 
  84.          0x00090020, 0x00090030, 0x20090020, 0x20090030, 
  85.          0x00080820, 0x00080830, 0x20080820, 0x20080830, 
  86.          0x00090820, 0x00090830, 0x20090820, 0x20090830, 
  87.       },
  88.       {
  89.          /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
  90.          0x00000000, 0x02000000, 0x00002000, 0x02002000, 
  91.          0x00200000, 0x02200000, 0x00202000, 0x02202000, 
  92.          0x00000004, 0x02000004, 0x00002004, 0x02002004, 
  93.          0x00200004, 0x02200004, 0x00202004, 0x02202004, 
  94.          0x00000400, 0x02000400, 0x00002400, 0x02002400, 
  95.          0x00200400, 0x02200400, 0x00202400, 0x02202400, 
  96.          0x00000404, 0x02000404, 0x00002404, 0x02002404, 
  97.          0x00200404, 0x02200404, 0x00202404, 0x02202404, 
  98.          0x10000000, 0x12000000, 0x10002000, 0x12002000, 
  99.          0x10200000, 0x12200000, 0x10202000, 0x12202000, 
  100.          0x10000004, 0x12000004, 0x10002004, 0x12002004, 
  101.          0x10200004, 0x12200004, 0x10202004, 0x12202004, 
  102.          0x10000400, 0x12000400, 0x10002400, 0x12002400, 
  103.          0x10200400, 0x12200400, 0x10202400, 0x12202400, 
  104.          0x10000404, 0x12000404, 0x10002404, 0x12002404, 
  105.          0x10200404, 0x12200404, 0x10202404, 0x12202404, 
  106.       },
  107.       {
  108.          /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
  109.          0x00000000, 0x00000001, 0x00040000, 0x00040001, 
  110.          0x01000000, 0x01000001, 0x01040000, 0x01040001, 
  111.          0x00000002, 0x00000003, 0x00040002, 0x00040003, 
  112.          0x01000002, 0x01000003, 0x01040002, 0x01040003, 
  113.          0x00000200, 0x00000201, 0x00040200, 0x00040201, 
  114.          0x01000200, 0x01000201, 0x01040200, 0x01040201, 
  115.          0x00000202, 0x00000203, 0x00040202, 0x00040203, 
  116.          0x01000202, 0x01000203, 0x01040202, 0x01040203, 
  117.          0x08000000, 0x08000001, 0x08040000, 0x08040001, 
  118.          0x09000000, 0x09000001, 0x09040000, 0x09040001, 
  119.          0x08000002, 0x08000003, 0x08040002, 0x08040003, 
  120.          0x09000002, 0x09000003, 0x09040002, 0x09040003, 
  121.          0x08000200, 0x08000201, 0x08040200, 0x08040201, 
  122.          0x09000200, 0x09000201, 0x09040200, 0x09040201, 
  123.          0x08000202, 0x08000203, 0x08040202, 0x08040203, 
  124.          0x09000202, 0x09000203, 0x09040202, 0x09040203, 
  125.       },
  126.       {
  127.          /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
  128.          0x00000000, 0x00100000, 0x00000100, 0x00100100, 
  129.          0x00000008, 0x00100008, 0x00000108, 0x00100108, 
  130.          0x00001000, 0x00101000, 0x00001100, 0x00101100, 
  131.          0x00001008, 0x00101008, 0x00001108, 0x00101108, 
  132.          0x04000000, 0x04100000, 0x04000100, 0x04100100, 
  133.          0x04000008, 0x04100008, 0x04000108, 0x04100108, 
  134.          0x04001000, 0x04101000, 0x04001100, 0x04101100, 
  135.          0x04001008, 0x04101008, 0x04001108, 0x04101108, 
  136.          0x00020000, 0x00120000, 0x00020100, 0x00120100, 
  137.          0x00020008, 0x00120008, 0x00020108, 0x00120108, 
  138.          0x00021000, 0x00121000, 0x00021100, 0x00121100, 
  139.          0x00021008, 0x00121008, 0x00021108, 0x00121108, 
  140.          0x04020000, 0x04120000, 0x04020100, 0x04120100, 
  141.          0x04020008, 0x04120008, 0x04020108, 0x04120108, 
  142.          0x04021000, 0x04121000, 0x04021100, 0x04121100, 
  143.          0x04021008, 0x04121008, 0x04021108, 0x04121108, 
  144.       },
  145.       {
  146.          /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
  147.          0x00000000, 0x10000000, 0x00010000, 0x10010000, 
  148.          0x00000004, 0x10000004, 0x00010004, 0x10010004, 
  149.          0x20000000, 0x30000000, 0x20010000, 0x30010000, 
  150.          0x20000004, 0x30000004, 0x20010004, 0x30010004, 
  151.          0x00100000, 0x10100000, 0x00110000, 0x10110000, 
  152.          0x00100004, 0x10100004, 0x00110004, 0x10110004, 
  153.          0x20100000, 0x30100000, 0x20110000, 0x30110000, 
  154.          0x20100004, 0x30100004, 0x20110004, 0x30110004, 
  155.          0x00001000, 0x10001000, 0x00011000, 0x10011000, 
  156.          0x00001004, 0x10001004, 0x00011004, 0x10011004, 
  157.          0x20001000, 0x30001000, 0x20011000, 0x30011000, 
  158.          0x20001004, 0x30001004, 0x20011004, 0x30011004, 
  159.          0x00101000, 0x10101000, 0x00111000, 0x10111000, 
  160.          0x00101004, 0x10101004, 0x00111004, 0x10111004, 
  161.          0x20101000, 0x30101000, 0x20111000, 0x30111000, 
  162.          0x20101004, 0x30101004, 0x20111004, 0x30111004, 
  163.       },
  164.       {
  165.          /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
  166.          0x00000000, 0x08000000, 0x00000008, 0x08000008, 
  167.          0x00000400, 0x08000400, 0x00000408, 0x08000408, 
  168.          0x00020000, 0x08020000, 0x00020008, 0x08020008, 
  169.          0x00020400, 0x08020400, 0x00020408, 0x08020408, 
  170.          0x00000001, 0x08000001, 0x00000009, 0x08000009, 
  171.          0x00000401, 0x08000401, 0x00000409, 0x08000409, 
  172.          0x00020001, 0x08020001, 0x00020009, 0x08020009, 
  173.          0x00020401, 0x08020401, 0x00020409, 0x08020409, 
  174.          0x02000000, 0x0A000000, 0x02000008, 0x0A000008, 
  175.          0x02000400, 0x0A000400, 0x02000408, 0x0A000408, 
  176.          0x02020000, 0x0A020000, 0x02020008, 0x0A020008, 
  177.          0x02020400, 0x0A020400, 0x02020408, 0x0A020408, 
  178.          0x02000001, 0x0A000001, 0x02000009, 0x0A000009, 
  179.          0x02000401, 0x0A000401, 0x02000409, 0x0A000409, 
  180.          0x02020001, 0x0A020001, 0x02020009, 0x0A020009, 
  181.          0x02020401, 0x0A020401, 0x02020409, 0x0A020409, 
  182.       },
  183.       {
  184.          /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
  185.          0x00000000, 0x00000100, 0x00080000, 0x00080100, 
  186.          0x01000000, 0x01000100, 0x01080000, 0x01080100, 
  187.          0x00000010, 0x00000110, 0x00080010, 0x00080110, 
  188.          0x01000010, 0x01000110, 0x01080010, 0x01080110, 
  189.          0x00200000, 0x00200100, 0x00280000, 0x00280100, 
  190.          0x01200000, 0x01200100, 0x01280000, 0x01280100, 
  191.          0x00200010, 0x00200110, 0x00280010, 0x00280110, 
  192.          0x01200010, 0x01200110, 0x01280010, 0x01280110, 
  193.          0x00000200, 0x00000300, 0x00080200, 0x00080300, 
  194.          0x01000200, 0x01000300, 0x01080200, 0x01080300, 
  195.          0x00000210, 0x00000310, 0x00080210, 0x00080310, 
  196.          0x01000210, 0x01000310, 0x01080210, 0x01080310, 
  197.          0x00200200, 0x00200300, 0x00280200, 0x00280300, 
  198.          0x01200200, 0x01200300, 0x01280200, 0x01280300, 
  199.          0x00200210, 0x00200310, 0x00280210, 0x00280310, 
  200.          0x01200210, 0x01200310, 0x01280210, 0x01280310, 
  201.       },
  202.       {
  203.          /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
  204.          0x00000000, 0x04000000, 0x00040000, 0x04040000, 
  205.          0x00000002, 0x04000002, 0x00040002, 0x04040002, 
  206.          0x00002000, 0x04002000, 0x00042000, 0x04042000, 
  207.          0x00002002, 0x04002002, 0x00042002, 0x04042002, 
  208.          0x00000020, 0x04000020, 0x00040020, 0x04040020, 
  209.          0x00000022, 0x04000022, 0x00040022, 0x04040022, 
  210.          0x00002020, 0x04002020, 0x00042020, 0x04042020, 
  211.          0x00002022, 0x04002022, 0x00042022, 0x04042022, 
  212.          0x00000800, 0x04000800, 0x00040800, 0x04040800, 
  213.          0x00000802, 0x04000802, 0x00040802, 0x04040802, 
  214.          0x00002800, 0x04002800, 0x00042800, 0x04042800, 
  215.          0x00002802, 0x04002802, 0x00042802, 0x04042802, 
  216.          0x00000820, 0x04000820, 0x00040820, 0x04040820, 
  217.          0x00000822, 0x04000822, 0x00040822, 0x04040822, 
  218.          0x00002820, 0x04002820, 0x00042820, 0x04042820, 
  219.          0x00002822, 0x04002822, 0x00042822, 0x04042822, 
  220.       },
  221.    };
  222.    private static final int SPtrans[][] =
  223.    {
  224.       {
  225.          /* nibble 0 */
  226.          0x00820200, 0x00020000, 0x80800000, 0x80820200,
  227.          0x00800000, 0x80020200, 0x80020000, 0x80800000,
  228.          0x80020200, 0x00820200, 0x00820000, 0x80000200,
  229.          0x80800200, 0x00800000, 0x00000000, 0x80020000,
  230.          0x00020000, 0x80000000, 0x00800200, 0x00020200,
  231.          0x80820200, 0x00820000, 0x80000200, 0x00800200,
  232.          0x80000000, 0x00000200, 0x00020200, 0x80820000,
  233.          0x00000200, 0x80800200, 0x80820000, 0x00000000,
  234.          0x00000000, 0x80820200, 0x00800200, 0x80020000,
  235.          0x00820200, 0x00020000, 0x80000200, 0x00800200,
  236.          0x80820000, 0x00000200, 0x00020200, 0x80800000,
  237.          0x80020200, 0x80000000, 0x80800000, 0x00820000,
  238.          0x80820200, 0x00020200, 0x00820000, 0x80800200,
  239.          0x00800000, 0x80000200, 0x80020000, 0x00000000,
  240.          0x00020000, 0x00800000, 0x80800200, 0x00820200,
  241.          0x80000000, 0x80820000, 0x00000200, 0x80020200,
  242.       },
  243.       {
  244.          /* nibble 1 */
  245.          0x10042004, 0x00000000, 0x00042000, 0x10040000,
  246.          0x10000004, 0x00002004, 0x10002000, 0x00042000,
  247.          0x00002000, 0x10040004, 0x00000004, 0x10002000,
  248.          0x00040004, 0x10042000, 0x10040000, 0x00000004,
  249.          0x00040000, 0x10002004, 0x10040004, 0x00002000,
  250.          0x00042004, 0x10000000, 0x00000000, 0x00040004,
  251.          0x10002004, 0x00042004, 0x10042000, 0x10000004,
  252.          0x10000000, 0x00040000, 0x00002004, 0x10042004,
  253.          0x00040004, 0x10042000, 0x10002000, 0x00042004,
  254.          0x10042004, 0x00040004, 0x10000004, 0x00000000,
  255.          0x10000000, 0x00002004, 0x00040000, 0x10040004,
  256.          0x00002000, 0x10000000, 0x00042004, 0x10002004,
  257.          0x10042000, 0x00002000, 0x00000000, 0x10000004,
  258.          0x00000004, 0x10042004, 0x00042000, 0x10040000,
  259.          0x10040004, 0x00040000, 0x00002004, 0x10002000,
  260.          0x10002004, 0x00000004, 0x10040000, 0x00042000,
  261.       },
  262.       {
  263.          /* nibble 2 */
  264.          0x41000000, 0x01010040, 0x00000040, 0x41000040,
  265.          0x40010000, 0x01000000, 0x41000040, 0x00010040,
  266.          0x01000040, 0x00010000, 0x01010000, 0x40000000,
  267.          0x41010040, 0x40000040, 0x40000000, 0x41010000,
  268.          0x00000000, 0x40010000, 0x01010040, 0x00000040,
  269.          0x40000040, 0x41010040, 0x00010000, 0x41000000,
  270.          0x41010000, 0x01000040, 0x40010040, 0x01010000,
  271.          0x00010040, 0x00000000, 0x01000000, 0x40010040,
  272.          0x01010040, 0x00000040, 0x40000000, 0x00010000,
  273.          0x40000040, 0x40010000, 0x01010000, 0x41000040,
  274.          0x00000000, 0x01010040, 0x00010040, 0x41010000,
  275.          0x40010000, 0x01000000, 0x41010040, 0x40000000,
  276.          0x40010040, 0x41000000, 0x01000000, 0x41010040,
  277.          0x00010000, 0x01000040, 0x41000040, 0x00010040,
  278.          0x01000040, 0x00000000, 0x41010000, 0x40000040,
  279.          0x41000000, 0x40010040, 0x00000040, 0x01010000,
  280.       },
  281.       {
  282.          /* nibble 3 */
  283.          0x00100402, 0x04000400, 0x00000002, 0x04100402,
  284.          0x00000000, 0x04100000, 0x04000402, 0x00100002,
  285.          0x04100400, 0x04000002, 0x04000000, 0x00000402,
  286.          0x04000002, 0x00100402, 0x00100000, 0x04000000,
  287.          0x04100002, 0x00100400, 0x00000400, 0x00000002,
  288.          0x00100400, 0x04000402, 0x04100000, 0x00000400,
  289.          0x00000402, 0x00000000, 0x00100002, 0x04100400,
  290.          0x04000400, 0x04100002, 0x04100402, 0x00100000,
  291.          0x04100002, 0x00000402, 0x00100000, 0x04000002,
  292.          0x00100400, 0x04000400, 0x00000002, 0x04100000,
  293.          0x04000402, 0x00000000, 0x00000400, 0x00100002,
  294.          0x00000000, 0x04100002, 0x04100400, 0x00000400,
  295.          0x04000000, 0x04100402, 0x00100402, 0x00100000,
  296.          0x04100402, 0x00000002, 0x04000400, 0x00100402,
  297.          0x00100002, 0x00100400, 0x04100000, 0x04000402,
  298.          0x00000402, 0x04000000, 0x04000002, 0x04100400,
  299.       },
  300.       {
  301.          /* nibble 4 */
  302.          0x02000000, 0x00004000, 0x00000100, 0x02004108,
  303.          0x02004008, 0x02000100, 0x00004108, 0x02004000,
  304.          0x00004000, 0x00000008, 0x02000008, 0x00004100,
  305.          0x02000108, 0x02004008, 0x02004100, 0x00000000,
  306.          0x00004100, 0x02000000, 0x00004008, 0x00000108,
  307.          0x02000100, 0x00004108, 0x00000000, 0x02000008,
  308.          0x00000008, 0x02000108, 0x02004108, 0x00004008,
  309.          0x02004000, 0x00000100, 0x00000108, 0x02004100,
  310.          0x02004100, 0x02000108, 0x00004008, 0x02004000,
  311.          0x00004000, 0x00000008, 0x02000008, 0x02000100,
  312.          0x02000000, 0x00004100, 0x02004108, 0x00000000,
  313.          0x00004108, 0x02000000, 0x00000100, 0x00004008,
  314.          0x02000108, 0x00000100, 0x00000000, 0x02004108,
  315.          0x02004008, 0x02004100, 0x00000108, 0x00004000,
  316.          0x00004100, 0x02004008, 0x02000100, 0x00000108,
  317.          0x00000008, 0x00004108, 0x02004000, 0x02000008,
  318.       },
  319.       {
  320.          /* nibble 5 */
  321.          0x20000010, 0x00080010, 0x00000000, 0x20080800,
  322.          0x00080010, 0x00000800, 0x20000810, 0x00080000,
  323.          0x00000810, 0x20080810, 0x00080800, 0x20000000,
  324.          0x20000800, 0x20000010, 0x20080000, 0x00080810,
  325.          0x00080000, 0x20000810, 0x20080010, 0x00000000,
  326.          0x00000800, 0x00000010, 0x20080800, 0x20080010,
  327.          0x20080810, 0x20080000, 0x20000000, 0x00000810,
  328.          0x00000010, 0x00080800, 0x00080810, 0x20000800,
  329.          0x00000810, 0x20000000, 0x20000800, 0x00080810,
  330.          0x20080800, 0x00080010, 0x00000000, 0x20000800,
  331.          0x20000000, 0x00000800, 0x20080010, 0x00080000,
  332.          0x00080010, 0x20080810, 0x00080800, 0x00000010,
  333.          0x20080810, 0x00080800, 0x00080000, 0x20000810,
  334.          0x20000010, 0x20080000, 0x00080810, 0x00000000,
  335.          0x00000800, 0x20000010, 0x20000810, 0x20080800,
  336.          0x20080000, 0x00000810, 0x00000010, 0x20080010,
  337.       },
  338.       {
  339.          /* nibble 6 */
  340.          0x00001000, 0x00000080, 0x00400080, 0x00400001,
  341.          0x00401081, 0x00001001, 0x00001080, 0x00000000,
  342.          0x00400000, 0x00400081, 0x00000081, 0x00401000,
  343.          0x00000001, 0x00401080, 0x00401000, 0x00000081,
  344.          0x00400081, 0x00001000, 0x00001001, 0x00401081,
  345.          0x00000000, 0x00400080, 0x00400001, 0x00001080,
  346.          0x00401001, 0x00001081, 0x00401080, 0x00000001,
  347.          0x00001081, 0x00401001, 0x00000080, 0x00400000,
  348.          0x00001081, 0x00401000, 0x00401001, 0x00000081,
  349.          0x00001000, 0x00000080, 0x00400000, 0x00401001,
  350.          0x00400081, 0x00001081, 0x00001080, 0x00000000,
  351.          0x00000080, 0x00400001, 0x00000001, 0x00400080,
  352.          0x00000000, 0x00400081, 0x00400080, 0x00001080,
  353.          0x00000081, 0x00001000, 0x00401081, 0x00400000,
  354.          0x00401080, 0x00000001, 0x00001001, 0x00401081,
  355.          0x00400001, 0x00401080, 0x00401000, 0x00001001,
  356.       },
  357.       {
  358.          /* nibble 7 */
  359.          0x08200020, 0x08208000, 0x00008020, 0x00000000,
  360.          0x08008000, 0x00200020, 0x08200000, 0x08208020,
  361.          0x00000020, 0x08000000, 0x00208000, 0x00008020,
  362.          0x00208020, 0x08008020, 0x08000020, 0x08200000,
  363.          0x00008000, 0x00208020, 0x00200020, 0x08008000,
  364.          0x08208020, 0x08000020, 0x00000000, 0x00208000,
  365.          0x08000000, 0x00200000, 0x08008020, 0x08200020,
  366.          0x00200000, 0x00008000, 0x08208000, 0x00000020,
  367.          0x00200000, 0x00008000, 0x08000020, 0x08208020,
  368.          0x00008020, 0x08000000, 0x00000000, 0x00208000,
  369.          0x08200020, 0x08008020, 0x08008000, 0x00200020,
  370.          0x08208000, 0x00000020, 0x00200020, 0x08008000,
  371.          0x08208020, 0x00200000, 0x08200000, 0x08000020,
  372.          0x00208000, 0x00008020, 0x08008020, 0x08200000,
  373.          0x00000020, 0x08208000, 0x00208020, 0x00000000,
  374.          0x08000000, 0x08200020, 0x00008000, 0x00208020
  375.       }
  376.    };
  377.    private static final int cov_2char[] =
  378.    {
  379.       0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 
  380.       0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 
  381.       0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 
  382.       0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 
  383.       0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x61, 0x62, 
  384.       0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 
  385.       0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 
  386.       0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A
  387.    };
  388.    private static final int byteToUnsigned(byte b)
  389.    {
  390.       int value = (int)b;
  391.       return(value >= 0 ? value : value + 256);
  392.    }
  393.    private static int fourBytesToInt(byte b[], int offset)
  394.    {
  395.       int value;
  396.       value  =  byteToUnsigned(b[offset++]);
  397.       value |= (byteToUnsigned(b[offset++]) <<  8);
  398.       value |= (byteToUnsigned(b[offset++]) << 16);
  399.       value |= (byteToUnsigned(b[offset++]) << 24);
  400.       return(value);
  401.    }
  402.    private static final void intToFourBytes(int iValue, byte b[], int offset)
  403.    {
  404.       b[offset++] = (byte)((iValue)        & 0xff);
  405.       b[offset++] = (byte)((iValue >>> 8 ) & 0xff);
  406.       b[offset++] = (byte)((iValue >>> 16) & 0xff);
  407.       b[offset++] = (byte)((iValue >>> 24) & 0xff);
  408.    }
  409.    private static final void PERM_OP(int a, int b, int n, int m, int results[])
  410.    {
  411.       int t;
  412.       t = ((a >>> n) ^ b) & m;
  413.       a ^= t << n;
  414.       b ^= t;
  415.       results[0] = a;
  416.       results[1] = b;
  417.    }
  418.    private static final int HPERM_OP(int a, int n, int m)
  419.    {
  420.       int t;
  421.       t = ((a << (16 - n)) ^ a) & m;
  422.       a = a ^ t ^ (t >>> (16 - n));
  423.       return(a);
  424.    }
  425.    private static int [] des_set_key(byte key[])
  426.    {
  427.       int schedule[] = new int[ITERATIONS * 2];
  428.       int c = fourBytesToInt(key, 0);
  429.       int d = fourBytesToInt(key, 4);
  430.       int results[] = new int[2];
  431.       PERM_OP(d, c, 4, 0x0f0f0f0f, results);
  432.       d = results[0]; c = results[1];
  433.       c = HPERM_OP(c, -2, 0xcccc0000);
  434.       d = HPERM_OP(d, -2, 0xcccc0000);
  435.       PERM_OP(d, c, 1, 0x55555555, results);
  436.       d = results[0]; c = results[1];
  437.       PERM_OP(c, d, 8, 0x00ff00ff, results);
  438.       c = results[0]; d = results[1];
  439.       PERM_OP(d, c, 1, 0x55555555, results);
  440.       d = results[0]; c = results[1];
  441.       d = (((d & 0x000000ff) <<  16) |  (d & 0x0000ff00)     |
  442.            ((d & 0x00ff0000) >>> 16) | ((c & 0xf0000000) >>> 4));
  443.       c &= 0x0fffffff;
  444.       int s, t;
  445.       int j = 0;
  446.       for(int i = 0; i < ITERATIONS; i ++)
  447.       {
  448.          if(shifts2[i])
  449.          {
  450.             c = (c >>> 2) | (c << 26);
  451.             d = (d >>> 2) | (d << 26);
  452.          }
  453.          else
  454.          {
  455.             c = (c >>> 1) | (c << 27);
  456.             d = (d >>> 1) | (d << 27);
  457.          }
  458.          c &= 0x0fffffff;
  459.          d &= 0x0fffffff;
  460.          s = skb[0][ (c       ) & 0x3f                       ]|
  461.              skb[1][((c >>>  6) & 0x03) | ((c >>>  7) & 0x3c)]|
  462.              skb[2][((c >>> 13) & 0x0f) | ((c >>> 14) & 0x30)]|
  463.              skb[3][((c >>> 20) & 0x01) | ((c >>> 21) & 0x06) |
  464.                                           ((c >>> 22) & 0x38)];
  465.          t = skb[4][ (d     )  & 0x3f                       ]|
  466.              skb[5][((d >>> 7) & 0x03) | ((d >>>  8) & 0x3c)]|
  467.              skb[6][ (d >>>15) & 0x3f                       ]|
  468.              skb[7][((d >>>21) & 0x0f) | ((d >>> 22) & 0x30)];
  469.          schedule[j++] = ((t <<  16) | (s & 0x0000ffff)) & 0xffffffff;
  470.          s             = ((s >>> 16) | (t & 0xffff0000));
  471.          s             = (s << 4) | (s >>> 28);
  472.          schedule[j++] = s & 0xffffffff;
  473.       }
  474.       return(schedule);
  475.    }
  476.    private static final int D_ENCRYPT
  477.    (
  478.       int L, int R, int S, int E0, int E1, int s[]
  479.    )
  480.    {
  481.       int t, u, v;
  482.       v = R ^ (R >>> 16);
  483.       u = v & E0;
  484.       v = v & E1;
  485.       u = (u ^ (u << 16)) ^ R ^ s[S];
  486.       t = (v ^ (v << 16)) ^ R ^ s[S + 1];
  487.       t = (t >>> 4) | (t << 28);
  488.       L ^= SPtrans[1][(t       ) & 0x3f] |
  489.            SPtrans[3][(t >>>  8) & 0x3f] |
  490.            SPtrans[5][(t >>> 16) & 0x3f] |
  491.            SPtrans[7][(t >>> 24) & 0x3f] |
  492.            SPtrans[0][(u       ) & 0x3f] |
  493.            SPtrans[2][(u >>>  8) & 0x3f] |
  494.            SPtrans[4][(u >>> 16) & 0x3f] |
  495.            SPtrans[6][(u >>> 24) & 0x3f];
  496.       return(L);
  497.    }
  498.    private static final int [] body(int schedule[], int Eswap0, int Eswap1)
  499.    {
  500.       int left = 0;
  501.       int right = 0;
  502.       int t     = 0;
  503.       for(int j = 0; j < 25; j ++)
  504.       {
  505.          for(int i = 0; i < ITERATIONS * 2; i += 4)
  506.          {
  507.             left  = D_ENCRYPT(left,  right, i,     Eswap0, Eswap1, schedule);
  508.             right = D_ENCRYPT(right, left,  i + 2, Eswap0, Eswap1, schedule);
  509.          }
  510.          t     = left; 
  511.          left  = right; 
  512.          right = t;
  513.       }
  514.       t = right;
  515.       right = (left >>> 1) | (left << 31);
  516.       left  = (t    >>> 1) | (t    << 31);
  517.       left  &= 0xffffffff;
  518.       right &= 0xffffffff;
  519.       int results[] = new int[2];
  520.       PERM_OP(right, left, 1, 0x55555555, results); 
  521.       right = results[0]; left = results[1];
  522.       PERM_OP(left, right, 8, 0x00ff00ff, results); 
  523.       left = results[0]; right = results[1];
  524.       PERM_OP(right, left, 2, 0x33333333, results); 
  525.       right = results[0]; left = results[1];
  526.       PERM_OP(left, right, 16, 0x0000ffff, results);
  527.       left = results[0]; right = results[1];
  528.       PERM_OP(right, left, 4, 0x0f0f0f0f, results);
  529.       right = results[0]; left = results[1];
  530.       int out[] = new int[2];
  531.       out[0] = left; out[1] = right;
  532.       return(out);
  533.    }
  534.     /**
  535.      * Perform a Unix crypt() operation 
  536.      */
  537.    public static final String crypt(String salt, String original)
  538.    {
  539.       while(salt.length() < 2)
  540.          salt += "A";
  541.       StringBuffer buffer = new StringBuffer("             ");
  542.       char charZero = salt.charAt(0);
  543.       char charOne  = salt.charAt(1);
  544.       buffer.setCharAt(0, charZero);
  545.       buffer.setCharAt(1, charOne);
  546.       int Eswap0 = con_salt[(int)charZero];
  547.       int Eswap1 = con_salt[(int)charOne] << 4;
  548.  
  549.       byte key[] = new byte[8];
  550.       for(int i = 0; i < key.length; i ++)
  551.          key[i] = (byte)0;
  552.       for(int i = 0; i < key.length && i < original.length(); i ++)
  553.       {
  554.          int iChar = (int)original.charAt(i);
  555.          key[i] = (byte)(iChar << 1);
  556.       }
  557.       int schedule[] = des_set_key(key);
  558.       int out[]      = body(schedule, Eswap0, Eswap1);
  559.       byte b[] = new byte[9];
  560.       intToFourBytes(out[0], b, 0);
  561.       intToFourBytes(out[1], b, 4);
  562.       b[8] = 0;
  563.       for(int i = 2, y = 0, u = 0x80; i < 13; i ++)
  564.       {
  565.          for(int j = 0, c = 0; j < 6; j ++)
  566.          {
  567.             c <<= 1;
  568.             if(((int)b[y] & u) != 0)
  569.                c |= 1;
  570.             u >>>= 1;
  571.             if(u == 0)
  572.             {
  573.                y++;
  574.                u = 0x80;
  575.             }
  576.             buffer.setCharAt(i, (char)cov_2char[c]);
  577.          }
  578.       }
  579.       return(buffer.toString());
  580.    }
  581.     public static String joinAddress(Address[] a) {
  582. String s="";
  583. if(a != null) {
  584.     for(int i=0;i<a.length;i++) {
  585. s+=a[i].toString()+", ";
  586.     }
  587.     s=s.substring(0,s.length()-2);
  588. } else {
  589.     s="";
  590. }
  591. return s;
  592.     }
  593.     /**
  594.      * Calculate session-ID for a session.
  595.      *
  596.      * @param a Adress of the remote host
  597.      * @param h Requestheader of the remote user agent
  598.      * @returns Session-ID
  599.      */
  600.     public static String calcSessionCode(InetAddress a, HTTPRequestHeader h) {
  601. String temp=a.toString().replace('n',' ')
  602.     +h.getHeader("User-Agent").replace('n',' ');
  603. temp=""+Long.toHexString(Math.abs(temp.hashCode()));
  604. if(h.getContent("login") != null && !h.getContent("login").equals("") && h.getPath().startsWith("/login")) {
  605.     temp += Long.toHexString(Math.abs(h.getContent("login").hashCode()));
  606.     temp += Long.toHexString(System.currentTimeMillis());
  607. } else if(h.getPath().startsWith("/admin/login")) {
  608.     temp+="admin";
  609. }
  610. return temp;
  611.     }
  612.     public static void main(String[] args) {
  613. System.err.println(Helper.crypt("AA",args[1]));
  614. String crypted=encryptTEA(args[1]);
  615. System.err.println("DES-Crypted: "+crypted);
  616. System.err.println("DES-Decrypted: "+decryptTEA(crypted));
  617.     }
  618.     private static String str_key="39e858f86df9b909a8c87cb8d9ad599";
  619.     public static String encryptTEA(String src) {
  620. byte[] key=new BigInteger(str_key, 16).toByteArray();
  621. TEA tea=new TEA(key);
  622. byte plainSource[] = src.getBytes();
  623. int enc[] = tea.encode(plainSource, plainSource.length);
  624. String s="";
  625. for(int i=0;i<enc.length;i++) {
  626.     s+=Integer.toHexString((byte)(enc[i] >>> 24)+128).toUpperCase()+":";
  627.     s+=Integer.toHexString((byte)(enc[i] >>> 16)+128).toUpperCase()+":";
  628.     s+=Integer.toHexString((byte)(enc[i] >>> 8)+128).toUpperCase()+":";
  629.     s+=Integer.toHexString((byte)(enc[i])+128).toUpperCase()+":";
  630. }
  631. //  System.err.println("encryptTEA: Returning "+s);
  632. return s;
  633.     }
  634.     
  635.     public static String decryptTEA(String src) {
  636. StringTokenizer tok=new StringTokenizer(src,": ");
  637. byte[] key=new BigInteger(str_key, 16).toByteArray();
  638. TEA tea=new TEA(key);
  639. byte inb[] = new byte[tok.countTokens()];
  640. for(int i=0;i<inb.length && tok.hasMoreTokens();i++) {
  641.     String s=tok.nextToken();
  642.     try {
  643. inb[i]=(byte)(Integer.parseInt(s,16)-128);
  644.     } catch(NumberFormatException ex) {
  645. System.err.println("Could not convert string '"+s+"' to byte.");
  646.     }
  647. }
  648. byte dec[] = tea.decode(inb,inb.length);
  649. String s=new String(dec);
  650. //  System.err.println("encryptTEA: Returning "+s);
  651. return s;
  652.     }
  653.     /** 
  654.      * Here we figure out which quote level this line has, simply by counting how many
  655.      * ">" are in front of the line, ignoring all whitespaces. 
  656.      */
  657.     public static int getQuoteLevel(String token) {
  658. int current_quotelevel=0;
  659. for(int i=0;i<token.length() && 
  660. (token.substring(i).startsWith(">") || token.substring(i).startsWith(" "));
  661.     i++) {
  662.     if(token.substring(i).startsWith(">")) current_quotelevel++;
  663. }
  664. return current_quotelevel;
  665.     }
  666.     protected static int findFittingBreakPos(String line, int linesize) {
  667. int pos;
  668. for(pos=linesize; pos>0; pos--) {
  669.     switch(line.charAt(pos)) {
  670.     case ' ':
  671.     case 'n':
  672.     case 't':
  673.     case '.':
  674.     case ',':
  675.     case ';':
  676.     case ':':
  677.     case '!':
  678.     case '?':
  679. return pos+1;
  680.     }
  681. }
  682. return linesize+1;
  683.     }
  684.     public static Enumeration breakLine(String line, int linesize, int quotelevel) {
  685. if(line.length() <= linesize) {
  686.     final String s=line;
  687.     return new Enumeration() {
  688.     int count=0;
  689.     public boolean hasMoreElements() {
  690. return count == 0;
  691.     }
  692.     
  693.     public Object nextElement() {
  694. count++;
  695. if(count==1) return s;
  696. else return null;
  697.     }
  698. };
  699. } else {
  700.     int breakpos=findFittingBreakPos(line,linesize);
  701.     final String first=line.substring(0,breakpos);
  702.     String rest="";
  703.     for(int i=0;i<quotelevel;i++) rest+=">";
  704.     rest+=line.substring(breakpos);
  705.     final Enumeration enum=breakLine(rest,linesize,quotelevel);
  706.     return new Enumeration() {
  707.     int count=0;
  708.     public boolean hasMoreElements() {
  709. return count < 1 || enum.hasMoreElements();
  710.     }
  711.     public Object nextElement() {
  712. count++;
  713. if(count == 1) {
  714.     return first;
  715. } else {
  716.     return enum.nextElement();
  717. }
  718.     }
  719. };
  720. }
  721.     }
  722.    
  723. } // Helper