what-the-bank/sources/org/bouncycastle/jcajce/provider/asymmetric/rsa/PSSSignatureSpi.java

338 lines
14 KiB
Java
Raw Permalink Normal View History

2024-07-27 18:17:47 +07:00
package org.bouncycastle.jcajce.provider.asymmetric.rsa;
import java.io.ByteArrayOutputStream;
import java.security.AlgorithmParameters;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.SignatureException;
import java.security.SignatureSpi;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.MGF1ParameterSpec;
import java.security.spec.PSSParameterSpec;
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import org.bouncycastle.crypto.AsymmetricBlockCipher;
import org.bouncycastle.crypto.CryptoException;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.engines.RSABlindedEngine;
import org.bouncycastle.crypto.params.ParametersWithRandom;
import org.bouncycastle.crypto.signers.PSSSigner;
import org.bouncycastle.jcajce.provider.util.DigestFactory;
import org.bouncycastle.jcajce.util.BCJcaJceHelper;
import org.bouncycastle.jcajce.util.JcaJceHelper;
import org.bouncycastle.pqc.jcajce.spec.McElieceCCA2KeyGenParameterSpec;
import org.bouncycastle.pqc.jcajce.spec.SPHINCS256KeyGenParameterSpec;
/* loaded from: classes6.dex */
public class PSSSignatureSpi extends SignatureSpi {
private Digest contentDigest;
private AlgorithmParameters engineParams;
private final JcaJceHelper helper;
private boolean isRaw;
private Digest mgfDigest;
private PSSParameterSpec originalSpec;
private PSSParameterSpec paramSpec;
private PSSSigner pss;
private int saltLength;
private AsymmetricBlockCipher signer;
private byte trailer;
@Override // java.security.SignatureSpi
protected boolean engineVerify(byte[] bArr) throws SignatureException {
return this.pss.verifySignature(bArr);
}
@Override // java.security.SignatureSpi
protected void engineUpdate(byte[] bArr, int i, int i2) throws SignatureException {
this.pss.update(bArr, i, i2);
}
@Override // java.security.SignatureSpi
protected void engineUpdate(byte b) throws SignatureException {
this.pss.update(b);
}
@Override // java.security.SignatureSpi
protected byte[] engineSign() throws SignatureException {
try {
return this.pss.generateSignature();
} catch (CryptoException e) {
throw new SignatureException(e.getMessage());
}
}
@Override // java.security.SignatureSpi
protected void engineSetParameter(AlgorithmParameterSpec algorithmParameterSpec) throws InvalidAlgorithmParameterException {
if (!(algorithmParameterSpec instanceof PSSParameterSpec)) {
throw new InvalidAlgorithmParameterException("Only PSSParameterSpec supported");
}
PSSParameterSpec pSSParameterSpec = (PSSParameterSpec) algorithmParameterSpec;
PSSParameterSpec pSSParameterSpec2 = this.originalSpec;
if (pSSParameterSpec2 != null && !DigestFactory.isSameDigest(pSSParameterSpec2.getDigestAlgorithm(), pSSParameterSpec.getDigestAlgorithm())) {
StringBuilder sb = new StringBuilder("parameter must be using ");
sb.append(this.originalSpec.getDigestAlgorithm());
throw new InvalidAlgorithmParameterException(sb.toString());
}
if (!pSSParameterSpec.getMGFAlgorithm().equalsIgnoreCase("MGF1") && !pSSParameterSpec.getMGFAlgorithm().equals(PKCSObjectIdentifiers.id_mgf1.getId())) {
throw new InvalidAlgorithmParameterException("unknown mask generation function specified");
}
if (!(pSSParameterSpec.getMGFParameters() instanceof MGF1ParameterSpec)) {
throw new InvalidAlgorithmParameterException("unknown MGF parameters");
}
MGF1ParameterSpec mGF1ParameterSpec = (MGF1ParameterSpec) pSSParameterSpec.getMGFParameters();
if (!DigestFactory.isSameDigest(mGF1ParameterSpec.getDigestAlgorithm(), pSSParameterSpec.getDigestAlgorithm())) {
throw new InvalidAlgorithmParameterException("digest algorithm for MGF should be the same as for PSS parameters.");
}
Digest digest = DigestFactory.getDigest(mGF1ParameterSpec.getDigestAlgorithm());
if (digest == null) {
StringBuilder sb2 = new StringBuilder("no match on MGF digest algorithm: ");
sb2.append(mGF1ParameterSpec.getDigestAlgorithm());
throw new InvalidAlgorithmParameterException(sb2.toString());
}
this.engineParams = null;
this.paramSpec = pSSParameterSpec;
this.mgfDigest = digest;
this.saltLength = pSSParameterSpec.getSaltLength();
this.trailer = getTrailer(this.paramSpec.getTrailerField());
setupContentDigest();
}
@Override // java.security.SignatureSpi
protected void engineSetParameter(String str, Object obj) {
throw new UnsupportedOperationException("engineSetParameter unsupported");
}
/* JADX INFO: Access modifiers changed from: package-private */
/* loaded from: classes6.dex */
public class NullPssDigest implements Digest {
private Digest baseDigest;
final PSSSignatureSpi this$0;
private ByteArrayOutputStream bOut = new ByteArrayOutputStream();
private boolean oddTime = true;
public int getByteLength() {
return 0;
}
@Override // org.bouncycastle.crypto.Digest
public void update(byte[] bArr, int i, int i2) {
this.bOut.write(bArr, i, i2);
}
@Override // org.bouncycastle.crypto.Digest
public void update(byte b) {
this.bOut.write(b);
}
@Override // org.bouncycastle.crypto.Digest
public void reset() {
this.bOut.reset();
this.baseDigest.reset();
}
@Override // org.bouncycastle.crypto.Digest
public int getDigestSize() {
return this.baseDigest.getDigestSize();
}
@Override // org.bouncycastle.crypto.Digest
public String getAlgorithmName() {
return "NULL";
}
@Override // org.bouncycastle.crypto.Digest
public int doFinal(byte[] bArr, int i) {
byte[] byteArray = this.bOut.toByteArray();
if (this.oddTime) {
System.arraycopy(byteArray, 0, bArr, i, byteArray.length);
} else {
this.baseDigest.update(byteArray, 0, byteArray.length);
this.baseDigest.doFinal(bArr, i);
}
reset();
this.oddTime = !this.oddTime;
return byteArray.length;
}
public NullPssDigest(PSSSignatureSpi pSSSignatureSpi, Digest digest) {
this.this$0 = pSSSignatureSpi;
this.baseDigest = digest;
}
}
@Override // java.security.SignatureSpi
protected void engineInitVerify(PublicKey publicKey) throws InvalidKeyException {
if (!(publicKey instanceof RSAPublicKey)) {
throw new InvalidKeyException("Supplied key is not a RSAPublicKey instance");
}
PSSSigner pSSSigner = new PSSSigner(this.signer, this.contentDigest, this.mgfDigest, this.saltLength, this.trailer);
this.pss = pSSSigner;
pSSSigner.init(false, RSAUtil.generatePublicKeyParameter((RSAPublicKey) publicKey));
}
@Override // java.security.SignatureSpi
protected void engineInitSign(PrivateKey privateKey, SecureRandom secureRandom) throws InvalidKeyException {
if (!(privateKey instanceof RSAPrivateKey)) {
throw new InvalidKeyException("Supplied key is not a RSAPrivateKey instance");
}
PSSSigner pSSSigner = new PSSSigner(this.signer, this.contentDigest, this.mgfDigest, this.saltLength, this.trailer);
this.pss = pSSSigner;
pSSSigner.init(true, new ParametersWithRandom(RSAUtil.generatePrivateKeyParameter((RSAPrivateKey) privateKey), secureRandom));
}
@Override // java.security.SignatureSpi
protected void engineInitSign(PrivateKey privateKey) throws InvalidKeyException {
if (!(privateKey instanceof RSAPrivateKey)) {
throw new InvalidKeyException("Supplied key is not a RSAPrivateKey instance");
}
PSSSigner pSSSigner = new PSSSigner(this.signer, this.contentDigest, this.mgfDigest, this.saltLength, this.trailer);
this.pss = pSSSigner;
pSSSigner.init(true, RSAUtil.generatePrivateKeyParameter((RSAPrivateKey) privateKey));
}
@Override // java.security.SignatureSpi
protected AlgorithmParameters engineGetParameters() {
if (this.engineParams == null && this.paramSpec != null) {
try {
AlgorithmParameters createAlgorithmParameters = this.helper.createAlgorithmParameters("PSS");
this.engineParams = createAlgorithmParameters;
createAlgorithmParameters.init(this.paramSpec);
} catch (Exception e) {
throw new RuntimeException(e.toString());
}
}
return this.engineParams;
}
@Override // java.security.SignatureSpi
protected Object engineGetParameter(String str) {
throw new UnsupportedOperationException("engineGetParameter unsupported");
}
private void setupContentDigest() {
this.contentDigest = this.isRaw ? new NullPssDigest(this, this.mgfDigest) : this.mgfDigest;
}
private byte getTrailer(int i) {
if (i == 1) {
return PSSSigner.TRAILER_IMPLICIT;
}
throw new IllegalArgumentException("unknown trailer field");
}
/* loaded from: classes6.dex */
public static class PSSwithRSA extends PSSSignatureSpi {
public PSSwithRSA() {
super(new RSABlindedEngine(), null);
}
}
/* loaded from: classes6.dex */
public static class SHA1withRSA extends PSSSignatureSpi {
public SHA1withRSA() {
super(new RSABlindedEngine(), PSSParameterSpec.DEFAULT);
}
}
/* loaded from: classes6.dex */
public static class SHA224withRSA extends PSSSignatureSpi {
public SHA224withRSA() {
super(new RSABlindedEngine(), new PSSParameterSpec(McElieceCCA2KeyGenParameterSpec.SHA224, "MGF1", new MGF1ParameterSpec(McElieceCCA2KeyGenParameterSpec.SHA224), 28, 1));
}
}
/* loaded from: classes6.dex */
public static class SHA256withRSA extends PSSSignatureSpi {
public SHA256withRSA() {
super(new RSABlindedEngine(), new PSSParameterSpec(McElieceCCA2KeyGenParameterSpec.SHA256, "MGF1", new MGF1ParameterSpec(McElieceCCA2KeyGenParameterSpec.SHA256), 32, 1));
}
}
/* loaded from: classes6.dex */
public static class SHA384withRSA extends PSSSignatureSpi {
public SHA384withRSA() {
super(new RSABlindedEngine(), new PSSParameterSpec(McElieceCCA2KeyGenParameterSpec.SHA384, "MGF1", new MGF1ParameterSpec(McElieceCCA2KeyGenParameterSpec.SHA384), 48, 1));
}
}
/* loaded from: classes6.dex */
public static class SHA3_224withRSA extends PSSSignatureSpi {
public SHA3_224withRSA() {
super(new RSABlindedEngine(), new PSSParameterSpec("SHA3-224", "MGF1", new MGF1ParameterSpec("SHA3-224"), 28, 1));
}
}
/* loaded from: classes6.dex */
public static class SHA3_256withRSA extends PSSSignatureSpi {
public SHA3_256withRSA() {
super(new RSABlindedEngine(), new PSSParameterSpec(SPHINCS256KeyGenParameterSpec.SHA3_256, "MGF1", new MGF1ParameterSpec(SPHINCS256KeyGenParameterSpec.SHA3_256), 32, 1));
}
}
/* loaded from: classes6.dex */
public static class SHA3_384withRSA extends PSSSignatureSpi {
public SHA3_384withRSA() {
super(new RSABlindedEngine(), new PSSParameterSpec("SHA3-384", "MGF1", new MGF1ParameterSpec("SHA3-384"), 48, 1));
}
}
/* loaded from: classes6.dex */
public static class SHA3_512withRSA extends PSSSignatureSpi {
public SHA3_512withRSA() {
super(new RSABlindedEngine(), new PSSParameterSpec("SHA3-512", "MGF1", new MGF1ParameterSpec("SHA3-512"), 64, 1));
}
}
/* loaded from: classes6.dex */
public static class SHA512_224withRSA extends PSSSignatureSpi {
public SHA512_224withRSA() {
super(new RSABlindedEngine(), new PSSParameterSpec("SHA-512(224)", "MGF1", new MGF1ParameterSpec("SHA-512(224)"), 28, 1));
}
}
/* loaded from: classes6.dex */
public static class SHA512_256withRSA extends PSSSignatureSpi {
public SHA512_256withRSA() {
super(new RSABlindedEngine(), new PSSParameterSpec("SHA-512(256)", "MGF1", new MGF1ParameterSpec("SHA-512(256)"), 32, 1));
}
}
/* loaded from: classes6.dex */
public static class SHA512withRSA extends PSSSignatureSpi {
public SHA512withRSA() {
super(new RSABlindedEngine(), new PSSParameterSpec(McElieceCCA2KeyGenParameterSpec.SHA512, "MGF1", new MGF1ParameterSpec(McElieceCCA2KeyGenParameterSpec.SHA512), 64, 1));
}
}
/* loaded from: classes6.dex */
public static class nonePSS extends PSSSignatureSpi {
public nonePSS() {
super(new RSABlindedEngine(), null, true);
}
}
protected PSSSignatureSpi(AsymmetricBlockCipher asymmetricBlockCipher, PSSParameterSpec pSSParameterSpec, boolean z) {
this.helper = new BCJcaJceHelper();
this.signer = asymmetricBlockCipher;
this.originalSpec = pSSParameterSpec;
if (pSSParameterSpec == null) {
this.paramSpec = PSSParameterSpec.DEFAULT;
} else {
this.paramSpec = pSSParameterSpec;
}
this.mgfDigest = DigestFactory.getDigest(this.paramSpec.getDigestAlgorithm());
this.saltLength = this.paramSpec.getSaltLength();
this.trailer = getTrailer(this.paramSpec.getTrailerField());
this.isRaw = z;
setupContentDigest();
}
protected PSSSignatureSpi(AsymmetricBlockCipher asymmetricBlockCipher, PSSParameterSpec pSSParameterSpec) {
this(asymmetricBlockCipher, pSSParameterSpec, false);
}
}