Source for gnu.javax.security.auth.Password

   1: /* Password.java -- opaque wrapper around a password.
   2:    Copyright (C) 2004, 2006 Free Software Foundation, Inc.
   3: 
   4: This file is a part of GNU Classpath.
   5: 
   6: GNU Classpath is free software; you can redistribute it and/or modify
   7: it under the terms of the GNU General Public License as published by
   8: the Free Software Foundation; either version 2 of the License, or (at
   9: your option) any later version.
  10: 
  11: GNU Classpath is distributed in the hope that it will be useful, but
  12: WITHOUT ANY WARRANTY; without even the implied warranty of
  13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14: General Public License for more details.
  15: 
  16: You should have received a copy of the GNU General Public License
  17: along with GNU Classpath; if not, write to the Free Software
  18: Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
  19: USA
  20: 
  21: Linking this library statically or dynamically with other modules is
  22: making a combined work based on this library.  Thus, the terms and
  23: conditions of the GNU General Public License cover the whole
  24: combination.
  25: 
  26: As a special exception, the copyright holders of this library give you
  27: permission to link this library with independent modules to produce an
  28: executable, regardless of the license terms of these independent
  29: modules, and to copy and distribute the resulting executable under
  30: terms of your choice, provided that you also meet, for each linked
  31: independent module, the terms and conditions of the license of that
  32: module.  An independent module is a module which is not derived from
  33: or based on this library.  If you modify this library, you may extend
  34: this exception to your version of the library, but you are not
  35: obligated to do so.  If you do not wish to do so, delete this
  36: exception statement from your version.  */
  37: 
  38: 
  39: package gnu.javax.security.auth;
  40: 
  41: import gnu.java.security.util.ExpirableObject;
  42: 
  43: /**
  44:  * Immutible, though destroyable, password class.
  45:  *
  46:  * <p>Extends {@link ExpirableObject}, implementing {@link doDestroy()}
  47:  * in which encapsulated {@link char[]}, and {@link byte[]} password fields
  48:  * are cleared (elements set to zero) in order to thwart memory heap
  49:  * snooping.
  50:  */
  51: public final class Password extends ExpirableObject
  52: {
  53: 
  54:   // Constants and variables
  55:   // -------------------------------------------------------------------------
  56: 
  57:   /**
  58:    * Password stored in {@link char[]} format.
  59:    */
  60:   private final char[] password;
  61: 
  62:   /**
  63:    * Password stored in {@link byte[]} format.
  64:    */
  65:   private final byte[] bPassword;
  66: 
  67:   /**
  68:    * Indicates whether this Password object's {@link doDestroy()} method has
  69:    * been called.  See also, {@link ExpirableObject#Destroy()}.
  70:    */
  71:   private boolean mIsDestroyed = false;
  72: 
  73:   // Constructor(s)
  74:   // -------------------------------------------------------------------------
  75: 
  76:   /**
  77:    * Create a new expirable Password object that will expire after the
  78:    * default timeout {@link ExpirableObject#DEFAULT_TIMEOUT}.
  79:    *
  80:    * @param password The character array password to associate with this
  81:    * Password object.
  82:    */
  83:   public Password (char[] password)
  84:   {
  85:     this (password, 0, password.length, DEFAULT_TIMEOUT);
  86:   }
  87: 
  88:   /**
  89:    * Create a new expirable Password object that will expire after the
  90:    * timeout denoted by constructor parameter, <i>delay</i>.
  91:    *
  92:    * @param password The character array password to associate with this
  93:    * Password object.
  94:    * @param delay The number of miliseconds before this Password object
  95:    * will be automatically destroyed.
  96:    */
  97:   public Password (char[] password, long delay)
  98:   {
  99:     this (password, 0, password.length, delay);
 100:   }
 101: 
 102:   /**
 103:    * Create a new expirable Password object that will expire after the
 104:    * default timeout {@link ExpirableObject#DEFAULT_TIMEOUT}.
 105:    *
 106:    * @param password The character array password to associate with this
 107:    * Password object.
 108:    * @param offset The <i>password</i> character array parameter element
 109:    * marking the beginning of the contained password string.
 110:    * @param length The number of characters, beginning at <i>offset</i>,
 111:    * to be copied into this object's {@link password} field.
 112:    */
 113:   public Password (char[] password, int offset, int length)
 114:   {
 115:     this (password, offset, length, DEFAULT_TIMEOUT);
 116:   }
 117: 
 118:   /**
 119:    * Create a new expirable Password object that will expire after the
 120:    * timeout denoted by constructor parameter, <i>delay</i>.
 121:    *
 122:    * @param password The character array password to associate with this
 123:    * Password object.
 124:    * @param offset The <i>password</i> character array parameter element
 125:    * marking the beginning of the contained password string.
 126:    * @param length The number of characters, beginning at <i>offset</i>,
 127:    * to be copied into this object's {@link password} field.
 128:    * @param delay The number of miliseconds before this Password object
 129:    * will be automatically destroyed.
 130:    */
 131:   public Password (char[] password, int offset, int length, long delay)
 132:   {
 133:     super (delay);
 134: 
 135:     if (offset < 0 || length < 0 || offset + length > password.length)
 136:       throw new ArrayIndexOutOfBoundsException ("off=" + offset + " length=" +
 137:                                                 length + " array.length=" +
 138:                                                 password.length);
 139: 
 140:     int i, j;
 141:     this.password = new char[length];
 142:     bPassword = new byte[length];
 143: 
 144:     for(i = 0, j = offset; i < length; i++, j++)
 145:       {
 146:         this.password[i] = password[j];
 147:         // XXX this should use character encodings, other than ASCII.
 148:         bPassword[i] = (byte) (password[j] & 0x7F);
 149:       }
 150:   }
 151: 
 152:   /**
 153:    * Create a new expirable Password object that will expire after the
 154:    * default timeout {@link ExpirableObject#DEFAULT_TIMEOUT}.
 155:    *
 156:    * @param password The byte array password to associate with this
 157:    * Password object.
 158:    */
 159:   public Password (byte[] password)
 160:   {
 161:     this (password, 0, password.length, DEFAULT_TIMEOUT);
 162:   }
 163: 
 164:   /**
 165:    * Create a new expirable Password object that will expire after the
 166:    * timeout denoted by constructor parameter, <i>delay</i>.
 167:    *
 168:    * @param password The byte array password to associate with this
 169:    * Password object.
 170:    * @param delay The number of miliseconds before this Password object
 171:    * will be automatically destroyed.
 172:    */
 173:   public Password (byte[] password, long delay)
 174:   {
 175:     this (password, 0, password.length, delay);
 176:   }
 177: 
 178:   /**
 179:    * Create a new expirable Password object that will expire after the
 180:    * default timeout {@link ExpirableObject#DEFAULT_TIMEOUT}.
 181:    *
 182:    * @param password The byte array password to associate with this
 183:    * Password object.
 184:    * @param offset The <i>password</i> byte array parameter element
 185:    * marking the beginning of the contained password string.
 186:    * @param length The number of bytes, beginning at <i>offset</i>,
 187:    * to be copied into this object's {@link password} field.
 188:    */
 189:   public Password (byte[] password, int offset, int length)
 190:   {
 191:     this (password, offset, length, DEFAULT_TIMEOUT);
 192:   }
 193: 
 194:   /**
 195:    * Create a new expirable Password object that will expire after the
 196:    * timeout denoted by constructor parameter, <i>delay</i>.
 197:    *
 198:    * @param password The byte array password to associate with this
 199:    * Password object.
 200:    * @param offset The <i>password</i> byte array parameter element
 201:    * marking the beginning of the contained password string.
 202:    * @param length The number of bytes, beginning at <i>offset</i>,
 203:    * to be copied into this object's {@link bPassword} field.
 204:    * @param delay The number of miliseconds before this Password object
 205:    * will be automatically destroyed.
 206:    */
 207:   public Password (byte[] password, int offset, int length, long delay)
 208:   {
 209:     super (delay);
 210: 
 211:     if (offset < 0 || length < 0 || offset + length > password.length)
 212:       throw new ArrayIndexOutOfBoundsException ("off=" + offset + " length=" +
 213:                                                 length + " array.length=" +
 214:                                                 password.length);
 215: 
 216:     int i, j;
 217:     this.password = new char[length];
 218:     bPassword = new byte[length];
 219: 
 220:     for (i = 0, j = offset; i < length; i++, j++)
 221:       {
 222:         this.password[i] = (char) password[j];
 223:         bPassword[i] = password[j];
 224:       }
 225:   }
 226: 
 227:   // Instance methods
 228:   // -------------------------------------------------------------------------
 229: 
 230:   /**
 231:    * Returns a reference to the {@link char[]} password storage field,
 232:    * {@link password}.
 233:    */
 234:   public synchronized char[] getPassword()
 235:   {
 236:     if (mIsDestroyed)
 237:       throw new IllegalStateException ("Attempted destroyed password access.");
 238: 
 239:     return password;
 240:   }
 241: 
 242:   /**
 243:    * Returns a reference to the {@link byte[]} password storage field,
 244:    * {@link bPassword}.
 245:    */
 246:   public synchronized byte[] getBytes()
 247:   {
 248:     if (mIsDestroyed)
 249:       throw new IllegalStateException ("Attempted destroyed password access.");
 250: 
 251:     return bPassword;
 252:   }
 253: 
 254:   /**
 255:    * Sets password field char[], and byte[] array elements to zero.
 256:    * This method implements base class {@link ExpirableObject} abstract
 257:    * method, {@link ExpirableObject#doDestroy()}.  See also,
 258:    * {@link ExpirableObject#destroy()}.
 259:    */
 260:   protected synchronized void doDestroy()
 261:   {
 262:     if (isDestroyed())
 263:       return;
 264:     else
 265:       {
 266:         for (int i = 0; i < password.length; i++)
 267:           password[i] = 0;
 268:         for (int i = 0; i < bPassword.length; i++)
 269:           bPassword[i] = 0;
 270:         mIsDestroyed = true;
 271:       }
 272:   }
 273: 
 274:   /**
 275:    * Returns true, or false relative to whether, or not this object's
 276:    * {@link doDestroy()} method has been called.  See also,
 277:    * {@ExpirableObject#destroy()}.
 278:    */
 279:   public synchronized boolean isDestroyed()
 280:   {
 281:     return (mIsDestroyed);
 282:   }
 283: }