Repository navigation
Expand file tree
/
Copy pathKeyPassphraseProvider.java
More file actions
134 lines (114 loc) · 4.06 KB
/
Copy pathKeyPassphraseProvider.java
File metadata and controls
134 lines (114 loc) · 4.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package org.bouncycastle.openpgp.api;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.bouncycastle.util.Arrays;
public interface KeyPassphraseProvider
{
/**
* Return the passphrase for the given key.
* This callback is only fired, if the key is locked and a passphrase is required to unlock it.
* Returning null means, that the passphrase is not available.
* The returned array remains owned by the provider; a caller that needs to zeroize the
* passphrase after use must clone it first.
*
* @param key the locked (sub-)key.
* @return passphrase or null
*/
char[] getKeyPassword(OpenPGPKey.OpenPGPSecretKey key);
class DefaultKeyPassphraseProvider
implements KeyPassphraseProvider
{
private final Map<OpenPGPKey.OpenPGPSecretKey, char[]> passphraseMap = new HashMap<OpenPGPKey.OpenPGPSecretKey, char[]>();
private final List<char[]> allPassphrases = new ArrayList<char[]>();
private KeyPassphraseProvider callback;
public DefaultKeyPassphraseProvider()
{
}
public DefaultKeyPassphraseProvider(OpenPGPKey key, char[] passphrase)
{
allPassphrases.add(passphrase);
for (Iterator it = key.getSecretKeys().values().iterator(); it.hasNext(); )
{
OpenPGPKey.OpenPGPSecretKey subkey = (OpenPGPKey.OpenPGPSecretKey)it.next();
passphraseMap.put(subkey, passphrase);
}
}
@Override
public char[] getKeyPassword(OpenPGPKey.OpenPGPSecretKey key)
{
if (!key.isLocked())
{
passphraseMap.put(key, null);
return null;
}
char[] passphrase = passphraseMap.get(key);
if (passphrase != null)
{
return passphrase;
}
for (char[] knownPassphrase : allPassphrases)
{
if (key.isPassphraseCorrect(knownPassphrase))
{
addPassphrase(key, knownPassphrase);
return knownPassphrase;
}
}
if (callback != null)
{
passphrase = callback.getKeyPassword(key);
addPassphrase(key, passphrase);
}
return passphrase;
}
public DefaultKeyPassphraseProvider addPassphrase(char[] passphrase)
{
boolean found = false;
for (Iterator it = allPassphrases.iterator(); it.hasNext();)
{
char[] existing = (char[])it.next();
found |= (Arrays.areEqual(existing, passphrase));
}
if (!found)
{
allPassphrases.add(passphrase);
}
return this;
}
public DefaultKeyPassphraseProvider addPassphrase(OpenPGPKey key, char[] passphrase)
{
for (OpenPGPKey.OpenPGPSecretKey subkey : key.getSecretKeys().values())
{
if (!subkey.isLocked())
{
passphraseMap.put(subkey, null);
continue;
}
char[] existentPassphrase = passphraseMap.get(subkey);
if (existentPassphrase == null || !subkey.isPassphraseCorrect(existentPassphrase))
{
passphraseMap.put(subkey, passphrase);
}
}
return this;
}
public DefaultKeyPassphraseProvider addPassphrase(OpenPGPKey.OpenPGPSecretKey key, char[] passphrase)
{
if (!key.isLocked())
{
passphraseMap.put(key, null);
return this;
}
passphraseMap.put(key, passphrase);
return this;
}
public DefaultKeyPassphraseProvider setMissingPassphraseCallback(KeyPassphraseProvider callback)
{
this.callback = callback;
return this;
}
}
}