• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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