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 }