use of org.spongycastle.crypto.signers.PSSSigner in project universa by UniversaBlockchain.
the class RSAOAEPPublicKey method checkSignature.
/**
* {@inheritDoc}
*/
@NonNull
@Override
public boolean checkSignature(InputStream input, byte[] signature, HashType hashType, int saltLength) throws IllegalStateException, IOException {
if (state == null) {
throw new IllegalStateException();
} else {
final Digest primaryDigest = hashType.makeDigest();
if (saltLength == MAX_SALT_LENGTH) {
saltLength = getMaxSaltLength(getBitStrength(), primaryDigest.getDigestSize());
}
if (saltLength < 0) {
throw new RuntimeException(String.format("Incorrect salt length %s", saltLength));
}
final Signer signatureChecker = new PSSSigner(RSAEngineFactory.make(), primaryDigest, state.mgf1HashType.makeDigest(), saltLength);
signatureChecker.init(false, new ParametersWithRandom(state.keyParameters, state.rng));
boolean done = false;
while (!done) {
int availableBytes = input.available();
if (availableBytes <= 0) {
done = true;
} else {
byte[] buffer = new byte[availableBytes];
int howManyBytesRead = input.read(buffer);
if (howManyBytesRead <= 0) {
done = true;
} else {
signatureChecker.update(buffer, 0, howManyBytesRead);
}
}
}
return signatureChecker.verifySignature(signature);
}
}
use of org.spongycastle.crypto.signers.PSSSigner in project universa by UniversaBlockchain.
the class RSAOAEPPrivateKey method sign.
/**
* {@inheritDoc}
* <p>
* Signature is created using RSA-PSS as described in PKCS# 1 v 2.1.
*/
@Override
public byte[] sign(InputStream input, HashType hashType, @Nullable byte[] salt) throws IllegalStateException, IOException {
if (state == null) {
throw new IllegalStateException();
} else {
final Digest primaryDigest = hashType.makeDigest();
final PSSSigner signer;
if (salt == null) {
// Use maximum possible salt
signer = new PSSSigner(RSAEngineFactory.make(), primaryDigest, state.mgf1HashType.makeDigest(), getMaxSaltLength(getBitStrength(), primaryDigest.getDigestSize()));
} else {
// Use some specific salt
signer = new PSSSigner(RSAEngineFactory.make(), primaryDigest, state.mgf1HashType.makeDigest(), salt);
}
signer.init(true, new ParametersWithRandom(state.keyParameters, state.rng));
boolean done = false;
while (!done) {
int availableBytes = input.available();
if (availableBytes <= 0) {
done = true;
} else {
byte[] buffer = new byte[availableBytes];
int howManyBytesRead = input.read(buffer);
if (howManyBytesRead <= 0) {
done = true;
} else {
signer.update(buffer, 0, howManyBytesRead);
}
}
}
try {
return signer.generateSignature();
} catch (CryptoException e) {
throw new IOException(String.format("Cannot sign data: %s", e.toString()));
}
}
}
Aggregations