Require a label for signing

This adds a sign() and a verify() method to the CryptoComponent
that take a mandatory label argument to ensure that signatures can't be
repurposed.
This commit is contained in:
Torsten Grote
2016-11-17 16:36:51 -02:00
parent 9b09b64ad3
commit c86d971166
20 changed files with 158 additions and 107 deletions

View File

@@ -11,8 +11,13 @@ import org.jetbrains.annotations.Nullable;
import java.security.GeneralSecurityException;
import static org.briarproject.api.blogs.BlogManager.CLIENT_ID;
public interface BlogPostFactory {
String SIGNING_LABEL_POST = CLIENT_ID + "/POST";
String SIGNING_LABEL_COMMENT = CLIENT_ID + "/COMMENT";
BlogPost createBlogPost(@NotNull GroupId groupId, long timestamp,
@Nullable MessageId parent, @NotNull LocalAuthor author,
@NotNull String body)

View File

@@ -92,10 +92,10 @@ public interface ClientHelper {
BdfList toList(Message m) throws FormatException;
byte[] sign(BdfList toSign, byte[] privateKey)
byte[] sign(String label, BdfList toSign, byte[] privateKey)
throws FormatException, GeneralSecurityException;
void verifySignature(byte[] sig, byte[] publicKey, BdfList signed)
throws FormatException, GeneralSecurityException;
void verifySignature(String label, byte[] sig, byte[] publicKey,
BdfList signed) throws FormatException, GeneralSecurityException;
}

View File

@@ -143,6 +143,26 @@ public interface CryptoComponent {
/** Encodes the pseudo-random tag that is used to recognise a stream. */
void encodeTag(byte[] tag, SecretKey tagKey, long streamNumber);
/**
* Signs the given byte[] with the given PrivateKey.
*
* @param label A label specific to this signature
* to ensure that the signature cannot be repurposed
*/
byte[] sign(String label, byte[] toSign, PrivateKey privateKey)
throws GeneralSecurityException;
/**
* Verifies that the given signature is valid for the signedData
* and the given publicKey.
*
* @param label A label that was specific to this signature
* to ensure that the signature cannot be repurposed
* @return true if the signature was valid, false otherwise.
*/
boolean verify(String label, byte[] signedData, PublicKey publicKey,
byte[] signature) throws GeneralSecurityException;
/**
* Returns the hash of the given inputs. The inputs are unambiguously
* combined by prefixing each input with its length.

View File

@@ -8,8 +8,12 @@ import org.briarproject.api.sync.MessageId;
import java.security.GeneralSecurityException;
import static org.briarproject.api.forum.ForumManager.CLIENT_ID;
public interface ForumPostFactory {
String SIGNING_LABEL_POST = CLIENT_ID + "/POST";
@CryptoExecutor
ForumPost createPost(GroupId groupId, long timestamp, MessageId parent,
LocalAuthor author, String body)

View File

@@ -1,16 +1,20 @@
package org.briarproject.api.privategroup;
import org.briarproject.api.crypto.CryptoExecutor;
import org.briarproject.api.identity.Author;
import org.briarproject.api.identity.LocalAuthor;
import org.briarproject.api.nullsafety.NotNullByDefault;
import org.briarproject.api.sync.GroupId;
import org.briarproject.api.sync.MessageId;
import org.jetbrains.annotations.Nullable;
import static org.briarproject.api.privategroup.PrivateGroupManager.CLIENT_ID;
@NotNullByDefault
public interface GroupMessageFactory {
String SIGNING_LABEL_JOIN = CLIENT_ID + "/JOIN";
String SIGNING_LABEL_POST = CLIENT_ID + "/POST";
/**
* Creates a join announcement message for the creator of a group.
*

View File

@@ -6,8 +6,12 @@ import org.briarproject.api.data.BdfList;
import org.briarproject.api.identity.AuthorId;
import org.briarproject.api.sync.GroupId;
import static org.briarproject.api.privategroup.invitation.GroupInvitationManager.CLIENT_ID;
public interface GroupInvitationFactory {
String SIGNING_LABEL_INVITE = CLIENT_ID + "/INVITE";
/**
* Returns a signature to include when inviting a member to join a private
* group. If the member accepts the invitation, the signature will be
@@ -24,4 +28,5 @@ public interface GroupInvitationFactory {
*/
BdfList createInviteToken(AuthorId creatorId, AuthorId memberId,
GroupId privateGroupId, long timestamp);
}