forked from I2P_Developers/i2p.i2p
Data: Implement Destroyable for private keys (ticket #2462)
This commit is contained in:
@ -10,9 +10,11 @@ package net.i2p.data;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import javax.security.auth.Destroyable;
|
||||||
|
|
||||||
import net.i2p.crypto.EncType;
|
import net.i2p.crypto.EncType;
|
||||||
import net.i2p.crypto.KeyGenerator;
|
import net.i2p.crypto.KeyGenerator;
|
||||||
|
import net.i2p.util.SimpleByteCache;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines the PrivateKey as defined by the I2P data structure spec.
|
* Defines the PrivateKey as defined by the I2P data structure spec.
|
||||||
@ -24,7 +26,7 @@ import net.i2p.crypto.KeyGenerator;
|
|||||||
*
|
*
|
||||||
* @author jrandom
|
* @author jrandom
|
||||||
*/
|
*/
|
||||||
public class PrivateKey extends SimpleDataStructure {
|
public class PrivateKey extends SimpleDataStructure implements Destroyable {
|
||||||
private static final EncType DEF_TYPE = EncType.ELGAMAL_2048;
|
private static final EncType DEF_TYPE = EncType.ELGAMAL_2048;
|
||||||
public final static int KEYSIZE_BYTES = DEF_TYPE.getPrivkeyLen();
|
public final static int KEYSIZE_BYTES = DEF_TYPE.getPrivkeyLen();
|
||||||
|
|
||||||
@ -89,13 +91,36 @@ public class PrivateKey extends SimpleDataStructure {
|
|||||||
return KeyGenerator.getPublicKey(this);
|
return KeyGenerator.getPublicKey(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* javax.security.auth.Destroyable interface
|
||||||
|
*
|
||||||
|
* @since 0.9.40
|
||||||
|
*/
|
||||||
|
public void destroy() {
|
||||||
|
byte[] data = _data;
|
||||||
|
if (data != null) {
|
||||||
|
_data = null;
|
||||||
|
Arrays.fill(data, (byte) 0);
|
||||||
|
SimpleByteCache.release(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* javax.security.auth.Destroyable interface
|
||||||
|
*
|
||||||
|
* @since 0.9.40
|
||||||
|
*/
|
||||||
|
public boolean isDestroyed() {
|
||||||
|
return _data == null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 0.9.38
|
* @since 0.9.38
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
StringBuilder buf = new StringBuilder(64);
|
StringBuilder buf = new StringBuilder(64);
|
||||||
buf.append("[PrivateKey ").append(_type).append(": ");
|
buf.append("[PrivateKey ").append(_type).append(' ');
|
||||||
int length = length();
|
int length = length();
|
||||||
if (_data == null) {
|
if (_data == null) {
|
||||||
buf.append("null");
|
buf.append("null");
|
||||||
|
@ -10,10 +10,12 @@ package net.i2p.data;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import javax.security.auth.Destroyable;
|
||||||
|
|
||||||
import net.i2p.crypto.Blinding;
|
import net.i2p.crypto.Blinding;
|
||||||
import net.i2p.crypto.KeyGenerator;
|
import net.i2p.crypto.KeyGenerator;
|
||||||
import net.i2p.crypto.SigType;
|
import net.i2p.crypto.SigType;
|
||||||
|
import net.i2p.util.SimpleByteCache;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines the SigningPrivateKey as defined by the I2P data structure spec.
|
* Defines the SigningPrivateKey as defined by the I2P data structure spec.
|
||||||
@ -26,7 +28,7 @@ import net.i2p.crypto.SigType;
|
|||||||
*
|
*
|
||||||
* @author jrandom
|
* @author jrandom
|
||||||
*/
|
*/
|
||||||
public class SigningPrivateKey extends SimpleDataStructure {
|
public class SigningPrivateKey extends SimpleDataStructure implements Destroyable {
|
||||||
private static final SigType DEF_TYPE = SigType.DSA_SHA1;
|
private static final SigType DEF_TYPE = SigType.DSA_SHA1;
|
||||||
public final static int KEYSIZE_BYTES = DEF_TYPE.getPrivkeyLen();
|
public final static int KEYSIZE_BYTES = DEF_TYPE.getPrivkeyLen();
|
||||||
|
|
||||||
@ -115,13 +117,36 @@ public class SigningPrivateKey extends SimpleDataStructure {
|
|||||||
return b == 0;
|
return b == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* javax.security.auth.Destroyable interface
|
||||||
|
*
|
||||||
|
* @since 0.9.40
|
||||||
|
*/
|
||||||
|
public void destroy() {
|
||||||
|
byte[] data = _data;
|
||||||
|
if (data != null) {
|
||||||
|
_data = null;
|
||||||
|
Arrays.fill(data, (byte) 0);
|
||||||
|
SimpleByteCache.release(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* javax.security.auth.Destroyable interface
|
||||||
|
*
|
||||||
|
* @since 0.9.40
|
||||||
|
*/
|
||||||
|
public boolean isDestroyed() {
|
||||||
|
return _data == null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 0.9.8
|
* @since 0.9.8
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
StringBuilder buf = new StringBuilder(64);
|
StringBuilder buf = new StringBuilder(64);
|
||||||
buf.append("[SigningPrivateKey ").append(_type).append(": ");
|
buf.append("[SigningPrivateKey ").append(_type).append(' ');
|
||||||
int length = length();
|
int length = length();
|
||||||
if (_data == null) {
|
if (_data == null) {
|
||||||
buf.append("null");
|
buf.append("null");
|
||||||
|
Reference in New Issue
Block a user