in src/VerifyLedgerMetadata.ts [106:161]
export async function verifyDocumentMetadataWithUserData(
ledgerName: string,
qldbClient: QLDB,
userLedgerMetadata: LedgerMetadata
): Promise<boolean> {
const fcnName = "[VerifyDocumentMetadata verifyDocumentMetadataWithUserData]";
try {
logger.debug(`${fcnName} Verifying the document with Id = ${userLedgerMetadata.DocumentId}, in ledger = ${ledgerName}.`);
logger.debug(`${fcnName} User Ledger Metadata: ${JSON.stringify(userLedgerMetadata)}`)
const userRevisionHash: Base64EncodedString = userLedgerMetadata.RevisionHash;
const userRevisionId: string = userLedgerMetadata.DocumentId;
const userBlockAddress: ValueHolder = userLedgerMetadata.BlockAddress;
//const userProof: ValueHolder = userLedgerMetadata.Proof;
const userDigestBase64: Base64EncodedString = userLedgerMetadata.LedgerDigest.Digest;
const revisionResponse: GetRevisionResponse = await getRevision(
ledgerName,
userLedgerMetadata.DocumentId,
userLedgerMetadata.BlockAddress,
userLedgerMetadata.LedgerDigest.DigestTipAddress,
qldbClient
);
logger.debug(`${fcnName} Got revision: ${JSON.stringify(revisionResponse)}`)
const revision: dom.Value = dom.load(revisionResponse.Revision.IonText);
const blockAddress: ValueHolder = blockAddressToValueHolder(revision);
const revisionHash: Uint8Array = getBlobValue(revision, "hash");
const revisionId: string = revision.get("metadata", "id").stringValue();
const proof: ValueHolder = revisionResponse.Proof;
if ((userRevisionHash) !== toBase64(<Uint8Array>revisionHash)) {
throw new Error(`${fcnName} Revision hashes do not match. Received from user: ${userRevisionHash}; Received from Ledger: ${toBase64(<Uint8Array>revisionHash)}`)
}
logger.debug(`${fcnName} Revision hash match with the ledger.`)
logger.debug(`${fcnName} Got back the proof: ${valueHolderToString(proof)}.`);
let userRevisionHashBinary: Uint8Array = Buffer.from(userRevisionHash, 'base64');
const verifiedDocument: boolean = verifyDocumentMetadata(userRevisionHashBinary, userDigestBase64, proof);
if (!verifiedDocument) {
throw new Error(`${fcnName} Document revision is not verified.`);
} else {
logger.debug(`${fcnName} Success! The document is verified.`);
}
logger.debug(`${fcnName} Finished verifying document with Id = ${userLedgerMetadata.DocumentId}, in ledger = ${ledgerName}.`);
return verifiedDocument
} catch (err) {
throw `${fcnName} ${err} `
}
}