Skip to content

Commit

Permalink
OpenPgpSignatureResult version 4, add timestamp
Browse files Browse the repository at this point in the history
  • Loading branch information
Valodim committed Nov 21, 2016
1 parent 9fac21e commit d0af1b5
Showing 1 changed file with 32 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import android.os.Parcel;
Expand All @@ -33,29 +34,23 @@ public class OpenPgpSignatureResult implements Parcelable {
* old versions of the protocol (and thus old versions of this class), we need a versioning
* system for the parcels sent between the clients and the providers.
*/
private static final int PARCELABLE_VERSION = 3;
private static final int PARCELABLE_VERSION = 4;

// content not signed
public static final int RESULT_NO_SIGNATURE = -1;
// invalid signature!
public static final int RESULT_INVALID_SIGNATURE = 0;
// successfully verified signature, with confirmed key
@Deprecated
public static final int RESULT_VALID_CONFIRMED = 1;
public static final int RESULT_VALID_KEY_CONFIRMED = 1;
// no key was found for this signature verification
public static final int RESULT_KEY_MISSING = 2;
// successfully verified signature, but with unconfirmed key
@Deprecated
public static final int RESULT_VALID_UNCONFIRMED = 3;
public static final int RESULT_VALID_KEY_UNCONFIRMED = 3;
// key has been revoked -> invalid signature!
public static final int RESULT_INVALID_KEY_REVOKED = 4;
// key is expired -> invalid signature!
public static final int RESULT_INVALID_KEY_EXPIRED = 5;
// insecure cryptographic algorithms/protocol -> invalid signature!
@Deprecated
public static final int RESULT_INVALID_INSECURE = 6;
public static final int RESULT_INVALID_KEY_INSECURE = 6;

private final int result;
Expand All @@ -64,16 +59,18 @@ public class OpenPgpSignatureResult implements Parcelable {
private final ArrayList<String> userIds;
private final ArrayList<String> confirmedUserIds;
private final SenderStatusResult senderStatusResult;
private final Date signatureTimestamp;

private OpenPgpSignatureResult(int signatureStatus, String signatureUserId, long keyId,
ArrayList<String> userIds, ArrayList<String> confirmedUserIds, SenderStatusResult senderStatusResult,
Boolean signatureOnly) {
Boolean signatureOnly, Date signatureTimestamp) {
this.result = signatureStatus;
this.primaryUserId = signatureUserId;
this.keyId = keyId;
this.userIds = userIds;
this.confirmedUserIds = confirmedUserIds;
this.senderStatusResult = senderStatusResult;
this.signatureTimestamp = signatureTimestamp;
}

private OpenPgpSignatureResult(Parcel source, int version) {
Expand All @@ -97,6 +94,12 @@ private OpenPgpSignatureResult(Parcel source, int version) {
this.senderStatusResult = SenderStatusResult.UNKNOWN;
this.confirmedUserIds = null;
}

if (version > 3) {
this.signatureTimestamp = source.readInt() > 0 ? new Date(source.readLong()) : null;
} else {
this.signatureTimestamp = null;
}
}

public int getResult() {
Expand All @@ -123,6 +126,10 @@ public long getKeyId() {
return keyId;
}

public Date getSignatureTimestamp() {
return signatureTimestamp;
}

public int describeContents() {
return 0;
}
Expand All @@ -149,6 +156,13 @@ public void writeToParcel(Parcel dest, int flags) {
// version 3
writeEnumWithNull(dest, senderStatusResult);
dest.writeStringList(confirmedUserIds);
// version 4
if (signatureTimestamp != null) {
dest.writeInt(1);
dest.writeLong(signatureTimestamp.getTime());
} else {
dest.writeInt(0);
}
// Go back and write the size
int parcelableSize = dest.dataPosition() - startPosition;
dest.setDataPosition(sizePosition);
Expand Down Expand Up @@ -185,31 +199,32 @@ public String toString() {
}

public static OpenPgpSignatureResult createWithValidSignature(int signatureStatus, String primaryUserId,
long keyId, ArrayList<String> userIds, ArrayList<String> confirmedUserIds, SenderStatusResult senderStatusResult) {
long keyId, ArrayList<String> userIds, ArrayList<String> confirmedUserIds,
SenderStatusResult senderStatusResult, Date signatureTimestamp) {
if (signatureStatus == RESULT_NO_SIGNATURE || signatureStatus == RESULT_KEY_MISSING ||
signatureStatus == RESULT_INVALID_SIGNATURE) {
throw new IllegalArgumentException("can only use this method for valid types of signatures");
}
return new OpenPgpSignatureResult(
signatureStatus, primaryUserId, keyId, userIds, confirmedUserIds, senderStatusResult, null);
return new OpenPgpSignatureResult(signatureStatus, primaryUserId, keyId, userIds, confirmedUserIds,
senderStatusResult, null, signatureTimestamp);
}

public static OpenPgpSignatureResult createWithNoSignature() {
return new OpenPgpSignatureResult(RESULT_NO_SIGNATURE, null, 0L, null, null, null, null);
return new OpenPgpSignatureResult(RESULT_NO_SIGNATURE, null, 0L, null, null, null, null, null);
}

public static OpenPgpSignatureResult createWithKeyMissing(long keyId) {
return new OpenPgpSignatureResult(RESULT_KEY_MISSING, null, keyId, null, null, null, null);
public static OpenPgpSignatureResult createWithKeyMissing(long keyId, Date signatureTimestamp) {
return new OpenPgpSignatureResult(RESULT_KEY_MISSING, null, keyId, null, null, null, null, signatureTimestamp);
}

public static OpenPgpSignatureResult createWithInvalidSignature() {
return new OpenPgpSignatureResult(RESULT_INVALID_SIGNATURE, null, 0L, null, null, null, null);
return new OpenPgpSignatureResult(RESULT_INVALID_SIGNATURE, null, 0L, null, null, null, null, null);
}

@Deprecated
public OpenPgpSignatureResult withSignatureOnlyFlag(boolean signatureOnly) {
return new OpenPgpSignatureResult(
result, primaryUserId, keyId, userIds, confirmedUserIds, senderStatusResult, signatureOnly);
return new OpenPgpSignatureResult(result, primaryUserId, keyId, userIds, confirmedUserIds,
senderStatusResult, signatureOnly, signatureTimestamp);
}

private static <T extends Enum<T>> T readEnumWithNullAndFallback(Parcel source, T[] enumValues, T fallback) {
Expand Down

0 comments on commit d0af1b5

Please sign in to comment.