From 75776eb7dededb326f98128ac82b70388782278b Mon Sep 17 00:00:00 2001 From: akwizgran <michael@briarproject.org> Date: Thu, 18 Apr 2019 18:09:09 +0100 Subject: [PATCH] Generate handshake keys when creating local author. --- .../bramble/api/identity/AuthorFactory.java | 11 ++---- .../bramble/identity/AuthorFactoryImpl.java | 27 ++++++++------ .../bramble/identity/IdentityManagerImpl.java | 13 ++----- .../identity/IdentityManagerImplTest.java | 36 ++----------------- .../briar/feed/FeedFactoryImpl.java | 16 +++------ .../briar/test/TestDataCreatorImpl.java | 33 ++++++----------- .../blog/BlogManagerIntegrationTest.java | 6 +--- .../IntroductionCryptoIntegrationTest.java | 6 ++-- .../messaging/MessageSizeIntegrationTest.java | 7 +--- .../briar/test/BriarTestUtils.java | 19 +++++----- 10 files changed, 50 insertions(+), 124 deletions(-) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/identity/AuthorFactory.java b/bramble-api/src/main/java/org/briarproject/bramble/api/identity/AuthorFactory.java index 5566a2c956..a46d386a20 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/identity/AuthorFactory.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/identity/AuthorFactory.java @@ -18,14 +18,7 @@ public interface AuthorFactory { /** * Creates a local author with the current format version and the given - * name and keys. + * name. */ - LocalAuthor createLocalAuthor(String name, byte[] publicKey, - byte[] privateKey); - - /** - * Creates a local author with the given format version, name and keys. - */ - LocalAuthor createLocalAuthor(int formatVersion, String name, - byte[] publicKey, byte[] privateKey); + LocalAuthor createLocalAuthor(String name, boolean handshakeKeys); } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/identity/AuthorFactoryImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/identity/AuthorFactoryImpl.java index bbd2ae65cb..0f444c74a4 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/identity/AuthorFactoryImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/identity/AuthorFactoryImpl.java @@ -1,6 +1,7 @@ package org.briarproject.bramble.identity; import org.briarproject.bramble.api.crypto.CryptoComponent; +import org.briarproject.bramble.api.crypto.KeyPair; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.AuthorFactory; import org.briarproject.bramble.api.identity.AuthorId; @@ -43,17 +44,21 @@ class AuthorFactoryImpl implements AuthorFactory { } @Override - public LocalAuthor createLocalAuthor(String name, byte[] publicKey, - byte[] privateKey) { - return createLocalAuthor(FORMAT_VERSION, name, publicKey, privateKey); - } - - @Override - public LocalAuthor createLocalAuthor(int formatVersion, String name, - byte[] publicKey, byte[] privateKey) { - AuthorId id = getId(formatVersion, name, publicKey); - return new LocalAuthor(id, formatVersion, name, publicKey, privateKey, - clock.currentTimeMillis()); + public LocalAuthor createLocalAuthor(String name, boolean handshakeKeys) { + KeyPair signatureKeyPair = crypto.generateSignatureKeyPair(); + byte[] sigPub = signatureKeyPair.getPublic().getEncoded(); + byte[] sigPriv = signatureKeyPair.getPrivate().getEncoded(); + AuthorId id = getId(FORMAT_VERSION, name, sigPub); + if (handshakeKeys) { + KeyPair handshakeKeyPair = crypto.generateAgreementKeyPair(); + byte[] handPub = handshakeKeyPair.getPublic().getEncoded(); + byte[] handPriv = handshakeKeyPair.getPrivate().getEncoded(); + return new LocalAuthor(id, FORMAT_VERSION, name, sigPub, sigPriv, + handPub, handPriv, clock.currentTimeMillis()); + } else { + return new LocalAuthor(id, FORMAT_VERSION, name, sigPub, sigPriv, + clock.currentTimeMillis()); + } } private AuthorId getId(int formatVersion, String name, byte[] publicKey) { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/identity/IdentityManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/identity/IdentityManagerImpl.java index d98f5d5034..a7d515d283 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/identity/IdentityManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/identity/IdentityManagerImpl.java @@ -1,7 +1,5 @@ package org.briarproject.bramble.identity; -import org.briarproject.bramble.api.crypto.CryptoComponent; -import org.briarproject.bramble.api.crypto.KeyPair; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; @@ -27,7 +25,6 @@ class IdentityManagerImpl implements IdentityManager { Logger.getLogger(IdentityManagerImpl.class.getName()); private final DatabaseComponent db; - private final CryptoComponent crypto; private final AuthorFactory authorFactory; // The local author is immutable so we can cache it @@ -35,21 +32,15 @@ class IdentityManagerImpl implements IdentityManager { private volatile LocalAuthor cachedAuthor; @Inject - IdentityManagerImpl(DatabaseComponent db, CryptoComponent crypto, - AuthorFactory authorFactory) { + IdentityManagerImpl(DatabaseComponent db, AuthorFactory authorFactory) { this.db = db; - this.crypto = crypto; this.authorFactory = authorFactory; } @Override public LocalAuthor createLocalAuthor(String name) { long start = now(); - KeyPair keyPair = crypto.generateSignatureKeyPair(); - byte[] publicKey = keyPair.getPublic().getEncoded(); - byte[] privateKey = keyPair.getPrivate().getEncoded(); - LocalAuthor localAuthor = authorFactory.createLocalAuthor(name, - publicKey, privateKey); + LocalAuthor localAuthor = authorFactory.createLocalAuthor(name, true); logDuration(LOG, "Creating local author", start); return localAuthor; } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/identity/IdentityManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/identity/IdentityManagerImplTest.java index 0ed0b8d225..896b491562 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/identity/IdentityManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/identity/IdentityManagerImplTest.java @@ -1,9 +1,5 @@ package org.briarproject.bramble.identity; -import org.briarproject.bramble.api.crypto.CryptoComponent; -import org.briarproject.bramble.api.crypto.KeyPair; -import org.briarproject.bramble.api.crypto.PrivateKey; -import org.briarproject.bramble.api.crypto.PublicKey; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; @@ -12,56 +8,30 @@ import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.test.BrambleMockTestCase; import org.briarproject.bramble.test.DbExpectations; -import org.jmock.Expectations; import org.junit.Before; import org.junit.Test; import java.util.Collection; -import java.util.Collections; +import static java.util.Collections.singletonList; import static org.briarproject.bramble.test.TestUtils.getLocalAuthor; import static org.junit.Assert.assertEquals; public class IdentityManagerImplTest extends BrambleMockTestCase { private final DatabaseComponent db = context.mock(DatabaseComponent.class); - private final CryptoComponent crypto = context.mock(CryptoComponent.class); private final AuthorFactory authorFactory = context.mock(AuthorFactory.class); - private final PublicKey publicKey = context.mock(PublicKey.class); - private final PrivateKey privateKey = context.mock(PrivateKey.class); private final Transaction txn = new Transaction(null, false); private final LocalAuthor localAuthor = getLocalAuthor(); private final Collection<LocalAuthor> localAuthors = - Collections.singletonList(localAuthor); - private final String authorName = localAuthor.getName(); - private final KeyPair keyPair = new KeyPair(publicKey, privateKey); - private final byte[] publicKeyBytes = localAuthor.getPublicKey(); - private final byte[] privateKeyBytes = localAuthor.getPrivateKey(); + singletonList(localAuthor); private IdentityManager identityManager; @Before public void setUp() { - identityManager = new IdentityManagerImpl(db, crypto, authorFactory); - } - - @Test - public void testCreateLocalAuthor() { - context.checking(new Expectations() {{ - oneOf(crypto).generateSignatureKeyPair(); - will(returnValue(keyPair)); - oneOf(publicKey).getEncoded(); - will(returnValue(publicKeyBytes)); - oneOf(privateKey).getEncoded(); - will(returnValue(privateKeyBytes)); - oneOf(authorFactory).createLocalAuthor(authorName, - publicKeyBytes, privateKeyBytes); - will(returnValue(localAuthor)); - }}); - - assertEquals(localAuthor, - identityManager.createLocalAuthor(authorName)); + identityManager = new IdentityManagerImpl(db, authorFactory); } @Test diff --git a/briar-core/src/main/java/org/briarproject/briar/feed/FeedFactoryImpl.java b/briar-core/src/main/java/org/briarproject/briar/feed/FeedFactoryImpl.java index 5e131632fc..de73abc2d8 100644 --- a/briar-core/src/main/java/org/briarproject/briar/feed/FeedFactoryImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/feed/FeedFactoryImpl.java @@ -4,8 +4,6 @@ import com.rometools.rome.feed.synd.SyndFeed; import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.client.ClientHelper; -import org.briarproject.bramble.api.crypto.CryptoComponent; -import org.briarproject.bramble.api.crypto.KeyPair; import org.briarproject.bramble.api.data.BdfDictionary; import org.briarproject.bramble.api.data.BdfEntry; import org.briarproject.bramble.api.data.BdfList; @@ -32,17 +30,14 @@ import static org.briarproject.briar.api.feed.FeedConstants.KEY_FEED_URL; class FeedFactoryImpl implements FeedFactory { - private final CryptoComponent cryptoComponent; private final AuthorFactory authorFactory; private final BlogFactory blogFactory; private final ClientHelper clientHelper; private final Clock clock; @Inject - FeedFactoryImpl(CryptoComponent cryptoComponent, - AuthorFactory authorFactory, BlogFactory blogFactory, + FeedFactoryImpl(AuthorFactory authorFactory, BlogFactory blogFactory, ClientHelper clientHelper, Clock clock) { - this.cryptoComponent = cryptoComponent; this.authorFactory = authorFactory; this.blogFactory = blogFactory; this.clientHelper = clientHelper; @@ -55,10 +50,7 @@ class FeedFactoryImpl implements FeedFactory { if (title == null) title = "RSS"; else title = StringUtils.truncateUtf8(title, MAX_AUTHOR_NAME_LENGTH); - KeyPair keyPair = cryptoComponent.generateSignatureKeyPair(); - LocalAuthor localAuthor = authorFactory.createLocalAuthor(title, - keyPair.getPublic().getEncoded(), - keyPair.getPrivate().getEncoded()); + LocalAuthor localAuthor = authorFactory.createLocalAuthor(title, false); Blog blog = blogFactory.createFeedBlog(localAuthor); long added = clock.currentTimeMillis(); @@ -80,9 +72,9 @@ class FeedFactoryImpl implements FeedFactory { BdfList authorList = d.getList(KEY_FEED_AUTHOR); byte[] privateKey = d.getRaw(KEY_FEED_PRIVATE_KEY); Author author = clientHelper.parseAndValidateAuthor(authorList); - LocalAuthor localAuthor = authorFactory.createLocalAuthor( + LocalAuthor localAuthor = new LocalAuthor(author.getId(), author.getFormatVersion(), author.getName(), - author.getPublicKey(), privateKey); + author.getPublicKey(), privateKey, 0); Blog blog = blogFactory.createFeedBlog(localAuthor); String desc = d.getOptionalString(KEY_FEED_DESC); diff --git a/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java b/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java index 851b78f695..6cfdf6b7a7 100644 --- a/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java @@ -5,8 +5,6 @@ import org.briarproject.bramble.api.client.ClientHelper; import org.briarproject.bramble.api.contact.Contact; import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactManager; -import org.briarproject.bramble.api.crypto.CryptoComponent; -import org.briarproject.bramble.api.crypto.KeyPair; import org.briarproject.bramble.api.crypto.SecretKey; import org.briarproject.bramble.api.data.BdfDictionary; import org.briarproject.bramble.api.db.DatabaseComponent; @@ -74,7 +72,6 @@ public class TestDataCreatorImpl implements TestDataCreator { private final ClientHelper clientHelper; private final MessageTracker messageTracker; private final BlogPostFactory blogPostFactory; - private final CryptoComponent cryptoComponent; private final DatabaseComponent db; private final IdentityManager identityManager; @@ -94,9 +91,8 @@ public class TestDataCreatorImpl implements TestDataCreator { TestDataCreatorImpl(AuthorFactory authorFactory, Clock clock, PrivateMessageFactory privateMessageFactory, ClientHelper clientHelper, MessageTracker messageTracker, - BlogPostFactory blogPostFactory, CryptoComponent cryptoComponent, - DatabaseComponent db, IdentityManager identityManager, - ContactManager contactManager, + BlogPostFactory blogPostFactory, DatabaseComponent db, + IdentityManager identityManager, ContactManager contactManager, TransportPropertyManager transportPropertyManager, MessagingManager messagingManager, BlogManager blogManager, ForumManager forumManager, @IoExecutor Executor ioExecutor) { @@ -106,7 +102,6 @@ public class TestDataCreatorImpl implements TestDataCreator { this.clientHelper = clientHelper; this.messageTracker = messageTracker; this.blogPostFactory = blogPostFactory; - this.cryptoComponent = cryptoComponent; this.db = db; this.identityManager = identityManager; this.contactManager = contactManager; @@ -150,14 +145,14 @@ public class TestDataCreatorImpl implements TestDataCreator { List<Contact> contacts = new ArrayList<>(numContacts); LocalAuthor localAuthor = identityManager.getLocalAuthor(); for (int i = 0; i < numContacts; i++) { - LocalAuthor author = getRandomAuthor(); - Contact contact = addContact(localAuthor.getId(), author); + LocalAuthor remote = getRandomAuthor(); + Contact contact = addContact(localAuthor.getId(), remote); contacts.add(contact); } return contacts; } - private Contact addContact(AuthorId localAuthorId, LocalAuthor author) + private Contact addContact(AuthorId localAuthorId, LocalAuthor remote) throws DbException { // prepare to add contact @@ -173,7 +168,7 @@ public class TestDataCreatorImpl implements TestDataCreator { Transaction txn = db.startTransaction(false); try { ContactId contactId = contactManager - .addContact(txn, author, localAuthorId, secretKey, + .addContact(txn, remote, localAuthorId, secretKey, timestamp, true, verified, true); if (random.nextBoolean()) { contactManager @@ -187,24 +182,18 @@ public class TestDataCreatorImpl implements TestDataCreator { } if (LOG.isLoggable(INFO)) { - LOG.info("Added contact " + author.getName()); + LOG.info("Added contact " + remote.getName()); LOG.info("with transport properties: " + props.toString()); } - localAuthors.put(contact, author); + localAuthors.put(contact, remote); return contact; } @Override public Contact addContact(String name) throws DbException { LocalAuthor localAuthor = identityManager.getLocalAuthor(); - return addContact(localAuthor.getId(), getAuthor(name)); - } - - private LocalAuthor getAuthor(String name) { - KeyPair keyPair = cryptoComponent.generateSignatureKeyPair(); - byte[] publicKey = keyPair.getPublic().getEncoded(); - byte[] privateKey = keyPair.getPrivate().getEncoded(); - return authorFactory.createLocalAuthor(name, publicKey, privateKey); + LocalAuthor remote = authorFactory.createLocalAuthor(name, false); + return addContact(localAuthor.getId(), remote); } private String getRandomAuthorName() { @@ -213,7 +202,7 @@ public class TestDataCreatorImpl implements TestDataCreator { } private LocalAuthor getRandomAuthor() { - return getAuthor(getRandomAuthorName()); + return authorFactory.createLocalAuthor(getRandomAuthorName(), false); } private SecretKey getSecretKey() { diff --git a/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerIntegrationTest.java index 7e6638a5ab..98e984275e 100644 --- a/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerIntegrationTest.java @@ -21,9 +21,7 @@ import java.util.Iterator; import static junit.framework.Assert.assertNotNull; import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH; -import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH; import static org.briarproject.bramble.api.identity.AuthorInfo.Status.NONE; -import static org.briarproject.bramble.test.TestUtils.getRandomBytes; import static org.briarproject.bramble.util.StringUtils.getRandomString; import static org.briarproject.briar.api.blog.MessageType.COMMENT; import static org.briarproject.briar.api.blog.MessageType.POST; @@ -51,9 +49,7 @@ public class BlogManagerIntegrationTest author0 = identityManager0.getLocalAuthor(); author1 = identityManager1.getLocalAuthor(); rssAuthor = c0.getAuthorFactory().createLocalAuthor( - getRandomString(MAX_AUTHOR_NAME_LENGTH), - getRandomBytes(MAX_PUBLIC_KEY_LENGTH), - getRandomBytes(123)); + getRandomString(MAX_AUTHOR_NAME_LENGTH), false); blogManager0 = c0.getBlogManager(); blogManager1 = c1.getBlogManager(); diff --git a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionCryptoIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionCryptoIntegrationTest.java index 81c2ae01c3..c256d102bd 100644 --- a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionCryptoIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionCryptoIntegrationTest.java @@ -58,10 +58,8 @@ public class IntroductionCryptoIntegrationTest extends BrambleTestCase { crypto = new IntroductionCryptoImpl(cryptoComponent, clientHelper); introducer = getRealAuthor(authorFactory); - LocalAuthor introducee1 = - getRealLocalAuthor(cryptoComponent, authorFactory); - LocalAuthor introducee2 = - getRealLocalAuthor(cryptoComponent, authorFactory); + LocalAuthor introducee1 = getRealLocalAuthor(authorFactory); + LocalAuthor introducee2 = getRealLocalAuthor(authorFactory); boolean isAlice = crypto.isAlice(introducee1.getId(), introducee2.getId()); alice = isAlice ? introducee1 : introducee2; diff --git a/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTest.java index 086f7f2b1c..4b9357fe32 100644 --- a/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTest.java @@ -2,7 +2,6 @@ package org.briarproject.briar.messaging; import org.briarproject.bramble.api.UniqueId; import org.briarproject.bramble.api.crypto.CryptoComponent; -import org.briarproject.bramble.api.crypto.PrivateKey; import org.briarproject.bramble.api.identity.AuthorFactory; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.sync.GroupId; @@ -70,12 +69,8 @@ public class MessageSizeIntegrationTest extends BriarTestCase { @Test public void testForumPostFitsIntoRecord() throws Exception { // Create a maximum-length author - int formatVersion = Integer.MAX_VALUE; String authorName = getRandomString(MAX_AUTHOR_NAME_LENGTH); - byte[] authorPublic = new byte[MAX_PUBLIC_KEY_LENGTH]; - PrivateKey privateKey = crypto.generateSignatureKeyPair().getPrivate(); - LocalAuthor author = authorFactory.createLocalAuthor(formatVersion, - authorName, authorPublic, privateKey.getEncoded()); + LocalAuthor author = authorFactory.createLocalAuthor(authorName, false); // Create a maximum-length forum post GroupId groupId = new GroupId(getRandomId()); long timestamp = Long.MAX_VALUE; diff --git a/briar-core/src/test/java/org/briarproject/briar/test/BriarTestUtils.java b/briar-core/src/test/java/org/briarproject/briar/test/BriarTestUtils.java index 9f71087ebd..595d6a0058 100644 --- a/briar-core/src/test/java/org/briarproject/briar/test/BriarTestUtils.java +++ b/briar-core/src/test/java/org/briarproject/briar/test/BriarTestUtils.java @@ -1,7 +1,5 @@ package org.briarproject.briar.test; -import org.briarproject.bramble.api.crypto.CryptoComponent; -import org.briarproject.bramble.api.crypto.KeyPair; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.AuthorFactory; @@ -10,6 +8,7 @@ import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.MessageTracker.GroupCount; +import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH; import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH; import static org.briarproject.bramble.test.TestUtils.getRandomBytes; import static org.briarproject.bramble.util.StringUtils.getRandomString; @@ -27,23 +26,21 @@ public class BriarTestUtils { } public static void assertGroupCount(MessageTracker tracker, GroupId g, - long msgCount, long unreadCount) throws DbException { + long msgCount, long unreadCount) throws DbException { GroupCount c1 = tracker.getGroupCount(g); assertEquals(msgCount, c1.getMsgCount()); assertEquals(unreadCount, c1.getUnreadCount()); } public static Author getRealAuthor(AuthorFactory authorFactory) { - return authorFactory.createAuthor(getRandomString(5), - getRandomBytes(MAX_PUBLIC_KEY_LENGTH)); + String name = getRandomString(MAX_AUTHOR_NAME_LENGTH); + byte[] publicKey = getRandomBytes(MAX_PUBLIC_KEY_LENGTH); + return authorFactory.createAuthor(name, publicKey); } - public static LocalAuthor getRealLocalAuthor( - CryptoComponent cryptoComponent, AuthorFactory authorFactory) { - KeyPair keyPair = cryptoComponent.generateSignatureKeyPair(); - return authorFactory.createLocalAuthor(getRandomString(5), - keyPair.getPublic().getEncoded(), - keyPair.getPrivate().getEncoded()); + public static LocalAuthor getRealLocalAuthor(AuthorFactory authorFactory) { + String name = getRandomString(MAX_AUTHOR_NAME_LENGTH); + return authorFactory.createLocalAuthor(name, false); } } -- GitLab