2022-01-11 13:46:05 +01:00
|
|
|
// SPDX-FileCopyrightText: 2021 Paul Schaub <vanitasvitae@fsfe.org>
|
|
|
|
//
|
|
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
|
|
|
package sop;
|
|
|
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
2023-04-09 19:29:10 +02:00
|
|
|
import sop.enums.SignatureMode;
|
2022-01-11 13:46:05 +01:00
|
|
|
import sop.util.UTCUtil;
|
|
|
|
|
|
|
|
public class Verification {
|
|
|
|
|
|
|
|
private final Date creationTime;
|
|
|
|
private final String signingKeyFingerprint;
|
|
|
|
private final String signingCertFingerprint;
|
2023-04-09 19:29:10 +02:00
|
|
|
private final SignatureMode signatureMode;
|
|
|
|
private final String description;
|
|
|
|
|
|
|
|
public static final String MODE = "mode:";
|
|
|
|
|
2022-01-11 13:46:05 +01:00
|
|
|
|
|
|
|
public Verification(Date creationTime, String signingKeyFingerprint, String signingCertFingerprint) {
|
2023-04-09 19:29:10 +02:00
|
|
|
this(creationTime, signingKeyFingerprint, signingCertFingerprint, null, null);
|
|
|
|
}
|
|
|
|
|
|
|
|
public Verification(Date creationTime, String signingKeyFingerprint, String signingCertFingerprint, SignatureMode signatureMode, String description) {
|
2022-01-11 13:46:05 +01:00
|
|
|
this.creationTime = creationTime;
|
|
|
|
this.signingKeyFingerprint = signingKeyFingerprint;
|
|
|
|
this.signingCertFingerprint = signingCertFingerprint;
|
2023-04-09 19:29:10 +02:00
|
|
|
this.signatureMode = signatureMode;
|
|
|
|
this.description = description == null ? null : description.trim();
|
2022-01-11 13:46:05 +01:00
|
|
|
}
|
|
|
|
|
2022-11-07 16:21:34 +01:00
|
|
|
public static Verification fromString(String toString) {
|
|
|
|
String[] split = toString.trim().split(" ");
|
2023-04-09 19:29:10 +02:00
|
|
|
if (split.length < 3) {
|
2022-11-07 16:21:34 +01:00
|
|
|
throw new IllegalArgumentException("Verification must be of the format 'UTC-DATE OpenPGPFingerprint OpenPGPFingerprint'");
|
|
|
|
}
|
|
|
|
|
2023-04-09 19:51:49 +02:00
|
|
|
if (split.length == 3) {
|
|
|
|
return new Verification(UTCUtil.parseUTCDate(split[0]),
|
|
|
|
split[1], // key FP
|
|
|
|
split[2] // cert FP
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2023-04-09 19:29:10 +02:00
|
|
|
SignatureMode mode = null;
|
|
|
|
int index = 3;
|
|
|
|
if (split[index].startsWith(MODE)) {
|
|
|
|
mode = SignatureMode.valueOf(split[3].substring(MODE.length()));
|
|
|
|
index++;
|
|
|
|
}
|
|
|
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
for (int i = index; i < split.length; i++) {
|
|
|
|
if (sb.length() != 0) {
|
|
|
|
sb.append(' ');
|
|
|
|
}
|
|
|
|
sb.append(split[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
return new Verification(
|
|
|
|
UTCUtil.parseUTCDate(split[0]),
|
|
|
|
split[1], // key FP
|
|
|
|
split[2], // cert FP
|
|
|
|
mode,
|
|
|
|
sb.length() != 0 ? sb.toString() : null // description
|
|
|
|
);
|
2022-11-07 16:21:34 +01:00
|
|
|
}
|
|
|
|
|
2022-01-11 13:46:05 +01:00
|
|
|
/**
|
|
|
|
* Return the signatures' creation time.
|
|
|
|
*
|
|
|
|
* @return signature creation time
|
|
|
|
*/
|
|
|
|
public Date getCreationTime() {
|
|
|
|
return creationTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return the fingerprint of the signing (sub)key.
|
|
|
|
*
|
|
|
|
* @return signing key fingerprint
|
|
|
|
*/
|
|
|
|
public String getSigningKeyFingerprint() {
|
|
|
|
return signingKeyFingerprint;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return the fingerprint fo the signing certificate.
|
|
|
|
*
|
|
|
|
* @return signing certificate fingerprint
|
|
|
|
*/
|
|
|
|
public String getSigningCertFingerprint() {
|
|
|
|
return signingCertFingerprint;
|
|
|
|
}
|
|
|
|
|
2023-04-09 19:29:10 +02:00
|
|
|
/**
|
|
|
|
* Return the mode of the signature.
|
|
|
|
*
|
|
|
|
* @return signature mode
|
|
|
|
*/
|
|
|
|
public SignatureMode getSignatureMode() {
|
|
|
|
return signatureMode;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return an optional description.
|
|
|
|
*
|
|
|
|
* @return description
|
|
|
|
*/
|
|
|
|
public String getDescription() {
|
|
|
|
return description;
|
|
|
|
}
|
|
|
|
|
2022-01-11 13:46:05 +01:00
|
|
|
@Override
|
|
|
|
public String toString() {
|
2023-04-09 19:29:10 +02:00
|
|
|
StringBuilder sb = new StringBuilder()
|
|
|
|
.append(UTCUtil.formatUTCDate(getCreationTime()))
|
|
|
|
.append(' ')
|
|
|
|
.append(getSigningKeyFingerprint())
|
|
|
|
.append(' ')
|
|
|
|
.append(getSigningCertFingerprint());
|
|
|
|
|
|
|
|
if (signatureMode != null) {
|
|
|
|
sb.append(' ').append(MODE).append(signatureMode);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (description != null) {
|
|
|
|
sb.append(' ').append(description);
|
|
|
|
}
|
|
|
|
|
|
|
|
return sb.toString();
|
2022-01-11 13:46:05 +01:00
|
|
|
}
|
2022-11-07 16:21:34 +01:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public int hashCode() {
|
|
|
|
return toString().hashCode();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean equals(Object obj) {
|
|
|
|
if (obj == null) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (this == obj) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
if (!(obj instanceof Verification)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
Verification other = (Verification) obj;
|
|
|
|
return toString().equals(other.toString());
|
|
|
|
}
|
2022-01-11 13:46:05 +01:00
|
|
|
}
|