home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / net / www / auth / basic.java < prev   
Text File  |  1995-08-11  |  5KB  |  195 lines

  1. /*
  2.  * @(#)basic.java    1.8 95/05/12 Jonathan Payne
  3.  *
  4.  * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software
  7.  * and its documentation for NON-COMMERCIAL purposes and without
  8.  * fee is hereby granted provided that this copyright notice
  9.  * appears in all copies. Please refer to the file "copyright.html"
  10.  * for further important copyright and licensing information.
  11.  *
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  13.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  14.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  15.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  16.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  17.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  18.  */
  19.  
  20. package net.www.auth;
  21.  
  22. import java.io.InputStream;
  23. import java.io.OutputStream;
  24. import java.io.FileInputStream;
  25. import java.io.FileOutputStream;
  26.  
  27. /**
  28.  *  From RFC 1421
  29.  *
  30.  * @version 1.8 12 May 1995
  31.  * @author Jonathan Payne
  32. *
  33.  * This class has a lowercase name because we usually create an
  34.  * instance of it by catenating the name of the current
  35.  * authentication type with the package name.  In order to guarantee
  36.  * a consistent pattern we always convert the authentication type to
  37.  * lower case.
  38.  */
  39. public class basic extends Authenticator {
  40.     static private byte six2print[] = {
  41.     'A','B','C','D','E','F','G','H','I','J','K','L','M',
  42.     'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
  43.     'a','b','c','d','e','f','g','h','i','j','k','l','m',
  44.     'n','o','p','q','r','s','t','u','v','w','x','y','z',
  45.     '0','1','2','3','4','5','6','7','8','9','+','/'
  46.     };
  47.  
  48.     static private byte print2six[] = new byte[128];
  49.     static final int    ILLEGAL = -1;
  50.  
  51.     static {
  52.     int i, limit;
  53.  
  54.     limit = six2print.length;
  55.  
  56.     for (i = print2six.length; --i >= 0; ) {
  57.         print2six[i] = (byte) ILLEGAL;
  58.     }
  59.  
  60.     for (i = 0; --limit >= 0; i++) {
  61.         print2six[six2print[i]] = (byte) i;
  62.     }
  63.     }
  64.  
  65.     public void encrypt(InputStream is, OutputStream os) {
  66.     int chunk;
  67.     int c = -1;
  68.     int lineCnt = 64;
  69.     int shift;
  70.  
  71. loop:
  72.     do {
  73.         shift = 24;
  74.         chunk = 0;
  75.  
  76.         while ((shift -= 8) >= 0) {
  77.         switch (c = is.read()) {
  78.         case -1:
  79.             break loop;
  80.  
  81.         default:
  82.             chunk |= (c << shift);
  83.             break;
  84.         }
  85.         }
  86.         shift = 24;
  87.         while ((shift -= 6) >= 0) {
  88.         os.write(six2print[(chunk >> shift) & 0x3f]);
  89.         }
  90.         if ((lineCnt -= 4) == 0) {
  91.         os.write('\n');
  92.         lineCnt = 64;
  93.         }
  94.     } while (true);
  95.  
  96.     switch (shift) {
  97.     case 16:    /* 0 bits left to process */
  98.         break;
  99.  
  100.     case 8:        /* 8 bits (1 byte) left to process */
  101.         os.write(six2print[(chunk >> 18) & 0x3f]);
  102.         os.write(six2print[(chunk >> 12) & 0x3f]);
  103.         os.write('=');
  104.         os.write('=');
  105.         break;
  106.  
  107.     case 0:        /* 16 bits (2 bytes) left to process */
  108.         os.write(six2print[(chunk >> 18) & 0x3f]);
  109.         os.write(six2print[(chunk >> 12) & 0x3f]);
  110.         os.write(six2print[(chunk >> 6) & 0x3f]);
  111.         os.write('=');
  112.         break;
  113.     }
  114.     }
  115.  
  116.     public void decrypt(InputStream is, OutputStream os) {
  117.     int c;
  118.     int shift;
  119.     int chunk;
  120.     int charCnt = 64;
  121.  
  122. loop:
  123.     do {
  124.         shift = 24;
  125.         chunk = 0;
  126.         while ((shift -= 6) >= 0) {
  127.         switch (c = is.read()) {
  128.         case '=':
  129.             break loop;
  130.  
  131.         case '\n':
  132.             if (charCnt == 0) {
  133.             charCnt = 64;
  134.             continue loop;
  135.             }
  136.             throw new Exception("Invalid encryption");
  137.  
  138.         case -1:
  139.             if (shift == 18) {
  140.             throw new Exception("Invalid encryption");
  141.             }
  142.             break loop;
  143.  
  144.         default:
  145.             {
  146.             int cc = print2six[c];
  147.  
  148.             switch (cc) {
  149.             case ILLEGAL:
  150.                 throw new Exception("Invalid encryption");
  151.  
  152.             default:
  153.                 chunk |= (cc << shift);
  154.                 break;
  155.             }
  156.             }
  157.             break;
  158.         }
  159.         }
  160.         shift = 24;
  161.         while ((shift -= 8) >= 0) {
  162.         os.write((chunk >> shift) & 0xff);
  163.         }
  164.         charCnt -= 4;
  165.     } while (true);
  166.  
  167.     switch (shift) {
  168.     case 18:    /* nothing to process */
  169.         break;
  170.  
  171.     case 12:    /* one 6 bit entity is illegal */
  172.         throw new Exception("Invalid encryption");
  173.  
  174.     case 6:        /* two 6 bit entities = one 8 bit byte */
  175.         os.write((chunk >> 16) & 0xff);
  176.         break;
  177.  
  178.     case 0:
  179.         os.write((chunk >> 16) & 0xff);
  180.         os.write(chunk & 0xff);
  181.         break;
  182.     }        
  183.     }
  184.  
  185.     static public void main(String args[]) {
  186.     Authenticator a = new basic();
  187.     FileOutputStream os = new FileOutputStream("/home/jpayne/livejava/test.uu");
  188.  
  189.     a.encrypt(new FileInputStream("/home/jpayne/livejava/test.ascii"), os);
  190.     os.close();
  191.     a.decrypt(new FileInputStream("/home/jpayne/livejava/test.uu"), System.out);
  192.     System.out.flush();
  193.     }
  194. }
  195.