1 // Copyright 2024 Google 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 // 15 //////////////////////////////////////////////////////////////////////////////// 16 17 package com.google.crypto.tink.subtle; 18 19 import static com.google.common.truth.Truth.assertThat; 20 import static org.junit.Assert.assertThrows; 21 22 import com.google.crypto.tink.InsecureSecretKeyAccess; 23 import com.google.crypto.tink.config.TinkFips; 24 import com.google.crypto.tink.config.internal.TinkFipsUtil; 25 import com.google.crypto.tink.signature.RsaSsaPkcs1Parameters; 26 import com.google.crypto.tink.signature.RsaSsaPkcs1PrivateKey; 27 import com.google.crypto.tink.signature.internal.testing.RsaSsaPkcs1TestUtil; 28 import com.google.crypto.tink.subtle.Enums.HashType; 29 import java.security.GeneralSecurityException; 30 import java.security.KeyFactory; 31 import java.security.Security; 32 import java.security.interfaces.RSAPrivateCrtKey; 33 import java.security.spec.RSAPrivateCrtKeySpec; 34 import org.conscrypt.Conscrypt; 35 import org.junit.Assume; 36 import org.junit.Before; 37 import org.junit.Test; 38 import org.junit.runner.RunWith; 39 import org.junit.runners.JUnit4; 40 41 @RunWith(JUnit4.class) 42 public final class RsaSsaPkcs1SignJceFipsTest { 43 44 @Before useConscrypt()45 public void useConscrypt() throws Exception { 46 Assume.assumeTrue(TinkFips.useOnlyFips()); 47 Conscrypt.checkAvailability(); 48 Security.addProvider(Conscrypt.newProvider()); 49 } 50 51 @Test create_accepts2048ModulusIfFipsModuleIsAvailable()52 public void create_accepts2048ModulusIfFipsModuleIsAvailable() throws Exception { 53 RsaSsaPkcs1Parameters parameters = 54 RsaSsaPkcs1Parameters.builder() 55 .setModulusSizeBits(2048) 56 .setPublicExponent(RsaSsaPkcs1Parameters.F4) 57 .setHashType(RsaSsaPkcs1Parameters.HashType.SHA256) 58 .setVariant(RsaSsaPkcs1Parameters.Variant.NO_PREFIX) 59 .build(); 60 RsaSsaPkcs1PrivateKey privateKey = 61 RsaSsaPkcs1TestUtil.privateKeyFor2048BitParameters(parameters, null); 62 63 if (TinkFipsUtil.fipsModuleAvailable()) { 64 assertThat(RsaSsaPkcs1SignJce.create(privateKey)).isNotNull(); 65 } else { 66 assertThrows(GeneralSecurityException.class, () -> RsaSsaPkcs1SignJce.create(privateKey)); 67 } 68 } 69 70 @Test constructor_accepts2048ModulusIfFipsModuleIsAvailable()71 public void constructor_accepts2048ModulusIfFipsModuleIsAvailable() throws Exception { 72 RsaSsaPkcs1Parameters parameters = 73 RsaSsaPkcs1Parameters.builder() 74 .setModulusSizeBits(2048) 75 .setPublicExponent(RsaSsaPkcs1Parameters.F4) 76 .setHashType(RsaSsaPkcs1Parameters.HashType.SHA256) 77 .setVariant(RsaSsaPkcs1Parameters.Variant.NO_PREFIX) 78 .build(); 79 RsaSsaPkcs1PrivateKey privateKey = 80 RsaSsaPkcs1TestUtil.privateKeyFor2048BitParameters(parameters, null); 81 KeyFactory keyFactory = EngineFactory.KEY_FACTORY.getInstance("RSA"); 82 RSAPrivateCrtKey rsaPrivateCrtKey = 83 (RSAPrivateCrtKey) 84 keyFactory.generatePrivate( 85 new RSAPrivateCrtKeySpec( 86 privateKey.getPublicKey().getModulus(), 87 privateKey.getPublicKey().getParameters().getPublicExponent(), 88 privateKey.getPrivateExponent().getBigInteger(InsecureSecretKeyAccess.get()), 89 privateKey.getPrimeP().getBigInteger(InsecureSecretKeyAccess.get()), 90 privateKey.getPrimeQ().getBigInteger(InsecureSecretKeyAccess.get()), 91 privateKey.getPrimeExponentP().getBigInteger(InsecureSecretKeyAccess.get()), 92 privateKey.getPrimeExponentQ().getBigInteger(InsecureSecretKeyAccess.get()), 93 privateKey.getCrtCoefficient().getBigInteger(InsecureSecretKeyAccess.get()))); 94 95 if (TinkFipsUtil.fipsModuleAvailable()) { 96 assertThat(new RsaSsaPkcs1SignJce(rsaPrivateCrtKey, HashType.SHA256)).isNotNull(); 97 } else { 98 assertThrows( 99 GeneralSecurityException.class, 100 () -> new RsaSsaPkcs1SignJce(rsaPrivateCrtKey, HashType.SHA256)); 101 } 102 } 103 104 @Test create_refuses4096Modulus()105 public void create_refuses4096Modulus() throws Exception { 106 RsaSsaPkcs1Parameters parameters = 107 RsaSsaPkcs1Parameters.builder() 108 .setModulusSizeBits(4096) 109 .setPublicExponent(RsaSsaPkcs1Parameters.F4) 110 .setHashType(RsaSsaPkcs1Parameters.HashType.SHA256) 111 .setVariant(RsaSsaPkcs1Parameters.Variant.NO_PREFIX) 112 .build(); 113 RsaSsaPkcs1PrivateKey privateKey = 114 RsaSsaPkcs1TestUtil.privateKeyFor4096BitParameters(parameters, null); 115 116 assertThrows(GeneralSecurityException.class, () -> RsaSsaPkcs1SignJce.create(privateKey)); 117 } 118 119 @Test constructor_refuses4096Modulus()120 public void constructor_refuses4096Modulus() throws Exception { 121 RsaSsaPkcs1Parameters parameters = 122 RsaSsaPkcs1Parameters.builder() 123 .setModulusSizeBits(4096) 124 .setPublicExponent(RsaSsaPkcs1Parameters.F4) 125 .setHashType(RsaSsaPkcs1Parameters.HashType.SHA256) 126 .setVariant(RsaSsaPkcs1Parameters.Variant.NO_PREFIX) 127 .build(); 128 RsaSsaPkcs1PrivateKey privateKey = 129 RsaSsaPkcs1TestUtil.privateKeyFor4096BitParameters(parameters, null); 130 KeyFactory keyFactory = EngineFactory.KEY_FACTORY.getInstance("RSA"); 131 RSAPrivateCrtKey rsaPrivateCrtKey = 132 (RSAPrivateCrtKey) 133 keyFactory.generatePrivate( 134 new RSAPrivateCrtKeySpec( 135 privateKey.getPublicKey().getModulus(), 136 privateKey.getPublicKey().getParameters().getPublicExponent(), 137 privateKey.getPrivateExponent().getBigInteger(InsecureSecretKeyAccess.get()), 138 privateKey.getPrimeP().getBigInteger(InsecureSecretKeyAccess.get()), 139 privateKey.getPrimeQ().getBigInteger(InsecureSecretKeyAccess.get()), 140 privateKey.getPrimeExponentP().getBigInteger(InsecureSecretKeyAccess.get()), 141 privateKey.getPrimeExponentQ().getBigInteger(InsecureSecretKeyAccess.get()), 142 privateKey.getCrtCoefficient().getBigInteger(InsecureSecretKeyAccess.get()))); 143 assertThrows( 144 GeneralSecurityException.class, 145 () -> new RsaSsaPkcs1SignJce(rsaPrivateCrtKey, HashType.SHA256)); 146 } 147 } 148