diff --git a/demo/src/main/java/ch/dissem/bitmessage/demo/Application.java b/demo/src/main/java/ch/dissem/bitmessage/demo/Application.java index 2de6fa1..05b6df2 100644 --- a/demo/src/main/java/ch/dissem/bitmessage/demo/Application.java +++ b/demo/src/main/java/ch/dissem/bitmessage/demo/Application.java @@ -212,7 +212,7 @@ public class Application { int i = 0; for (Plaintext message : messages) { i++; - System.out.print(i + ") From: " + message.getFrom() + "; Subject: " + message.getSubject()); + System.out.println(i + ") From: " + message.getFrom() + "; Subject: " + message.getSubject()); } if (i == 0) { System.out.println("You have no messages."); diff --git a/domain/src/main/java/ch/dissem/bitmessage/entity/payload/Msg.java b/domain/src/main/java/ch/dissem/bitmessage/entity/payload/Msg.java index 88026c8..f9e7c99 100644 --- a/domain/src/main/java/ch/dissem/bitmessage/entity/payload/Msg.java +++ b/domain/src/main/java/ch/dissem/bitmessage/entity/payload/Msg.java @@ -97,6 +97,7 @@ public class Msg extends ObjectPayload implements Encrypted { @Override public void write(OutputStream out) throws IOException { + if (encrypted == null) throw new IllegalStateException("Msg must be signed and encrypted before writing it."); encrypted.write(out); } } diff --git a/domain/src/main/java/ch/dissem/bitmessage/exception/InsufficientProofOfWorkException.java b/domain/src/main/java/ch/dissem/bitmessage/exception/InsufficientProofOfWorkException.java new file mode 100644 index 0000000..069bd79 --- /dev/null +++ b/domain/src/main/java/ch/dissem/bitmessage/exception/InsufficientProofOfWorkException.java @@ -0,0 +1,12 @@ +package ch.dissem.bitmessage.exception; + +import ch.dissem.bitmessage.utils.Strings; + +import java.io.IOException; +import java.util.Arrays; + +public class InsufficientProofOfWorkException extends IOException { + public InsufficientProofOfWorkException(byte[] target, byte[] hash) { + super("Insufficient proof of work: " + Strings.hex(target) + " required, " + Strings.hex(Arrays.copyOfRange(hash, 0, 8)) + " achieved."); + } +} diff --git a/domain/src/main/java/ch/dissem/bitmessage/utils/Security.java b/domain/src/main/java/ch/dissem/bitmessage/utils/Security.java index 978be35..db4faed 100644 --- a/domain/src/main/java/ch/dissem/bitmessage/utils/Security.java +++ b/domain/src/main/java/ch/dissem/bitmessage/utils/Security.java @@ -18,6 +18,7 @@ package ch.dissem.bitmessage.utils; import ch.dissem.bitmessage.entity.ObjectMessage; import ch.dissem.bitmessage.entity.payload.Pubkey; +import ch.dissem.bitmessage.exception.InsufficientProofOfWorkException; import ch.dissem.bitmessage.factory.Factory; import ch.dissem.bitmessage.ports.ProofOfWorkEngine; import org.bouncycastle.asn1.x9.X9ECParameters; @@ -106,13 +107,13 @@ public class Security { } /** - * @throws IOException if proof of work doesn't check out + * @throws InsufficientProofOfWorkException if proof of work doesn't check out */ public static void checkProofOfWork(ObjectMessage object, long nonceTrialsPerByte, long extraBytes) throws IOException { byte[] target = getProofOfWorkTarget(object, nonceTrialsPerByte, extraBytes); byte[] value = Security.doubleSha512(object.getNonce(), getInitialHash(object)); if (Bytes.lt(target, value, 8)) { - throw new IOException("Insufficient proof of work: " + Strings.hex(target) + " required, " + Strings.hex(Arrays.copyOfRange(value, 0, 8)) + " achieved."); + throw new InsufficientProofOfWorkException(target, value); } }