/** * Writes the Prefix, Version, Type, and Packet Id fields of a Communication Packet to * an {@link OutputStream}. * @param outputStream */ protected void writeHeader(OutputStream outputStream) throws IOException { outputStream.write(PACKET_PREFIX); outputStream.write((byte)getPacketTypeCode()); outputStream.write(getProtocolVersion()); outputStream.write(packetId.toByteArray()); }
@Override public byte[] toByteArray() { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { writeHeader(outputStream); outputStream.write(dhtKey.toByteArray()); outputStream.write(authorization.toByteArray()); } catch (IOException e) { log.error("Can't write to ByteArrayOutputStream.", e); } return outputStream.toByteArray(); }
@Override public byte[] toByteArray() { ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); DataOutputStream dataStream = new DataOutputStream(byteStream); try { writeHeader(dataStream); dataStream.writeInt(entries.size()); for (DeletionRecord entry: entries) { dataStream.write(entry.dhtKey.toByteArray()); dataStream.write(entry.delAuthorization.toByteArray()); dataStream.writeInt((int)(entry.storeTime/1000L)); // store as seconds } } catch (IOException e) { log.error("Can't write to ByteArrayOutputStream/DataOutputStream.", e); } return byteStream.toByteArray(); }
@Override public byte[] toByteArray() { ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); DataOutputStream dataStream = new DataOutputStream(byteStream); try { writeHeader(dataStream); emailDestHash.writeBytes(dataStream); dataStream.writeShort(entries.size()); for (Entry<Hash, UniqueId> entry: entries.entrySet()) { dataStream.write(entry.getKey().toByteArray()); dataStream.write(entry.getValue().toByteArray()); } } catch (DataFormatException e) { log.error("Invalid format for email destination.", e); } catch (IOException e) { log.error("Can't write to ByteArrayOutputStream.", e); } return byteStream.toByteArray(); }
public static boolean isDeleteAuthorizationValid(Hash verificationHash, UniqueId delAuthorization) { Hash expectedVerificationHash = SHA256Generator.getInstance().calculateHash(delAuthorization.toByteArray()); boolean valid = expectedVerificationHash.equals(verificationHash); return valid; }
/** * 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(); }
@Test public void testDeleteVerificationHash() { for (int i=0; i<encryptedPackets.length; i++) { EncryptedEmailPacket packet = encryptedPackets[i]; Hash expectedHash = SHA256Generator.getInstance().calculateHash(plaintextPacket.getDeleteAuthorization().toByteArray()); assertEquals("The delete authorization key does not hash to the delete verification hash!", expectedHash, packet.getDeleteVerificationHash()); } }
/** 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()); }