/** * Sign the data with a given key. * * @param key is {@link PrivateKey} to sign with * @param data to be sign with key * * @return binary signature */ static public byte[] sign(PrivateKey key, byte[] data) { return sign(key, data, true); }
public byte[] sealAsV2() { byte[] theContract = Boss.pack( BossBiMapper.serialize( Binder.of( "contract", this, "revoking", revokingItems.stream() .map(i -> i.getLastSealedBinary()) .collect(Collectors.toList()), "new", newItems.stream() .map(i -> i.seal()) .collect(Collectors.toList()) ) ) ); //redundand code. already executed here newItems.stream().map(i -> i.seal()) //newItems.forEach(c -> c.seal()); Binder result = Binder.of( "type", "unicapsule", "version", 2, "data", theContract ); List<byte[]> signatures = new ArrayList<>(); keysToSignWith.forEach(key -> { signatures.add(ExtendedSignature.sign(key, theContract)); }); result.put("signatures", signatures); setOwnBinary(result); return sealedBinary; }
/** * Add signature to sealed (before) contract. Do not deserializing or changing contract bytes, * but will change sealed and hashId. * * Useful if you got contracts from third-party (another computer) and need to sign it. * F.e. contracts that should be sign with two persons. * * @param privateKeys - key to sign contract will with */ public void addSignatureToSeal(Set<PrivateKey> privateKeys) { if (sealedBinary == null) throw new IllegalStateException("failed to add signature: sealed binary does not exist"); keysToSignWith.addAll(privateKeys); Binder data = Boss.unpack(sealedBinary); byte[] contractBytes = data.getBinaryOrThrow("data"); for (PrivateKey key : privateKeys) { byte[] signature = ExtendedSignature.sign(key, contractBytes); addSignatureToSeal(signature,key.getPublicKey()); } }
@Test public void parallelExecutionSign() throws Exception { ExecutorService single = Executors.newSingleThreadExecutor(); ExecutorService multiple = Executors.newCachedThreadPool(); byte[] data = "Hello world".getBytes(); PrivateKey k = new PrivateKey(2048); // warm up for(int i=0; i<200; i++) ExtendedSignature.sign(k, data); double t1 = parallelize(single, 1, ()-> { for(int i=0; i<100; i++) ExtendedSignature.sign(k, data); }); System.out.println(t1); double t2 = parallelize(multiple, 4, ()-> { for(int i=0; i<100; i++) ExtendedSignature.sign(k, data); }); System.out.println(t2); assertThat(Math.abs(t1-t2), is(lessThan(0.15))); }
@Test public void concurrencyTest() throws Exception { PrivateKey privateKey = new PrivateKey(2048); PublicKey publicKey = privateKey.getPublicKey(); ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(256); AtomicInteger errorsCount = new AtomicInteger(0); for (int i = 0; i < 10000; ++i) { executorService.submit(() -> { try { byte[] data = Bytes.random(128).getData(); byte[] signature = ExtendedSignature.sign(privateKey,data); if(ExtendedSignature.verify(publicKey,signature,data) == null) { errorsCount.incrementAndGet(); } } catch (Exception e) { e.printStackTrace(); errorsCount.incrementAndGet(); } }); } executorService.shutdown(); executorService.awaitTermination(120, TimeUnit.SECONDS); assertEquals(0, errorsCount.get()); } }
@Test public void parallelExecutionVerify() throws Exception { ExecutorService single = Executors.newSingleThreadExecutor(); ExecutorService multiple = Executors.newCachedThreadPool(); byte[] data = "Hello world".getBytes(); PrivateKey k = new PrivateKey(2048); PublicKey key = k.getPublicKey(); byte[] signature = ExtendedSignature.sign(k, data); // warm up for(int i=0; i<200; i++) ExtendedSignature.sign(k, data); double t1 = parallelize(single, 1, ()-> { for(int i=0; i<1000; i++) ExtendedSignature.verify(key, signature, data); }); System.out.println(t1); double t2 = parallelize(multiple, 4, ()-> { for(int i=0; i<1000; i++) ExtendedSignature.verify(key, signature, data); }); System.out.println(t2); assertThat(Math.abs(t1-t2), is(lessThan(0.15))); }
@Test public void sign() throws Exception { byte[] data = "Hello world".getBytes(); PrivateKey k = TestKeys.privateKey(3); byte [] signature = ExtendedSignature.sign(k, data); PublicKey pubKey = k.getPublicKey(); ExtendedSignature es = ExtendedSignature.verify(pubKey, signature, data); assertNotNull(es); assertAlmostSame(es.getCreatedAt(), ZonedDateTime.now()); assertEquals(ExtendedSignature.keyId(k), ExtendedSignature.keyId(pubKey)); assertEquals(ExtendedSignature.keyId(k), ExtendedSignature.extractKeyId(signature)); }
@Ignore("removed functionality") @Test public void extractPublicKeyNull() throws Exception { byte[] data = "Hello world".getBytes(); PrivateKey k = TestKeys.privateKey(3); byte [] signature = ExtendedSignature.sign(k, data); PublicKey pubKey = k.getPublicKey(); ExtendedSignature es = ExtendedSignature.verify(pubKey, signature, data); assertNotNull(es); assertAlmostSame(es.getCreatedAt(), ZonedDateTime.now()); assertEquals(ExtendedSignature.keyId(k), ExtendedSignature.keyId(pubKey)); assertEquals(ExtendedSignature.keyId(k), ExtendedSignature.extractKeyId(signature)); assertEquals(pubKey, es.getPublicKey()); }
@Test public void extractPublicKey() throws Exception { byte[] data = "Hello world".getBytes(); PrivateKey k = TestKeys.privateKey(3); byte [] signature = ExtendedSignature.sign(k, data); PublicKey pubKey = k.getPublicKey(); ExtendedSignature es = ExtendedSignature.verify(pubKey, signature, data); assertNotNull(es); assertAlmostSame(es.getCreatedAt(), ZonedDateTime.now()); assertEquals(ExtendedSignature.keyId(k), ExtendedSignature.keyId(pubKey)); assertEquals(ExtendedSignature.keyId(k), ExtendedSignature.extractKeyId(signature)); assertNotNull(es.getPublicKey()); assertEquals(pubKey, es.getPublicKey()); }