Skip to content

Instantly share code, notes, and snippets.

@alome007
Last active June 3, 2022 23:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alome007/765e2bb57969caf20cbf86ca5b9390ad to your computer and use it in GitHub Desktop.
Save alome007/765e2bb57969caf20cbf86ca5b9390ad to your computer and use it in GitHub Desktop.
package com.example.myapplication;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.security.KeyPairGeneratorSpec;
import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyProperties;
import android.util.Base64;
import android.util.Log;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;
import java.security.SignatureException;
import java.security.UnrecoverableEntryException;
import java.security.cert.CertificateException;
import java.security.interfaces.ECPublicKey;
import java.security.spec.ECGenParameterSpec;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Arrays;
import java.util.Calendar;
import java.util.logging.Logger;
import javax.security.auth.x500.X500Principal;
public class Test extends AppCompatActivity {
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
KeyPairGenerator kpg = null;
try {
kpg = KeyPairGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
kpg.initialize(new KeyGenParameterSpec.Builder(
"alias",
KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
.setDigests(KeyProperties.DIGEST_SHA256,
KeyProperties.DIGEST_SHA512)
.build());
KeyPair kp = kpg.generateKeyPair();
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
KeyStore.Entry entry = ks.getEntry("alias", null);
if (!(entry instanceof KeyStore.PrivateKeyEntry)) {
Log.w("ERROR", "Not an instance of a PrivateKeyEntry");
// return null;
}
Signature s = Signature.getInstance("SHA256withECDSA");
s.initSign(((KeyStore.PrivateKeyEntry) entry).getPrivateKey());
s.update("data".getBytes(StandardCharsets.UTF_8));
byte[] signature = s.sign();
} catch (NoSuchAlgorithmException | NoSuchProviderException | InvalidAlgorithmParameterException | UnrecoverableEntryException | InvalidKeyException | CertificateException | KeyStoreException | IOException | SignatureException e) {
e.printStackTrace();
}
}
}
package com.example.myapplication;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.security.KeyPairGeneratorSpec;
import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyProperties;
import android.util.Base64;
import android.util.Log;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.PublicKey;
import java.security.Signature;
import java.security.SignatureException;
import java.security.UnrecoverableEntryException;
import java.security.cert.CertificateException;
import java.security.spec.X509EncodedKeySpec;
import java.util.Enumeration;
public class Test extends AppCompatActivity {
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
KeyStore kss = null;
KeyPairGenerator kpg = null;
try {
// kpg = KeyPairGenerator.getInstance(
// KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
//
// kpg.initialize(new KeyGenParameterSpec.Builder(
// "alias",
// KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
// .setDigests(KeyProperties.DIGEST_SHA256,
// KeyProperties.DIGEST_SHA512)
// .build());
// KeyPair kp = kpg.generateKeyPair();
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
KeyStore.Entry entry = ks.getEntry("alias", null);
Signature s = Signature.getInstance("SHA256withECDSA");
s.initSign(((KeyStore.PrivateKeyEntry) entry).getPrivateKey());
s.update("datahh".getBytes(StandardCharsets.UTF_8));
byte[] signature = s.sign();
//check if alias is present, when true, public key has been generated, don't generate again
Log.d("yeahssss", String.valueOf(ks.containsAlias("alias")));
//Convert Public Key to String
String pubKey = publicKeyToString(((KeyStore.PrivateKeyEntry) entry).getCertificate().getPublicKey());
Log.d("yeah", pubKey);
PublicKey key = stringToPublicKey("MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0WwWRFeiTubqscASUDhNz9ObGc63e67EV/R49A7gzpugu5R6b2so3FXhWuUPmjHs6zaW5SVVNzU4pJT1EZzoHg==");
// Convert Signature to Base64 string
String signatureBase64 = Base64.encodeToString("datahh".getBytes(), Base64.DEFAULT);
Signature signature1 = Signature.getInstance("SHA256withECDSA");
signature1.initVerify(key);
//Convert base64 String to signature.
signature1.update(Base64.decode(signatureBase64, Base64.DEFAULT));
boolean verified = signature1.verify(signature);
Log.d("yeahp", String.valueOf(verified));
} catch (GeneralSecurityException e) {
Log.d("yeah", e.getMessage());
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public PublicKey stringToPublicKey(String publStr) {
PublicKey publicKey = null;
try {
byte[] data = Base64.decode(publStr, Base64.NO_WRAP);
X509EncodedKeySpec spec = new X509EncodedKeySpec(data);
KeyFactory fact = KeyFactory.getInstance("EC");
publicKey = fact.generatePublic(spec);
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
return publicKey;
}
public String publicKeyToString(PublicKey publ) {
String publicKeyString = null;
try {
KeyFactory fact = KeyFactory.getInstance("EC");
X509EncodedKeySpec spec = fact.getKeySpec(publ,
X509EncodedKeySpec.class);
publicKeyString = Base64.encodeToString(spec.getEncoded(), Base64.NO_WRAP);
} catch (GeneralSecurityException e) {
Log.d("yeahp", e.getMessage());
e.printStackTrace();
}
return publicKeyString;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment