Hyperledger Java SDK проверяет пустые массивы ProposalResponse - PullRequest
0 голосов
/ 04 сентября 2018

Я работаю с Hyperledger версии 1.2 и Java SDK в версии 1.2.0. После получения ProposalResponse я получаю сообщение об ошибке, поскольку его невозможно проверить:

Collection<ProposalResponse> res = channel.sendTransactionProposal(tpr);

В классе org.hyperledger.fabric.sdk.security.CryptoPrimitives я вижу, что метод verify должен проверить, являются ли массивы нулевыми, и если да, вернуть false:

@Override
public boolean verify(byte[] pemCertificate, String signatureAlgorithm, byte[] signature, byte[] plainText) throws CryptoException {
    boolean isVerified = false;

    if (plainText == null || signature == null || pemCertificate == null) {
        return false;
    }

    if (config.extraLogLevel(10)) {
        if (null != diagnosticFileDumper) {
            StringBuilder sb = new StringBuilder(10000);
            sb.append("plaintext in hex: ")
                    .append(DatatypeConverter.printHexBinary(plainText))
                    .append("\n")
                    .append("signature in hex: " + DatatypeConverter.printHexBinary(signature))
                    .append("\n")
                    .append("PEM cert in hex: " + DatatypeConverter.printHexBinary(pemCertificate));
            logger.trace("verify :  " +
                    diagnosticFileDumper.createDiagnosticFile(sb.toString()));
        }
    }

    try {

        X509Certificate certificate = getX509Certificate(pemCertificate);

        if (certificate != null) {

            isVerified = validateCertificate(certificate);
            if (isVerified) { // only proceed if cert is trusted

                Signature sig = Signature.getInstance(signatureAlgorithm);
                sig.initVerify(certificate);
                sig.update(plainText);
                isVerified = sig.verify(signature);
            }
        }
    } catch (InvalidKeyException e) {
        CryptoException ex = new CryptoException("Cannot verify signature. Error is: "
                + e.getMessage() + "\r\nCertificate: "
                + DatatypeConverter.printHexBinary(pemCertificate), e);
        logger.error(ex.getMessage(), ex);
        throw ex;
    } catch (NoSuchAlgorithmException | SignatureException e) {
        CryptoException ex = new CryptoException("Cannot verify. Signature algorithm is invalid. Error is: " + e.getMessage(), e);
        logger.error(ex.getMessage(), ex);
        throw ex;
    }

    return isVerified;
} // verify

И это всегда будет давать неправильный результат, потому что первое условие никогда не будет выполнено, потому что входные байтовые массивы из узла Hyperledger не null, а пустые. В этом случае метод проверки продолжится и отправит исключение во время X509Certificate certificate = getX509Certificate(pemCertificate);, поскольку pemCertificate пусто.

Есть ли способ, как преодолеть эту проблему?

...