use of com.amazonaws.services.qldb.model.ValueHolder in project amazon-qldb-dmv-sample-java by aws-samples.
the class GetBlock method getBlockWithProof.
public static GetBlockResult getBlockWithProof(String ledgerName, BlockAddress blockAddress, BlockAddress tipBlockAddress) {
log.info("Let's get the block for block address {}, digest tip address {}, for the ledger named {}.", blockAddress, tipBlockAddress, ledgerName);
try {
GetBlockRequest request = new GetBlockRequest().withName(ledgerName).withBlockAddress(new ValueHolder().withIonText(Constants.MAPPER.writeValueAsIonValue(blockAddress).toString())).withDigestTipAddress(new ValueHolder().withIonText(Constants.MAPPER.writeValueAsIonValue(tipBlockAddress).toString()));
GetBlockResult result = client.getBlock(request);
log.info("Success. GetBlock: {}.", QldbStringUtils.toUnredactedString(result));
return result;
} catch (IOException ioe) {
throw new IllegalStateException(ioe);
}
}
use of com.amazonaws.services.qldb.model.ValueHolder in project amazon-qldb-dmv-sample-java by aws-samples.
the class GetBlock method getBlock.
public static GetBlockResult getBlock(String ledgerName, BlockAddress blockAddress) {
log.info("Let's get the block for block address {} of the ledger named {}.", blockAddress, ledgerName);
try {
GetBlockRequest request = new GetBlockRequest().withName(ledgerName).withBlockAddress(new ValueHolder().withIonText(Constants.MAPPER.writeValueAsIonValue(blockAddress).toString()));
GetBlockResult result = client.getBlock(request);
log.info("Success. GetBlock: {}.", QldbStringUtils.toUnredactedString(result));
return result;
} catch (IOException ioe) {
throw new IllegalStateException(ioe);
}
}
use of com.amazonaws.services.qldb.model.ValueHolder in project amazon-qldb-dmv-sample-java by aws-samples.
the class GetRevision method verifyRegistration.
/**
* Verify each version of the registration for the given VIN.
*
* @param driver
* A QLDB driver.
* @param ledgerName
* The ledger to get digest from.
* @param vin
* VIN to query the revision history of a specific registration with.
* @throws Exception if failed to verify digests.
* @throws AssertionError if document revision verification failed.
*/
public static void verifyRegistration(final QldbDriver driver, final String ledgerName, final String vin) throws Exception {
log.info(String.format("Let's verify the registration with VIN=%s, in ledger=%s.", vin, ledgerName));
try {
log.info("First, let's get a digest.");
GetDigestResult digestResult = GetDigest.getDigest(ledgerName);
ValueHolder digestTipAddress = digestResult.getDigestTipAddress();
byte[] digestBytes = Verifier.convertByteBufferToByteArray(digestResult.getDigest());
log.info("Got a ledger digest. Digest end address={}, digest={}.", QldbStringUtils.toUnredactedString(digestTipAddress), Verifier.toBase64(digestBytes));
log.info(String.format("Next, let's query the registration with VIN=%s. " + "Then we can verify each version of the registration.", vin));
List<IonStruct> documentsWithMetadataList = new ArrayList<>();
driver.execute(txn -> {
documentsWithMetadataList.addAll(queryRegistrationsByVin(txn, vin));
});
log.info("Registrations queried successfully!");
log.info(String.format("Found %s revisions of the registration with VIN=%s.", documentsWithMetadataList.size(), vin));
for (IonStruct ionStruct : documentsWithMetadataList) {
QldbRevision document = QldbRevision.fromIon(ionStruct);
log.info(String.format("Let's verify the document: %s", document));
log.info("Let's get a proof for the document.");
GetRevisionResult proofResult = getRevision(ledgerName, document.getMetadata().getId(), digestTipAddress, document.getBlockAddress());
final IonValue proof = Constants.MAPPER.writeValueAsIonValue(proofResult.getProof());
final IonReader reader = IonReaderBuilder.standard().build(proof);
reader.next();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
IonWriter writer = SYSTEM.newBinaryWriter(baos);
writer.writeValue(reader);
writer.close();
baos.flush();
baos.close();
byte[] byteProof = baos.toByteArray();
log.info(String.format("Got back a proof: %s", Verifier.toBase64(byteProof)));
boolean verified = Verifier.verify(document.getHash(), digestBytes, proofResult.getProof().getIonText());
if (!verified) {
throw new AssertionError("Document revision is not verified!");
} else {
log.info("Success! The document is verified");
}
byte[] alteredDigest = Verifier.flipRandomBit(digestBytes);
log.info(String.format("Flipping one bit in the digest and assert that the document is NOT verified. " + "The altered digest is: %s", Verifier.toBase64(alteredDigest)));
verified = Verifier.verify(document.getHash(), alteredDigest, proofResult.getProof().getIonText());
if (verified) {
throw new AssertionError("Expected document to not be verified against altered digest.");
} else {
log.info("Success! As expected flipping a bit in the digest causes verification to fail.");
}
byte[] alteredDocumentHash = Verifier.flipRandomBit(document.getHash());
log.info(String.format("Flipping one bit in the document's hash and assert that it is NOT verified. " + "The altered document hash is: %s.", Verifier.toBase64(alteredDocumentHash)));
verified = Verifier.verify(alteredDocumentHash, digestBytes, proofResult.getProof().getIonText());
if (verified) {
throw new AssertionError("Expected altered document hash to not be verified against digest.");
} else {
log.info("Success! As expected flipping a bit in the document hash causes verification to fail.");
}
}
} catch (Exception e) {
log.error("Failed to verify digests.", e);
throw e;
}
log.info(String.format("Finished verifying the registration with VIN=%s in ledger=%s.", vin, ledgerName));
}
use of com.amazonaws.services.qldb.model.ValueHolder in project amazon-qldb-dmv-sample-java by aws-samples.
the class GetBlock method verifyBlock.
public static void verifyBlock(String ledgerName, BlockAddress blockAddress) throws Exception {
log.info("Lets verify blocks for ledger with name={}.", ledgerName);
try {
log.info("First, let's get a digest");
GetDigestResult digestResult = GetDigest.getDigest(ledgerName);
BlockAddress tipBlockAddress = Constants.MAPPER.readValue(digestResult.getDigestTipAddress().getIonText(), BlockAddress.class);
ValueHolder digestTipAddress = digestResult.getDigestTipAddress();
byte[] digestBytes = Verifier.convertByteBufferToByteArray(digestResult.getDigest());
log.info("Got a ledger digest. Digest end address={}, digest={}.", QldbStringUtils.toUnredactedString(digestTipAddress), Verifier.toBase64(digestBytes));
GetBlockResult getBlockResult = getBlockWithProof(ledgerName, blockAddress, tipBlockAddress);
JournalBlock block = Constants.MAPPER.readValue(getBlockResult.getBlock().getIonText(), JournalBlock.class);
boolean verified = Verifier.verify(block.getBlockHash(), digestBytes, getBlockResult.getProof().getIonText());
if (!verified) {
throw new AssertionError("Block is not verified!");
} else {
log.info("Success! The block is verified.");
}
byte[] alteredDigest = Verifier.flipRandomBit(digestBytes);
log.info("Let's try flipping one bit in the digest and assert that the block is NOT verified. " + "The altered digest is: {}.", Verifier.toBase64(alteredDigest));
verified = Verifier.verify(block.getBlockHash(), alteredDigest, getBlockResult.getProof().getIonText());
if (verified) {
throw new AssertionError("Expected block to not be verified against altered digest.");
} else {
log.info("Success! As expected flipping a bit in the digest causes verification to fail.");
}
byte[] alteredBlockHash = Verifier.flipRandomBit(block.getBlockHash());
log.info("Let's try flipping one bit in the block's hash and assert that the block is NOT " + "verified. The altered block hash is: {}.", Verifier.toBase64(alteredBlockHash));
verified = Verifier.verify(alteredBlockHash, digestBytes, getBlockResult.getProof().getIonText());
if (verified) {
throw new AssertionError("Expected altered block hash to not be verified against digest.");
} else {
log.info("Success! As expected flipping a bit in the block hash causes verification to fail.");
}
} catch (Exception e) {
log.error("Failed to verify blocks in the ledger with name={}.", ledgerName, e);
throw e;
}
}
Aggregations