export async function verifyDocumentMetadataWithUserData()

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} `
    }
}