/** * Returns <code>true</code> if the DHT key stored in the packet matches * the computed (from the encrypted data) DHT key. * @see #getDhtKey() */ public boolean verifyPacketHash() { return getDhtKey().equals(dhtKey); }
/** * Adds a new entry containing the DHT key and Delete Verification Hash of an Email Packet.<br/> * If an entry with the same DHT key exists already, nothing happens. * @param emailPacket */ public void put(EncryptedEmailPacket emailPacket) { Hash emailPacketKey = emailPacket.getDhtKey(); Hash delVerificationHash = emailPacket.getDeleteVerificationHash(); IndexPacketEntry newEntry = new IndexPacketEntry(emailPacketKey, delVerificationHash); put(newEntry); }
public void put(Collection<EncryptedEmailPacket> emailPackets) { for (EncryptedEmailPacket emailPacket: emailPackets) { Hash emailPacketKey = emailPacket.getDhtKey(); Hash delVerificationHash = emailPacket.getDeleteVerificationHash(); IndexPacketEntry entry = new IndexPacketEntry(emailPacketKey, delVerificationHash); put(entry); } }
@Test public void testSendAnonymousEmail() throws Exception { testEmail = new Email(true); testEmail.setFrom(new InternetAddress("anonymous")); testEmail.addRecipient(RecipientType.TO, new InternetAddress("Erika Mustermann <m-5~1dZ0MrGdyAWu-C2ecNAB5LCCsHQpeSfjn-r~mqMfNvroR98~BRmReUDmb0la-r-pBHLMtflrJE7aTrGwDTBm5~AJFEm-9SJPZnyGs-ed5pOj4Db65yJml1y1n77qr1~mM4GITl6KuIoxg8YwvPrCIlXe2hiiDCoC-uY9-np9UY>")); testEmail.setSubject("Test", "UTF-8"); testEmail.setText("foobar"); op.sendEmail(testEmail); ArgumentCaptor<DhtStorablePacket> arg = ArgumentCaptor.forClass(DhtStorablePacket.class); verify(dht, times(2)).store(arg.capture()); List<DhtStorablePacket> values = arg.getAllValues(); assertTrue(values.get(0) instanceof EncryptedEmailPacket); assertTrue(values.get(1) instanceof IndexPacket); assertTrue(((IndexPacket)values.get(1)).contains(((EncryptedEmailPacket)values.get(0)).getDhtKey())); } }
@Test public void testSendEmail() throws Exception { EmailIdentity identity = TestUtil.createTestIdentities().get(0).identity; String address = "tester <" + identity.getKey() + ">"; when(identities.extractIdentity(address)).thenReturn(identity); testEmail = new Email(true); testEmail.setFrom(new InternetAddress(address)); testEmail.addRecipient(RecipientType.TO, new InternetAddress("Erika Mustermann <m-5~1dZ0MrGdyAWu-C2ecNAB5LCCsHQpeSfjn-r~mqMfNvroR98~BRmReUDmb0la-r-pBHLMtflrJE7aTrGwDTBm5~AJFEm-9SJPZnyGs-ed5pOj4Db65yJml1y1n77qr1~mM4GITl6KuIoxg8YwvPrCIlXe2hiiDCoC-uY9-np9UY>")); testEmail.setSubject("Test", "UTF-8"); testEmail.setText("foobar"); op.sendEmail(testEmail); ArgumentCaptor<DhtStorablePacket> arg = ArgumentCaptor.forClass(DhtStorablePacket.class); verify(dht, times(2)).store(arg.capture()); List<DhtStorablePacket> values = arg.getAllValues(); assertTrue(values.get(0) instanceof EncryptedEmailPacket); assertTrue(values.get(1) instanceof IndexPacket); assertTrue(((IndexPacket)values.get(1)).contains(((EncryptedEmailPacket)values.get(0)).getDhtKey())); }
@Test public void testRemoveKey() { assertEquals(3, indexPacket1.getNumEntries()); // Try to remove a key that doesn't exist in the packet indexPacket1.remove(emailPacket4.getDhtKey()); assertEquals(3, indexPacket1.getNumEntries()); // Remove a key that does exist in the packet indexPacket1.remove(emailPacket1.getDhtKey()); assertEquals(2, indexPacket1.getNumEntries()); } }
/** * Creates an <code>EncryptedEmailPacket</code> from an <code>UnencryptedEmailPacket</code>. * The public key of <code>emailDestination</code> is used for encryption. * The store time is set to <code>0</code>. * @param unencryptedPacket * @param emailDestination * @throws GeneralSecurityException If an error occurred during encryption */ public EncryptedEmailPacket(UnencryptedEmailPacket unencryptedPacket, EmailDestination emailDestination) throws GeneralSecurityException { storeTime = 0; byte[] delAuthorizationBytes = unencryptedPacket.getDeleteAuthorization().toByteArray(); delVerificationHash = SHA256Generator.getInstance().calculateHash(delAuthorizationBytes); cryptoImpl = emailDestination.getCryptoImpl(); encryptedData = cryptoImpl.encrypt(unencryptedPacket.toByteArray(), emailDestination.getPublicEncryptionKey()); dhtKey = getDhtKey(); }
/** Tests processing of one valid and one invalid {@link EmailPacketDeleteRequest}. */ @Test public void testPacketReceived() throws PasswordException { packetFolder.store(emailPacket); assertEquals(1, packetFolder.getElements().size()); EmailPacketDeleteRequest delRequest; // send an invalid delete request byte[] delAuthBytes = unencryptedPacket.getDeleteAuthorization().toByteArray().clone(); delAuthBytes[5] ^= 1; UniqueId invalidAuthorization = new UniqueId(delAuthBytes, 0); delRequest = new EmailPacketDeleteRequest(emailPacket.getDhtKey(), invalidAuthorization); packetFolder.packetReceived(delRequest, sender, System.currentTimeMillis()); assertEquals(1, packetFolder.getElements().size()); // send a valid delete request delRequest = new EmailPacketDeleteRequest(emailPacket.getDhtKey(), unencryptedPacket.getDeleteAuthorization()); packetFolder.packetReceived(delRequest, sender, System.currentTimeMillis()); assertEquals(0, packetFolder.getElements().size()); }
UniqueId delAuthKey1 = new UniqueId("nJlsaGZb1k6OFze1fUsHEF0osP5Wv9Rgta8EwHl8Te8="); // matches emailPkt1Data UniqueId delAuthKey2 = new UniqueId("ImXwDy7HZq7pyjGwxpYmlwaKAWoQlUl2fdrBK~mTt0g="); // matches emailPkt2Data String prefix1 = emailPacket1.getDhtKey().toBase64().substring(0, 2); String prefix2 = emailPacket2.getDhtKey().toBase64().substring(0, 2); assertEquals("Error setting up test packets: prefixes of DHT keys differ", prefix1, prefix2); assertFalse("Error setting up test packets: DHT keys should be different", emailPacket1.getDhtKey().equals(emailPacket2.getDhtKey())); assertEquals("Folder should have two elements!", 2, packetFolder.getElements().size()); EmailPacketDeleteRequest delRequest1 = new EmailPacketDeleteRequest(emailPacket1.getDhtKey(), delAuthKey1); packetFolder.process(delRequest1); assertEquals("Folder should have exactly one element!", 1, packetFolder.getElements().size()); EmailPacketDeleteRequest delRequest2 = new EmailPacketDeleteRequest(emailPacket2.getDhtKey(), delAuthKey2); packetFolder.process(delRequest2); assertEquals("Folder should be empty!", 0, packetFolder.getElements().size()); assertTrue(newDelRequest1 instanceof EmailPacketDeleteRequest); EmailPacketDeleteRequest newEmailPacketDelRequest1 = (EmailPacketDeleteRequest)newDelRequest1; assertEquals(newEmailPacketDelRequest1.getDhtKey(), emailPacket1.getDhtKey()); assertEquals(newEmailPacketDelRequest1.getAuthorization(), delAuthKey1); DeleteRequest newDelRequest2 = packetFolder.storeAndCreateDeleteRequest(emailPacket2); assertTrue(newDelRequest2 instanceof EmailPacketDeleteRequest); EmailPacketDeleteRequest newEmailPacketDelRequest2 = (EmailPacketDeleteRequest)newDelRequest2; assertEquals(newEmailPacketDelRequest2.getDhtKey(), emailPacket2.getDhtKey()); assertEquals(newEmailPacketDelRequest2.getAuthorization(), delAuthKey2);
indexPacket.put(emailPacket1); long expirationTime1 = cutoffTime - 3*1000; setStoreTime(indexPacket, emailPacket1.getDhtKey(), expirationTime1); assertEquals(1, indexPacket.getNumEntries()); folder.store(indexPacket); setStoreTime(indexPacket, emailPacket2.getDhtKey(), expirationTime2); assertEquals(2, indexPacket.getNumEntries()); folder.store(indexPacket);
send(emailPacket, hops, minDelay, maxDelay, relayRedundancy); indexPacket.put(emailPacket); metadata.addPacketInfo(recipientDest, emailPacket.getDhtKey(), emailPacket.getDeleteVerificationHash());