File indexing completed on 2025-02-02 04:47:49
0001 /* 0002 * SPDX-FileCopyrightText: 2015 Albert Vaca Cintora <albertvaka@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0005 */ 0006 0007 package org.kde.kdeconnect.Helpers.SecurityHelpers; 0008 0009 import android.content.Context; 0010 import android.content.SharedPreferences; 0011 import android.os.Build; 0012 import android.preference.PreferenceManager; 0013 import android.security.keystore.KeyProperties; 0014 import android.util.Base64; 0015 import android.util.Log; 0016 0017 import java.security.GeneralSecurityException; 0018 import java.security.KeyFactory; 0019 import java.security.KeyPair; 0020 import java.security.KeyPairGenerator; 0021 import java.security.PrivateKey; 0022 import java.security.PublicKey; 0023 import java.security.spec.ECGenParameterSpec; 0024 import java.security.spec.PKCS8EncodedKeySpec; 0025 import java.security.spec.X509EncodedKeySpec; 0026 0027 public class RsaHelper { 0028 0029 public static void initialiseRsaKeys(Context context) { 0030 SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context); 0031 0032 if (!settings.contains("publicKey") || !settings.contains("privateKey")) { 0033 0034 KeyPair keyPair; 0035 String keyAlgorithm; 0036 try { 0037 KeyPairGenerator keyGen; 0038 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 0039 keyAlgorithm = KeyProperties.KEY_ALGORITHM_EC; 0040 keyGen = KeyPairGenerator.getInstance(keyAlgorithm); 0041 ECGenParameterSpec spec = new ECGenParameterSpec("secp256r1"); 0042 keyGen.initialize(spec); 0043 } else { 0044 keyAlgorithm = "RSA"; 0045 keyGen = KeyPairGenerator.getInstance(keyAlgorithm); 0046 keyGen.initialize(2048); 0047 } 0048 keyPair = keyGen.generateKeyPair(); 0049 } catch (Exception e) { 0050 Log.e("KDE/initializeRsaKeys", "Exception", e); 0051 return; 0052 } 0053 0054 byte[] publicKey = keyPair.getPublic().getEncoded(); 0055 byte[] privateKey = keyPair.getPrivate().getEncoded(); 0056 0057 SharedPreferences.Editor edit = settings.edit(); 0058 edit.putString("publicKey", Base64.encodeToString(publicKey, 0).trim() + "\n"); 0059 edit.putString("privateKey", Base64.encodeToString(privateKey, 0)); 0060 edit.putString("keyAlgorithm", keyAlgorithm); 0061 edit.apply(); 0062 0063 } 0064 0065 } 0066 0067 public static PublicKey getPublicKey(Context context) throws GeneralSecurityException { 0068 SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context); 0069 byte[] publicKeyBytes = Base64.decode(settings.getString("publicKey", ""), 0); 0070 // For backwards compat: if no keyAlgorithm setting is set, it means it was generated using RSA 0071 String keyAlgorithm = settings.getString("keyAlgorithm", "RSA"); 0072 return KeyFactory.getInstance(keyAlgorithm).generatePublic(new X509EncodedKeySpec(publicKeyBytes)); 0073 } 0074 0075 public static PrivateKey getPrivateKey(Context context) throws GeneralSecurityException { 0076 SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context); 0077 byte[] privateKeyBytes = Base64.decode(settings.getString("privateKey", ""), 0); 0078 // For backwards compat: if no keyAlgorithm setting is set, it means it was generated using RSA 0079 String keyAlgorithm = settings.getString("keyAlgorithm", "RSA"); 0080 return KeyFactory.getInstance(keyAlgorithm).generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes)); 0081 } 0082 0083 0084 0085 }