Creates a keypair and a secret key and stores them in a Keystore, then tries to retrieve the symmetric key to put it in a QR code but the function getSecretKey returns null
error code:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.securechildlocator/com.example.securechildlocator.CreateQRCActivity}: java.lang.NullPointerException: Attempt to get length of null array
...
at com.example.securechildlocator.CreateQRCActivity.initQRCode(CreateQRCActivity.java:49)
at com.example.securechildlocator.CreateQRCActivity.onCreate(CreateQRCActivity.java:42)
...
public class CreateQRCActivity extends AppCompatActivity {
@BindView(R.id.image_view)
ImageView imageView;
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_qrcode);
ButterKnife.bind(this);
creatKeys();
initQRCode();
}
@RequiresApi(api = Build.VERSION_CODES.O)
private void initQRCode() {
String qrString = "";
Random r = new Random();
long gruopID = r.nextLong();
String key = Base64.encodeToString(getSecretKey(), Base64.DEFAULT);
qrString = key + ":::" + gruopID;
if(qrString != "") {
StringBuilder textToSend = new StringBuilder();
textToSend.append(qrString);
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
try {
BitMatrix bitMatrix = multiFormatWriter.encode(textToSend.toString(), BarcodeFormat.QR_CODE, 600, 600);
BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
Bitmap bitmap = barcodeEncoder.createBitmap(bitMatrix);
imageView.setImageBitmap(bitmap);
imageView.setVisibility(View.VISIBLE);
} catch (WriterException e) {
e.printStackTrace();
}
}
}
private void creatKeys() {
try {
final KeyGenerator skg = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "Android2KeyStore");
final KeyGenParameterSpec secretKeyGenParameterSpec = new KeyGenParameterSpec.Builder("secretKey", KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.build();
skg.init(secretKeyGenParameterSpec);
final SecretKey secretKey = skg.generateKey();
final KeyPairGenerator kpg = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "Android2KeyStore");
kpg.initialize(new KeyGenParameterSpec.Builder(
"keyPair",
KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
.setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
.setKeySize(2048)
.build());
final KeyPair keyPair = kpg.generateKeyPair();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (InvalidAlgorithmParameterException e) {
e.printStackTrace();
}
}
public byte[] getSecretKey(){
byte [] secretKey = null;
try {
KeyStore keyStore = KeyStore.getInstance("Android2KeyStore");
keyStore.load(null);
final KeyStore.SecretKeyEntry secretKeyEntry = (KeyStore.SecretKeyEntry) keyStore.getEntry("secretKey", null);
secretKey = secretKeyEntry.getSecretKey().getEncoded();
}catch (Exception e){
e.printStackTrace();
}
return secretKey;
}
}