001: /*
002: * @(#)SecretKey.java 1.7 02/07/24 @(#)
003: *
004: * Copyright (c) 2000-2001 Sun Microsystems, Inc. All rights reserved.
005: * PROPRIETARY/CONFIDENTIAL
006: * Use is subject to license terms.
007: */
008:
009: package com.sun.portal.ksecurity;
010:
011: /**
012: * Implements the base interface for keys used in symmetric algorithms.
013: */
014: public final class SecretKey implements Key {
015: /** Type of key, e.g. DES, RSA etc. */
016: byte kind;
017: /** Key size in bits, e.g. for RSA, this is modulus size. */
018: short bitsize;
019: /** Flag indicating if the key has been initialized. */
020: boolean initOk;
021: /** Local secret. */
022: byte[] secret = null;
023:
024: /**
025: * Creates a SecretKey object of the specified type and length.
026: *
027: * @param type type of the secret key
028: * @param len bit-length of the secret key
029: */
030: SecretKey(byte type, short len) {
031: kind = type;
032: bitsize = len;
033: initOk = false;
034: }
035:
036: /** Clears the key and sets it to uninitialized state. */
037: public void clearKey() {
038: initOk = false;
039: bitsize = 0;
040: }
041:
042: /**
043: * Gets the key size in bits.
044: *
045: * @return the key size in bits
046: */
047: public short getSize() {
048: return bitsize;
049: }
050:
051: /**
052: * Gets the key type.
053: *
054: * @return the key type
055: */
056: public byte getType() {
057: return kind;
058: }
059:
060: /**
061: * Checks if the key is initialized.
062: *
063: * @return true if the key has been initialized, false otherwise
064: */
065: public boolean isInitialized() {
066: return initOk;
067: }
068:
069: // The next two are only defined for DESKey or ARCfour key
070: /**
071: * Gets the key data. The data format is big-endian and
072: * right-aligned (the least significant bit is the least significant
073: * bit of last byte).
074: * @param buf the output buffer in which key data is to be placed
075: * @param off starting offset within buf for the key data.
076: * @return number of bytes of key data placed in buf.
077: * @see #setKey
078: */
079: public byte getKey(byte[] buf, short off) {
080: if (!initOk || ((off + secret.length) > buf.length))
081: return 0;
082: System.arraycopy(secret, 0, buf, off, secret.length);
083: return ((byte) secret.length);
084: }
085:
086: // REVISIT: this does zero-fill at the end ... we are ok doing this
087: // as long as we only support key sizes that are multiples of 8 bytes.
088: /**
089: * Sets the key data. The data format is big-endian and
090: * right-aligned (the least significant bit is the least significant
091: * bit of last byte).
092: * @param buf the input buffer containing key data
093: * @param off starting offset within buf for the key data.
094: * @exception CryptoException with reason code set to ILLEGAL_VALUE
095: * if the specified secret data is inconsistent with the key size.
096: * @see #getKey
097: */
098: public void setKey(byte[] buf, short off) throws CryptoException {
099: int cnt = (bitsize + 7) >>> 3;
100: if (off + cnt > buf.length) {
101: throw new CryptoException(CryptoException.ILLEGAL_VALUE);
102: }
103: secret = new byte[cnt];
104: System.arraycopy(buf, off, secret, 0, cnt);
105: initOk = true;
106: }
107:
108: /**
109: * Converts the key to its corresponding human readable string
110: * representation.
111: *
112: * @return a string representation of the secret key
113: */
114: public String toString() {
115: return ("[" + getSize() + "-bit secret key: 0x"
116: + KeyBuilder.hexEncode(secret) + "]");
117: }
118: }
|