public byte[] encrypt(String plainText) throws EncryptionError { return encrypt(plainText.getBytes(Ut.utf8)); }
@Override public byte[] encrypt(final byte[] bytes) throws EncryptionError { if (inUse.getAndSet(true)) { // our copy is in use synchronized (copyMutex) { if (copy == null) copy = new PublicKey(pack()); } return copy.encrypt(bytes); } else { try { return publicKey.encrypt(bytes); } finally { inUse.set(false); } } }
private void createSessionKey() throws EncryptionError { if (sessionKey == null) { sessionKey = new SymmetricKey(); Binder data = Binder.fromKeysValues( "sk", sessionKey.pack() ); encryptedAnswer = publicKey.encrypt(Boss.pack(data)); } }
@Test public void concurrencyTest() throws Exception { PrivateKey privateKey = new PrivateKey(2048); PublicKey publicKey = privateKey.getPublicKey(); ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(128); AtomicInteger errorsCount = new AtomicInteger(0); for (int i = 0; i < 10000; ++i) { executorService.submit(() -> { try { byte[] data = Bytes.random(128).getData(); byte[] encrypted = publicKey.encrypt(data); byte[] decrypted = privateKey.decrypt(encrypted); assertArrayEquals(data, decrypted); } catch (Exception e) { e.printStackTrace(); errorsCount.incrementAndGet(); } }); } executorService.shutdown(); executorService.awaitTermination(120, TimeUnit.SECONDS); assertEquals(0, errorsCount.get()); }
List data = Arrays.asList(session.localNonce, session.remoteNonce); byte[] packed = Boss.pack(data); byte[] encrypted = new PublicKey(session.remoteNodeInfo.getPublicKey().pack()).encrypt(packed); byte[] sign = new PrivateKey(ownPrivateKey.pack()).sign(encrypted, HashType.SHA512);
private Object onHello(Binder params) throws IOException { // Checking protocol and version if (!params.getStringOrThrow("protocol").equals("bitrusted")) throw new IOException("unsupported protocol, needs bitrusted'"); if (params.getIntOrThrow("version") > MY_VERSION) throw new IOException("unsupported protocol version, needs <= " + MY_VERSION); // checking parameters byte[] nonce = params.getBinaryOrThrow("nonce"); setRemoteKey(params.getBinaryOrThrow("public_key")); remoteSessionKey = new SymmetricKey(params.getBinaryOrThrow("session_key")); // We intentionally do not use capsule here to improve network speed byte[] result = Boss.pack(Binder.fromKeysValues( "session_key", mySessionKey.pack(), "nonce", nonce) ); result = remoteKey.encrypt(result); byte[] signature = myKey.sign(result, HashType.SHA256); ready.fire(null); // log.d(toString() + " returning hello"); return Binder.fromKeysValues( "data", result, "signature", signature, "public_key", myKey.getPublicKey().pack() ); }
protected void sendDataGarbage(NodeInfo myNodeInfo, NodeInfo destination, UDPAdapter udpAdapter, DatagramSocket socket) throws Exception { byte[] data = new PublicKey(destination.getPublicKey().pack()).encrypt(Do.randomBytes(64)); byte[] crc32 = new Crc32().digest(data); byte[] payload = new byte[data.length + crc32.length]; System.arraycopy(data, 0, payload, 0, data.length); System.arraycopy(crc32, 0, payload, data.length, crc32.length); UDPAdapter.Packet packet = udpAdapter.createTestPacket( new Random().nextInt(Integer.MAX_VALUE), myNodeInfo.getNumber(), destination.getNumber(), UDPAdapter.PacketTypes.DATA, payload); sendBlock(packet, socket, destination); }
protected void sendWelcome(NodeInfo myNodeInfo, NodeInfo destination, UDPAdapter udpAdapter, DatagramSocket socket) throws Exception { byte[] payload = new PublicKey(destination.getPublicKey().pack()).encrypt(Do.randomBytes(64)); UDPAdapter.Packet packet = udpAdapter.createTestPacket( new Random().nextInt(Integer.MAX_VALUE), myNodeInfo.getNumber(), destination.getNumber(), UDPAdapter.PacketTypes.WELCOME, payload); sendBlock(packet, socket, destination); }
@Test public void testKeys() throws Exception { // Test vectors are for key #1 PrivateKey key = (PrivateKey) TestKeys.privateKey(1); byte[] encrypted = Bytes.fromBase64(encrypted64).toArray(); byte[] decrypted = key.decrypt(encrypted); assertEquals(plainText, new String(decrypted)); PublicKey publicKey = key.getPublicKey(); byte[] encrypted2 = publicKey.encrypt(plainText); assertEquals(plainText, new String(key.decrypt(encrypted2))); publicKey = new PublicKey(Do.decodeBase64(publicKey64)); encrypted2 = publicKey.encrypt(plainText); assertEquals(plainText, new String(key.decrypt(encrypted2))); }
/** * This is first step of creation and installation of the session. * @param session is {@link Session} in which sending is. */ private void sendHello(Session session) { try { report(logLabel, () -> "send hello to " + session.remoteNodeInfo.getNumber(), VerboseLevel.BASE); byte[] helloNonce = Do.randomBytes(64); Packet packet = new Packet(getNextPacketId(), myNodeInfo.getNumber(), session.remoteNodeInfo.getNumber(), PacketTypes.HELLO, new PublicKey(session.remoteNodeInfo.getPublicKey().pack()).encrypt(helloNonce)); sendPacket(session.remoteNodeInfo, packet); session.addPacketToRetransmitMap(packet.packetId, packet, helloNonce); } catch (EncryptionError e) { callErrorCallbacks("(sendHello) EncryptionError: " + e); } }
/** * Someone who sent {@link PacketTypes#HELLO} typed {@link Packet}, * send us new KEY_REQ typed {@link Packet} - if all is ok we send session keys to. * SESSION's payload is more than 512 bytes, so used two parts here. * From now we ready to data exchange. * @param sessionReader is {@link SessionReader} in which sending is. */ private void sendSessionKey(SessionReader sessionReader) throws EncryptionError { report(logLabel, ()->"send session_key to "+sessionReader.remoteNodeInfo.getNumber(), VerboseLevel.BASE); List data = Arrays.asList(sessionReader.sessionKey.getKey(), sessionReader.remoteNonce); byte[] packed = Boss.pack(data); byte[] encrypted = new PublicKey(sessionReader.remoteNodeInfo.getPublicKey().pack()).encrypt(packed); byte[] sign = new PrivateKey(ownPrivateKey.pack()).sign(encrypted, HashType.SHA512); Packet packet1 = new Packet(getNextPacketId(), myNodeInfo.getNumber(), sessionReader.remoteNodeInfo.getNumber(), PacketTypes.SESSION_PART1, encrypted); Packet packet2 = new Packet(getNextPacketId(), myNodeInfo.getNumber(), sessionReader.remoteNodeInfo.getNumber(), PacketTypes.SESSION_PART2, sign); sendPacket(sessionReader.remoteNodeInfo, packet1); sendPacket(sessionReader.remoteNodeInfo, packet2); sessionReader.addPacketToRetransmitMap(packet1.packetId, packet1, encrypted); sessionReader.addPacketToRetransmitMap(packet2.packetId, packet2, sign); }