/**
* Copyright (C) 2011 Adriano Monteiro Marques
*
* Author: Zubair Nabi <zn.zubairnabi@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*/
package org.umit.icm.mobile.process;
/**
* Manages the SecretKey, PrivateKey, PublicKey and CipheredKey.
*/
import java.io.IOException;
import java.security.KeyPair;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.util.Random;
import org.apache.commons.codec.binary.Base64;
import org.umit.icm.mobile.proto.MessageProtos.RSAKey;
import org.umit.icm.mobile.utils.CryptoKeyWriter;
import org.umit.icm.mobile.utils.RSACrypto;
public class KeyManager {
private PrivateKey myPrivateKey;
private PublicKey myPublicKey;
private String myCipheredKeyMod;
private String myCipheredKeyExp;
private PublicKey aggrPublicKey;
private byte[] aesKey;
public KeyManager(PrivateKey myPrivateKey,
PublicKey myPublicKey, String myCipheredKeyMod,
String myCipheredKeyExp) {
super();
this.myPrivateKey = myPrivateKey;
this.myPublicKey = myPublicKey;
this.myCipheredKeyMod = myCipheredKeyMod;
this.myCipheredKeyExp = myCipheredKeyExp;
}
public KeyManager() {
super();
//generate all keys
try {
if(Constants.DEBUG_MODE)
System.out.println("Setting up KeyManager");
//generate RSA key pair
KeyPair keypair = RSACrypto.generateKey();
this.setMyPublicKey(keypair.getPublic());
this.setMyPrivateKey(keypair.getPrivate());
//now separate public key into its mod and exp
RSAKey rsaKey = RSACrypto.getPublicKeyIntegers(keypair.getPublic());
this.setMyCipheredKeyMod(rsaKey.getMod());
this.setMyCipheredKeyExp(rsaKey.getExp());
//generate aggregator's public key
this.setAggregatorPublicKey(RSACrypto.generatePublicKey(Constants.AGGR_PUB_KEY_MOD,
Constants.AGGR_PUB_KEY_EXP));
if(Constants.DEBUG_MODE)
System.out.println("AGGRPUBLICKEY inside KeyManager : "+ aggrPublicKey);
//generate AES symmetric key
byte[] bits = new byte[Constants.AES_BLOCK_SIZE];
new Random().nextBytes(bits);
this.setAESKey(Base64.encodeBase64(bits));
} catch (Exception e) {
e.printStackTrace();
}
}
public synchronized PublicKey getAggregatorPublicKey() {
return this.aggrPublicKey;
}
public synchronized void setAggregatorPublicKey(PublicKey publicKey) {
this.aggrPublicKey = publicKey;
}
public synchronized byte[] getAESKey() {
return this.aesKey;
}
public synchronized void setAESKey(byte[] aesKey) {
this.aesKey = aesKey;
}
public synchronized PrivateKey getMyPrivateKey() {
return myPrivateKey;
}
/**
* Writes the PrivateKey to disk.
*
*
@param myPrivateKey PrivateKey of type {@link PrivateKey}
*
@see CryptoKeyWriter
*/
public synchronized void setMyPrivateKey(PrivateKey myPrivateKey) {
this.myPrivateKey = myPrivateKey;
try {
CryptoKeyWriter.writeMyPrivateKey(this.myPrivateKey);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeySpecException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public synchronized PublicKey getMyPublicKey() {
return myPublicKey;
}
/**
* Writes the PublicKey to disk.
*
*
@param myPublicKey PublicKey of type {@link PublicKey}
*
@see CryptoKeyWriter
*/
public synchronized void setMyPublicKey(PublicKey myPublicKey) {
this.myPublicKey = myPublicKey;
try {
CryptoKeyWriter.writeMyPublicKey(this.myPublicKey);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeySpecException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public String getMyCipheredKeyMod() {
return myCipheredKeyMod;
}
public void setMyCipheredKeyMod(String myCipheredKeyMod) {
this.myCipheredKeyMod = myCipheredKeyMod;
try {
CryptoKeyWriter.writeMyCipheredKeyMod(myCipheredKeyMod);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RuntimeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public String getMyCipheredKeyExp() {
return myCipheredKeyExp;
}
public void setMyCipheredKeyExp(String myCipheredKeyExp) {
this.myCipheredKeyExp = myCipheredKeyExp;
try {
CryptoKeyWriter.writeMyCipheredKeyExp(myCipheredKeyExp);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RuntimeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}