Trying to generate and store keys in a keystore and passing to a QR code?

Viewed 129

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;
    }

}

0 Answers
Related