Support for multiple hash algos

This commit is contained in:
Dominik Schürmann 2014-08-14 14:50:13 +02:00
parent 6da17ef6bb
commit ad69e47cec
4 changed files with 29 additions and 16 deletions

View File

@ -49,16 +49,16 @@ import java.util.Date;
import java.util.LinkedList;
import java.util.List;
/** Wrapper for a PGPSecretKey.
*
/**
* Wrapper for a PGPSecretKey.
* <p/>
* This object can only be obtained from a WrappedSecretKeyRing, and stores a
* back reference to its parent.
*
* <p/>
* This class represents known secret keys which are stored in the database.
* All "crypto operations using a known secret key" should be implemented in
* this class, to ensure on type level that these operations are performed on
* properly imported secret keys only.
*
*/
public class CanonicalizedSecretKey extends CanonicalizedPublicKey {
@ -105,13 +105,23 @@ public class CanonicalizedSecretKey extends CanonicalizedPublicKey {
return true;
}
// TODO: just a hack currently
/**
* Returns a list of all supported hash algorithms. This list is currently hardcoded to return
* a limited set of algorithms supported by Yubikeys.
*
* @return
*/
public LinkedList<Integer> getSupportedHashAlgorithms() {
LinkedList<Integer> supported = new LinkedList<Integer>();
if (mPrivateKeyState == PRIVATE_KEY_STATE_DIVERT_TO_CARD) {
// TODO: only works with SHA256 ?!
// TODO: no support for MD5
supported.add(HashAlgorithmTags.RIPEMD160);
supported.add(HashAlgorithmTags.SHA1);
supported.add(HashAlgorithmTags.SHA224);
supported.add(HashAlgorithmTags.SHA256);
supported.add(HashAlgorithmTags.SHA384);
supported.add(HashAlgorithmTags.SHA512); // preferred is latest
} else {
supported.add(HashAlgorithmTags.MD5);
supported.add(HashAlgorithmTags.RIPEMD160);

View File

@ -261,10 +261,12 @@ public class PgpSignEncrypt {
public static class NeedNfcDataException extends Exception {
public byte[] mHashToSign;
public int mHashAlgo;
public Date mCreationTimestamp;
public NeedNfcDataException(byte[] hashToSign, Date creationTimestamp) {
public NeedNfcDataException(byte[] hashToSign, int hashAlgo, Date creationTimestamp) {
mHashToSign = hashToSign;
mHashAlgo = hashAlgo;
mCreationTimestamp = creationTimestamp;
}
}
@ -521,7 +523,7 @@ public class PgpSignEncrypt {
signatureGenerator.generate().encode(pOut);
} catch (NfcSyncPGPContentSignerBuilder.NfcInteractionNeeded e) {
// this secret key diverts to a OpenPGP card, throw exception with hash that will be signed
throw new NeedNfcDataException(e.hashToSign, e.creationTimestamp);
throw new NeedNfcDataException(e.hashToSign, e.hashAlgo, e.creationTimestamp);
}
}

View File

@ -138,11 +138,12 @@ public class OpenPgpService extends RemoteService {
return result;
}
private Intent getNfcIntent(Intent data, byte[] hashToSign) {
private Intent getNfcIntent(Intent data, byte[] hashToSign, int hashAlgo) {
// build PendingIntent for Yubikey NFC operations
Intent intent = new Intent(getBaseContext(), NfcActivity.class);
intent.setAction(NfcActivity.ACTION_SIGN_HASH);
intent.putExtra(NfcActivity.EXTRA_NFC_HASH_TO_SIGN, hashToSign);
intent.putExtra(NfcActivity.EXTRA_NFC_HASH_ALGO, hashAlgo);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
// pass params through to activity that it can be returned again later to repeat pgp operation
intent.putExtra(NfcActivity.EXTRA_DATA, data);
@ -239,7 +240,7 @@ public class OpenPgpService extends RemoteService {
// pass through the signature creation timestamp to be used again on second execution
// of PgpSignEncrypt when we have the signed hash!
data.putExtra(OpenPgpApi.EXTRA_NFC_SIG_CREATION_TIMESTAMP, e.mCreationTimestamp.getTime());
return getNfcIntent(data, e.mHashToSign);
return getNfcIntent(data, e.mHashToSign, e.mHashAlgo);
}
} finally {
is.close();

@ -1 +1 @@
Subproject commit 1531e38c30a9c3e072e302c1931fef2999fe08de
Subproject commit 1a0579e06691a62b54137382bca0e381eab2df91