001 /*
002 * Cumulus4j - Securing your data in the cloud - http://cumulus4j.org
003 * Copyright (C) 2011 NightLabs Consulting GmbH
004 *
005 * This program is free software: you can redistribute it and/or modify
006 * it under the terms of the GNU Affero General Public License as
007 * published by the Free Software Foundation, either version 3 of the
008 * License, or (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013 * GNU Affero General Public License for more details.
014 *
015 * You should have received a copy of the GNU Affero General Public License
016 * along with this program. If not, see <http://www.gnu.org/licenses/>.
017 */
018 package org.cumulus4j.store.crypto.keymanager;
019
020 import java.util.Arrays;
021 import java.util.Date;
022
023 /**
024 * {@link CryptoCache}-entry wrapping a secret key used for symmetric en-/decryption of actual data.
025 * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de
026 */
027 public class CryptoCacheKeyEntry
028 {
029 /**
030 * Create a new instance.
031 * @param keyID identifier of the key to be cached; must be >= 0.
032 * @param keyData actual key data (raw). Warning: This byte array will be overwritten with 0 by the {@link #finalize()} method!
033 */
034 protected CryptoCacheKeyEntry(long keyID, byte[] keyData)
035 {
036 if (keyID < 0)
037 throw new IllegalArgumentException("keyID < 0");
038
039 if (keyData == null)
040 throw new IllegalArgumentException("keyData == null");
041
042 this.keyID = keyID;
043 this.keyData = keyData.clone(); // necessary, because we overwrite the keyData in the finalize() method.
044 }
045
046 private long keyID = -1;
047
048 private byte[] keyData;
049
050 private Date lastUsageTimestamp = new Date();
051
052 /**
053 * Get the identifier of the key being cached.
054 * @return the identifier of the key being cached.
055 */
056 public long getKeyID() {
057 return keyID;
058 }
059
060 /**
061 * Get the actual raw key data.
062 * @return the actual raw key data.
063 */
064 public byte[] getKeyData() {
065 return keyData;
066 }
067
068 /**
069 * Get the timestamp when the key was used the last time.
070 * @return the timestamp when the key was used the last time.
071 */
072 public Date getLastUsageTimestamp() {
073 return lastUsageTimestamp;
074 }
075
076 @Override
077 protected void finalize() throws Throwable
078 {
079 Arrays.fill(keyData, (byte)0);
080 super.finalize();
081 }
082 }