Skip to content

Commit 87783ba

Browse files
committed
update libProofMode to remove static DEFAULT passphrase
- the responsibility should be on the app for managing the passphrase and/or eventually the key - relates to #24 and #40
1 parent dc65fe1 commit 87783ba

File tree

8 files changed

+54
-35
lines changed

8 files changed

+54
-35
lines changed

android-libproofmode/src/androidTest/java/ProofmodeGenerationTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.junit.runners.MethodSorters;
1717
import org.witness.proofmode.ProofMode;
1818
import org.witness.proofmode.crypto.HashUtils;
19+
import org.witness.proofmode.crypto.pgp.PgpUtils;
1920

2021
import java.io.BufferedInputStream;
2122
import java.io.BufferedOutputStream;
@@ -114,7 +115,7 @@ public void proofModeGenerator_VerifySignature_ReturnsTrue ()
114115
assertNotNull(files);
115116

116117
File fileZip = new File (fileDirProof.getParent(),fileDirProof.getName() + ".zip");
117-
zipProof(files, fileZip,ProofMode.getPublicKeyString(context));
118+
zipProof(files, fileZip,ProofMode.getPublicKeyString(context, PgpUtils.DEFAULT_PASSWORD));
118119
assertTrue(fileZip.exists());
119120

120121
//verify specific file and hash

android-libproofmode/src/main/java/org/witness/proofmode/ProofMode.java

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -194,17 +194,15 @@ public static void addNotarizationProvider (Context context, NotarizationProvide
194194
MediaWatcher.getInstance(context).addNotarizationProvider(provider);
195195
}
196196

197-
public static PGPPublicKey getPublicKey (Context context) throws PGPException, IOException {
198-
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
199-
PgpUtils pu = PgpUtils.getInstance(context,prefs.getString("password",PgpUtils.DEFAULT_PASSWORD));
197+
public static PGPPublicKey getPublicKey (Context context, String passphrase) throws PGPException, IOException {
198+
PgpUtils pu = PgpUtils.getInstance(context,passphrase);
200199
PGPPublicKey pubKey = null;
201200
return pubKey = pu.getPublicKey();
202201

203202
}
204203

205-
public static String getPublicKeyString (Context context) throws IOException, PGPException {
206-
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
207-
PgpUtils pu = PgpUtils.getInstance(context,prefs.getString("password",PgpUtils.DEFAULT_PASSWORD));
204+
public static String getPublicKeyString (Context context, String passphrase) throws IOException, PGPException {
205+
PgpUtils pu = PgpUtils.getInstance(context,passphrase);
208206
String pubKey = pu.getPublicKeyString();
209207

210208
return pubKey;
@@ -398,14 +396,13 @@ private static InputStream copyStream (InputStream is) throws IOException {
398396

399397

400398
public static boolean verifySignature (Context context, InputStream fileStream, InputStream sigStream, PGPPublicKey publicKey) throws Exception {
401-
402399
//PgpUtils.getInstance(context).
403400
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
404-
PgpUtils pu = PgpUtils.getInstance(context,prefs.getString("password",PgpUtils.DEFAULT_PASSWORD));
401+
PgpUtils pu = PgpUtils.getInstance(context, null);
405402
return pu.verifyDetachedSignature(fileStream, sigStream, publicKey);
406403
}
407404

408-
public static void generateProofZip(Context context, String proofHash) throws IOException, PGPException {
405+
public static void generateProofZip(Context context, String proofHash, String passphrase) throws IOException, PGPException {
409406

410407
File fileDirProof = ProofMode.getProofDir(context, proofHash);
411408
File[] files = fileDirProof.listFiles();
@@ -442,22 +439,22 @@ public static void generateProofZip(Context context, String proofHash) throws IO
442439
//add public key
443440
ZipEntry entry = new ZipEntry(PUBKEY_FILE);
444441
out.putNextEntry(entry);
445-
out.write(getPublicKeyString(context).getBytes());
442+
out.write(getPublicKeyString(context, passphrase).getBytes());
446443

447444
Timber.d("Zip complete");
448445

449446
out.close();
450447

451448
}
452449

453-
public static void checkAndGeneratePublicKeyAsync (Context context)
450+
public static void checkAndGeneratePublicKeyAsync (Context context, String passphrase)
454451
{
455452
Executors.newSingleThreadExecutor().execute(() -> {
456453
//Background work here
457454
String pubKey = null;
458455

459456
try {
460-
pubKey = PgpUtils.getInstance(context).getPublicKeyFingerprint();
457+
pubKey = PgpUtils.getInstance(context, passphrase).getPublicKeyFingerprint();
461458
} catch (PGPException e) {
462459
Timber.e(e,"error getting public key");
463460
} catch (IOException e) {

android-libproofmode/src/main/java/org/witness/proofmode/ProofModeConstants.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,8 @@
22

33
public interface ProofModeConstants {
44

5+
public static final String PREFS_KEY_PASSPHRASE = "pgpkp";
6+
public static final String PREFS_KEY_PASSPHRASE_DEFAULT = "password";
7+
58

69
}

android-libproofmode/src/main/java/org/witness/proofmode/crypto/pgp/PgpUtils.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public class PgpUtils {
9090
private final static String FILE_SECRET_KEY_RING = "pkr.asc";
9191
private final static String FILE_PUBLIC_KEY_RING = "pub.asc";
9292

93-
public final static String DEFAULT_PASSWORD = "password"; //static string for local keystore
93+
//public final static String DEFAULT_PASSWORD = "password"; //static string for local keystore
9494
private final static String URL_POST_KEY_ENDPOINT = "https://keys.openpgp.org/vks/v1/upload";
9595

9696
public final static String URL_LOOKUP_ENDPOINT = "https://keys.openpgp.org/search?q=0x";
@@ -100,9 +100,11 @@ private PgpUtils ()
100100

101101
}
102102

103+
/**
103104
public static synchronized PgpUtils getInstance (Context context) throws PGPException, IOException {
104105
return getInstance(context, DEFAULT_PASSWORD);
105106
}
107+
**/
106108

107109
public static synchronized PgpUtils getInstance (Context context, String password) throws PGPException, IOException {
108110
if (mInstance == null)
@@ -312,10 +314,13 @@ public synchronized void initCrypto (Context context, String password) throws IO
312314
sin.close();
313315
}
314316
else {
317+
318+
if (password.isEmpty())
319+
throw new IOException("Empty PGP Key password not allowed for key generation");
320+
315321
final PGPKeyRingGenerator krgen = generateKeyRingGenerator(keyId, password.toCharArray());
316322
skr = krgen.generateSecretKeyRing();
317323

318-
319324
ArmoredOutputStream sout = new ArmoredOutputStream((new FileOutputStream(fileSecKeyRing)));
320325
skr.encode(sout);
321326
sout.close();

android-libproofmode/src/main/java/org/witness/proofmode/service/MediaWatcher.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import static org.witness.proofmode.ProofMode.PREFS_DOPROOF;
55
import static org.witness.proofmode.ProofMode.PROOF_FILE_JSON_TAG;
66
import static org.witness.proofmode.ProofMode.PROOF_FILE_TAG;
7+
import static org.witness.proofmode.ProofModeConstants.PREFS_KEY_PASSPHRASE;
8+
import static org.witness.proofmode.ProofModeConstants.PREFS_KEY_PASSPHRASE_DEFAULT;
79

810
import android.Manifest;
911
import android.content.BroadcastReceiver;
@@ -77,17 +79,21 @@ public class MediaWatcher extends BroadcastReceiver implements ProofModeV1Consta
7779

7880
private Context mContext = null;
7981

82+
private String mPassphrase = null;
83+
8084
private ArrayList<NotarizationProvider> mProviders = new ArrayList<>();
8185

8286
private MediaWatcher (Context context) {
8387
if (mPrefs == null)
8488
mPrefs = PreferenceManager.getDefaultSharedPreferences(context);
8589

8690
mContext = context;
91+
mPassphrase = mPrefs.getString(PREFS_KEY_PASSPHRASE,PREFS_KEY_PASSPHRASE_DEFAULT);
8792

8893
startFileSystemMonitor();
8994
}
9095

96+
9197
public static synchronized MediaWatcher getInstance (Context context)
9298
{
9399
if (mInstance == null)
@@ -520,20 +526,22 @@ private void writeProof (Context context, Uri uriMedia, InputStream is, String m
520526
JSONObject jProof = new JSONObject(hmProof);
521527
writeTextToFile(context, fileMediaProofJson, jProof.toString());
522528

529+
PgpUtils pu = PgpUtils.getInstance(context, null);
530+
523531
if (fileMediaProof.exists()) {
524532
//sign the proof file again
525-
PgpUtils.getInstance(context).createDetachedSignature(fileMediaProof, new File(fileFolder, mediaHash + PROOF_FILE_TAG + OPENPGP_FILE_TAG), PgpUtils.DEFAULT_PASSWORD, usePgpArmor);
533+
pu.createDetachedSignature(fileMediaProof, new File(fileFolder, mediaHash + PROOF_FILE_TAG + OPENPGP_FILE_TAG), mPassphrase, usePgpArmor);
526534
}
527535

528536
if (fileMediaProofJson.exists()) {
529537
//sign the proof file again
530-
PgpUtils.getInstance(context).createDetachedSignature(fileMediaProofJson, new File(fileFolder, mediaHash + PROOF_FILE_JSON_TAG + OPENPGP_FILE_TAG), PgpUtils.DEFAULT_PASSWORD, usePgpArmor);
538+
pu.createDetachedSignature(fileMediaProofJson, new File(fileFolder, mediaHash + PROOF_FILE_JSON_TAG + OPENPGP_FILE_TAG), mPassphrase, usePgpArmor);
531539
}
532540

533541
//sign the media file
534542
File fileMediaSig = new File(fileFolder, mediaHash + OPENPGP_FILE_TAG);
535543
if ((!fileMediaSig.exists()) || fileMediaSig.length() == 0)
536-
PgpUtils.getInstance(context).createDetachedSignature(is, new FileOutputStream(fileMediaSig), PgpUtils.DEFAULT_PASSWORD, usePgpArmor);
544+
pu.createDetachedSignature(is, new FileOutputStream(fileMediaSig), mPassphrase, usePgpArmor);
537545

538546
Timber.d("Proof written/updated for uri %s and hash %s", uriMedia, mediaHash);
539547

app/src/main/java/org/witness/proofmode/MainActivity.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import androidx.drawerlayout.widget.DrawerLayout
2020
import androidx.preference.PreferenceManager
2121
import com.google.android.material.navigation.NavigationView
2222
import gun0912.tedimagepicker.builder.TedImagePicker
23+
import org.witness.proofmode.ProofModeConstants.PREFS_KEY_PASSPHRASE
24+
import org.witness.proofmode.ProofModeConstants.PREFS_KEY_PASSPHRASE_DEFAULT
2325
import org.witness.proofmode.camera.CameraActivity
2426
import org.witness.proofmode.crypto.pgp.PgpUtils
2527
import org.witness.proofmode.databinding.ActivityMainBinding
@@ -285,7 +287,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
285287
try {
286288
if (mPgpUtils == null) mPgpUtils = PgpUtils.getInstance(
287289
this,
288-
mPrefs.getString("password", PgpUtils.DEFAULT_PASSWORD)
290+
mPrefs.getString(PREFS_KEY_PASSPHRASE, PREFS_KEY_PASSPHRASE_DEFAULT)
289291
)
290292
mPgpUtils?.publishPublicKey()
291293
Toast.makeText(
@@ -308,7 +310,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
308310
try {
309311
if (mPgpUtils == null) mPgpUtils = PgpUtils.getInstance(
310312
this,
311-
mPrefs.getString("password", PgpUtils.DEFAULT_PASSWORD)
313+
mPrefs.getString(PREFS_KEY_PASSPHRASE, PREFS_KEY_PASSPHRASE_DEFAULT)
312314
)
313315
mPgpUtils?.publishPublicKey()
314316
val pubKey = mPgpUtils?.publicKeyString

app/src/main/java/org/witness/proofmode/ProofModeApp.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import android.os.Build
1515
import android.os.Handler
1616
import android.preference.PreferenceManager
1717
import android.util.Log
18+
import org.witness.proofmode.ProofModeConstants.PREFS_KEY_PASSPHRASE
19+
import org.witness.proofmode.ProofModeConstants.PREFS_KEY_PASSPHRASE_DEFAULT
1820
import org.witness.proofmode.notaries.SafetyNetCheck
1921
import org.witness.proofmode.notaries.GoogleSafetyNetNotarizationProvider
2022
import org.witness.proofmode.notarization.NotarizationProvider
@@ -38,8 +40,10 @@ class ProofModeApp : MultiDexApplication() {
3840
//Background work here
3941
var pubKey: String? = null
4042
try {
41-
pubKey = PgpUtils.getInstance(applicationContext).publicKeyFingerprint
42-
// showToastMessage(getString(R.string.pub_key_id) + " " + pubKey)
43+
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
44+
pubKey = PgpUtils.getInstance(applicationContext,prefs.getString(PREFS_KEY_PASSPHRASE,
45+
PREFS_KEY_PASSPHRASE_DEFAULT)).publicKeyFingerprint
46+
4347
} catch (e: PGPException) {
4448
Timber.e(e, "error getting public key")
4549
showToastMessage(getString(R.string.pub_key_gen_error))

app/src/main/java/org/witness/proofmode/ShareProofActivity.kt

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ import androidx.core.content.FileProvider
3131
import androidx.documentfile.provider.DocumentFile
3232
import org.bouncycastle.openpgp.PGPException
3333
import org.witness.proofmode.PermissionActivity.Companion.hasPermissions
34+
import org.witness.proofmode.ProofModeConstants.PREFS_KEY_PASSPHRASE
35+
import org.witness.proofmode.ProofModeConstants.PREFS_KEY_PASSPHRASE_DEFAULT
3436
import org.witness.proofmode.crypto.HashUtils
3537
import org.witness.proofmode.crypto.pgp.PgpUtils
3638
import org.witness.proofmode.databinding.ActivityShareBinding
@@ -48,9 +50,13 @@ class ShareProofActivity : AppCompatActivity() {
4850
private var sendMedia = true
4951

5052
private val hashCache = HashMap<String, String?>()
53+
54+
private lateinit var pgpUtils : PgpUtils
5155
override fun onCreate(savedInstanceState: Bundle?) {
5256
super.onCreate(savedInstanceState)
5357
binding = ActivityShareBinding.inflate(layoutInflater)
58+
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
59+
pgpUtils = PgpUtils.getInstance(this, prefs.getString(PREFS_KEY_PASSPHRASE,PREFS_KEY_PASSPHRASE_DEFAULT))
5460
setContentView(binding.root)
5561
}
5662

@@ -274,9 +280,7 @@ class ShareProofActivity : AppCompatActivity() {
274280
private fun generateProofZipName() {
275281
val sdf = SimpleDateFormat(ZIP_FILE_DATETIME_FORMAT)
276282
val dateString = sdf.format(Date())
277-
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
278-
val pu = PgpUtils.getInstance(this, prefs.getString("password", PgpUtils.DEFAULT_PASSWORD))
279-
val userId = pu.publicKeyFingerprint
283+
val userId = pgpUtils.publicKeyFingerprint
280284
proofZipName = "proofmode-$userId-$dateString.zip"
281285
}
282286

@@ -360,7 +364,7 @@ class ShareProofActivity : AppCompatActivity() {
360364
if (encryptZip) {
361365
val fileZipEnc = File(fileCacheFolder, "$proofZipName.gpg")
362366
try {
363-
PgpUtils.getInstance(this).encrypt(
367+
pgpUtils.encrypt(
364368
FileInputStream(fileZip),
365369
fileZip.length(),
366370
FileOutputStream(fileZipEnc)
@@ -515,12 +519,7 @@ class ShareProofActivity : AppCompatActivity() {
515519
fileCacheFolder.mkdir()
516520
val sdf = SimpleDateFormat(ZIP_FILE_DATETIME_FORMAT)
517521
val dateString = sdf.format(Date())
518-
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
519-
val pu = PgpUtils.getInstance(
520-
this,
521-
prefs.getString("password", PgpUtils.DEFAULT_PASSWORD)
522-
)
523-
val userId = pu.publicKeyFingerprint
522+
val userId = pgpUtils.publicKeyFingerprint
524523
val fileZip = File(fileCacheFolder, "proofmode-$userId-$dateString.zip")
525524
Timber.d("Preparing proof bundle zip: " + fileZip.absolutePath)
526525
try {
@@ -536,7 +535,7 @@ class ShareProofActivity : AppCompatActivity() {
536535
val fileZipEnc =
537536
File(fileCacheFolder, "proofmode-$userId-$dateString.zip.gpg")
538537
try {
539-
PgpUtils.getInstance(this).encrypt(
538+
pgpUtils.encrypt(
540539
FileInputStream(fileZip),
541540
fileZip.length(),
542541
FileOutputStream(fileZipEnc)
@@ -934,7 +933,7 @@ class ShareProofActivity : AppCompatActivity() {
934933
isFirstProof: Boolean
935934
) {
936935
val sdf = SimpleDateFormat.getDateTimeInstance()
937-
val fingerprint = PgpUtils.getInstance(this).publicKeyFingerprint
936+
val fingerprint = pgpUtils.publicKeyFingerprint
938937
if (fileMedia != null) {
939938
sb.append(fileMedia.name).append(' ')
940939
sb.append(getString(R.string.last_modified)).append(' ')
@@ -1224,7 +1223,7 @@ class ShareProofActivity : AppCompatActivity() {
12241223
}
12251224
Timber.d("Adding public key")
12261225
//add public key
1227-
val pubKey = ProofMode.getPublicKeyString(this)
1226+
val pubKey = ProofMode.getPublicKeyString(this, "")
12281227
var entry: ZipEntry? = ZipEntry("pubkey.asc")
12291228
out.putNextEntry(entry)
12301229
out.write(pubKey.toByteArray())

0 commit comments

Comments
 (0)