Avoid dynamic instances creation
This commit is contained in:
parent
cfdcb943c3
commit
6952d4e03d
@ -21,8 +21,21 @@
|
|||||||
package fr.anssi.smartpgp;
|
package fr.anssi.smartpgp;
|
||||||
|
|
||||||
import javacard.framework.*;
|
import javacard.framework.*;
|
||||||
|
import javacard.security.*;
|
||||||
|
import javacardx.crypto.*;
|
||||||
|
|
||||||
public final class Common {
|
public final class Common {
|
||||||
|
protected final Cipher cipher_aes_cbc_nopad;
|
||||||
|
protected final Cipher cipher_rsa_pkcs1;
|
||||||
|
|
||||||
|
protected final RandomData random;
|
||||||
|
|
||||||
|
protected Common() {
|
||||||
|
cipher_aes_cbc_nopad = Cipher.getInstance(Cipher.ALG_AES_BLOCK_128_CBC_NOPAD, false);
|
||||||
|
cipher_rsa_pkcs1 = Cipher.getInstance(Cipher.ALG_RSA_PKCS1, false);
|
||||||
|
|
||||||
|
random = RandomData.getInstance(RandomData.ALG_SECURE_RANDOM);
|
||||||
|
}
|
||||||
|
|
||||||
protected static final void beginTransaction(final boolean isRegistering) {
|
protected static final void beginTransaction(final boolean isRegistering) {
|
||||||
if(!isRegistering) {
|
if(!isRegistering) {
|
||||||
|
@ -40,12 +40,7 @@ public final class PGPKey {
|
|||||||
|
|
||||||
private KeyPair keys;
|
private KeyPair keys;
|
||||||
|
|
||||||
private final Cipher cipher_rsa_pkcs1;
|
|
||||||
|
|
||||||
protected PGPKey() {
|
protected PGPKey() {
|
||||||
|
|
||||||
cipher_rsa_pkcs1 = Cipher.getInstance(Cipher.ALG_RSA_PKCS1, false);
|
|
||||||
|
|
||||||
fingerprint = new Fingerprint();
|
fingerprint = new Fingerprint();
|
||||||
generation_date = new byte[Constants.GENERATION_DATE_SIZE];
|
generation_date = new byte[Constants.GENERATION_DATE_SIZE];
|
||||||
|
|
||||||
@ -447,7 +442,8 @@ public final class PGPKey {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected final short sign(final byte[] buf, final short lc,
|
protected final short sign(final Common common,
|
||||||
|
final byte[] buf, final short lc,
|
||||||
final boolean forAuth) {
|
final boolean forAuth) {
|
||||||
|
|
||||||
if(!isInitialized()) {
|
if(!isInitialized()) {
|
||||||
@ -486,10 +482,10 @@ public final class PGPKey {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
cipher_rsa_pkcs1.init(priv, Cipher.MODE_ENCRYPT);
|
common.cipher_rsa_pkcs1.init(priv, Cipher.MODE_ENCRYPT);
|
||||||
|
|
||||||
off = cipher_rsa_pkcs1.doFinal(buf, (short)0, lc,
|
off = common.cipher_rsa_pkcs1.doFinal(buf, (short)0, lc,
|
||||||
buf, lc);
|
buf, lc);
|
||||||
|
|
||||||
return Util.arrayCopyNonAtomic(buf, lc,
|
return Util.arrayCopyNonAtomic(buf, lc,
|
||||||
buf, (short)0,
|
buf, (short)0,
|
||||||
@ -502,7 +498,8 @@ public final class PGPKey {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected final short decipher(final byte[] buf, final short lc) {
|
protected final short decipher(final Common common,
|
||||||
|
final byte[] buf, final short lc) {
|
||||||
|
|
||||||
if(!isInitialized()) {
|
if(!isInitialized()) {
|
||||||
ISOException.throwIt(Constants.SW_REFERENCE_DATA_NOT_FOUND);
|
ISOException.throwIt(Constants.SW_REFERENCE_DATA_NOT_FOUND);
|
||||||
@ -526,10 +523,10 @@ public final class PGPKey {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
cipher_rsa_pkcs1.init(priv, Cipher.MODE_DECRYPT);
|
common.cipher_rsa_pkcs1.init(priv, Cipher.MODE_DECRYPT);
|
||||||
|
|
||||||
final short len = cipher_rsa_pkcs1.doFinal(buf, (short)1, (short)(lc - 1),
|
final short len = common.cipher_rsa_pkcs1.doFinal(buf, (short)1, (short)(lc - 1),
|
||||||
buf, lc);
|
buf, lc);
|
||||||
|
|
||||||
off = Util.arrayCopyNonAtomic(buf, lc,
|
off = Util.arrayCopyNonAtomic(buf, lc,
|
||||||
buf, (short)0,
|
buf, (short)0,
|
||||||
|
@ -26,16 +26,13 @@ import javacardx.crypto.*;
|
|||||||
|
|
||||||
public final class SmartPGPApplet extends Applet {
|
public final class SmartPGPApplet extends Applet {
|
||||||
|
|
||||||
|
private final Common common;
|
||||||
private final Persistent data;
|
private final Persistent data;
|
||||||
|
|
||||||
private final Transients transients;
|
private final Transients transients;
|
||||||
|
|
||||||
private final Cipher cipher_aes_cbc_nopad;
|
|
||||||
private final RandomData random_data;
|
|
||||||
|
|
||||||
public SmartPGPApplet() {
|
public SmartPGPApplet() {
|
||||||
cipher_aes_cbc_nopad = Cipher.getInstance(Cipher.ALG_AES_BLOCK_128_CBC_NOPAD, false);
|
common = new Common();
|
||||||
random_data = RandomData.getInstance(RandomData.ALG_SECURE_RANDOM);
|
|
||||||
data = new Persistent();
|
data = new Persistent();
|
||||||
transients = new Transients();
|
transients = new Transients();
|
||||||
}
|
}
|
||||||
@ -1287,7 +1284,7 @@ public final class SmartPGPApplet extends Applet {
|
|||||||
}
|
}
|
||||||
JCSystem.commitTransaction();
|
JCSystem.commitTransaction();
|
||||||
|
|
||||||
return data.pgp_keys[Persistent.PGP_KEYS_OFFSET_SIG].sign(transients.buffer, lc, false);
|
return data.pgp_keys[Persistent.PGP_KEYS_OFFSET_SIG].sign(common, transients.buffer, lc, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PSO : DECIPHER */
|
/* PSO : DECIPHER */
|
||||||
@ -1312,10 +1309,10 @@ public final class SmartPGPApplet extends Applet {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
cipher_aes_cbc_nopad.init(data.aes_key, Cipher.MODE_DECRYPT);
|
common.cipher_aes_cbc_nopad.init(data.aes_key, Cipher.MODE_DECRYPT);
|
||||||
|
|
||||||
final short res = cipher_aes_cbc_nopad.doFinal(transients.buffer, (short)1, (short)(lc - 1),
|
final short res = common.cipher_aes_cbc_nopad.doFinal(transients.buffer, (short)1, (short)(lc - 1),
|
||||||
transients.buffer, lc);
|
transients.buffer, lc);
|
||||||
|
|
||||||
Util.arrayCopyNonAtomic(transients.buffer, lc,
|
Util.arrayCopyNonAtomic(transients.buffer, lc,
|
||||||
transients.buffer, (short)0, res);
|
transients.buffer, (short)0, res);
|
||||||
@ -1325,7 +1322,7 @@ public final class SmartPGPApplet extends Applet {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
return data.pgp_keys[Persistent.PGP_KEYS_OFFSET_DEC].decipher(transients.buffer, lc);
|
return data.pgp_keys[Persistent.PGP_KEYS_OFFSET_DEC].decipher(common, transients.buffer, lc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PSO : ENCIPHER */
|
/* PSO : ENCIPHER */
|
||||||
@ -1343,10 +1340,10 @@ public final class SmartPGPApplet extends Applet {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
cipher_aes_cbc_nopad.init(data.aes_key, Cipher.MODE_ENCRYPT);
|
common.cipher_aes_cbc_nopad.init(data.aes_key, Cipher.MODE_ENCRYPT);
|
||||||
|
|
||||||
final short res = cipher_aes_cbc_nopad.doFinal(transients.buffer, (short)0, lc,
|
final short res = common.cipher_aes_cbc_nopad.doFinal(transients.buffer, (short)0, lc,
|
||||||
transients.buffer, (short)(lc + 1));
|
transients.buffer, (short)(lc + 1));
|
||||||
|
|
||||||
transients.buffer[lc] = (byte)0x02;
|
transients.buffer[lc] = (byte)0x02;
|
||||||
Util.arrayCopyNonAtomic(transients.buffer, lc,
|
Util.arrayCopyNonAtomic(transients.buffer, lc,
|
||||||
@ -1369,7 +1366,7 @@ public final class SmartPGPApplet extends Applet {
|
|||||||
case (byte)0x00:
|
case (byte)0x00:
|
||||||
sensitiveData();
|
sensitiveData();
|
||||||
assertUserMode82();
|
assertUserMode82();
|
||||||
return data.pgp_keys[Persistent.PGP_KEYS_OFFSET_AUT].sign(transients.buffer, lc, true);
|
return data.pgp_keys[Persistent.PGP_KEYS_OFFSET_AUT].sign(common, transients.buffer, lc, true);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -1397,7 +1394,7 @@ public final class SmartPGPApplet extends Applet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(le != 0) {
|
if(le != 0) {
|
||||||
random_data.generateData(transients.buffer, (short)0, le);
|
common.random.generateData(transients.buffer, (short)0, le);
|
||||||
}
|
}
|
||||||
|
|
||||||
return le;
|
return le;
|
||||||
|
Loading…
Reference in New Issue
Block a user