Я работаю с 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
пусто.
Есть ли способ, как преодолеть эту проблему?