Skip to content

Commit 471bec3

Browse files
committed
Merge branch 'main' of gitlab.cryptoworkshop.com:root/bc-java
2 parents 3de437e + 49eb0d5 commit 471bec3

File tree

8 files changed

+128
-22
lines changed

8 files changed

+128
-22
lines changed

core/src/main/java/org/bouncycastle/crypto/agreement/SM2KeyExchange.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public void init(
5252
if (privParam instanceof ParametersWithID)
5353
{
5454
baseParam = (SM2KeyExchangePrivateParameters)((ParametersWithID)privParam).getParameters();
55-
userID = ((ParametersWithID)privParam).getID();
55+
userID = checkUserID(((ParametersWithID)privParam).getID());
5656
}
5757
else
5858
{
@@ -80,7 +80,7 @@ public byte[] calculateKey(int kLen, CipherParameters pubParam)
8080
if (pubParam instanceof ParametersWithID)
8181
{
8282
otherPub = (SM2KeyExchangePublicParameters)((ParametersWithID)pubParam).getParameters();
83-
otherUserID = ((ParametersWithID)pubParam).getID();
83+
otherUserID = checkUserID(((ParametersWithID)pubParam).getID());
8484
}
8585
else
8686
{
@@ -114,7 +114,7 @@ public byte[][] calculateKeyWithConfirmation(int kLen, byte[] confirmationTag, C
114114
if (pubParam instanceof ParametersWithID)
115115
{
116116
otherPub = (SM2KeyExchangePublicParameters)((ParametersWithID)pubParam).getParameters();
117-
otherUserID = ((ParametersWithID)pubParam).getID();
117+
otherUserID = checkUserID(((ParametersWithID)pubParam).getID());
118118
}
119119
else
120120
{
@@ -276,6 +276,7 @@ private byte[] getZ(Digest digest, byte[] userID, ECPoint pubPoint)
276276
private void addUserID(Digest digest, byte[] userID)
277277
{
278278
int len = userID.length * 8;
279+
// assert len >>> 16 == 0;
279280

280281
digest.update((byte)(len >>> 8));
281282
digest.update((byte)len);
@@ -294,4 +295,15 @@ private byte[] digestDoFinal()
294295
digest.doFinal(result, 0);
295296
return result;
296297
}
298+
299+
private static byte[] checkUserID(byte[] userID)
300+
{
301+
// The length in bits must be expressible in two bytes
302+
if (userID.length >= 8192)
303+
{
304+
throw new IllegalArgumentException("SM2 user ID must be less than 2^16 bits long");
305+
}
306+
307+
return userID;
308+
}
297309
}

core/src/main/java/org/bouncycastle/crypto/digests/Kangaroo.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package org.bouncycastle.crypto.digests;
22

3-
import org.bouncycastle.crypto.*;
3+
import org.bouncycastle.crypto.CipherParameters;
4+
import org.bouncycastle.crypto.CryptoServicePurpose;
5+
import org.bouncycastle.crypto.CryptoServicesRegistrar;
6+
import org.bouncycastle.crypto.ExtendedDigest;
7+
import org.bouncycastle.crypto.Xof;
48
import org.bouncycastle.util.Arrays;
59
import org.bouncycastle.util.Bytes;
610
import org.bouncycastle.util.Pack;
@@ -220,8 +224,6 @@ abstract static class KangarooBase
220224
*/
221225
private int theProcessed;
222226

223-
private final CryptoServicePurpose purpose;
224-
225227
/**
226228
* Constructor.
227229
*
@@ -241,7 +243,6 @@ abstract static class KangarooBase
241243

242244
/* Build personalisation */
243245
buildPersonal(null);
244-
this.purpose = purpose;
245246

246247
CryptoServicesRegistrar.checkConstraints(Utils.getDefaultProperties(this, pStrength, purpose));
247248

@@ -542,7 +543,7 @@ private static class KangarooSponge
542543
/**
543544
* The round constants.
544545
*/
545-
private static long[] KeccakRoundConstants = new long[]{0x0000000000000001L, 0x0000000000008082L,
546+
private static final long[] KeccakRoundConstants = new long[]{0x0000000000000001L, 0x0000000000008082L,
546547
0x800000000000808aL, 0x8000000080008000L, 0x000000000000808bL, 0x0000000080000001L, 0x8000000080008081L,
547548
0x8000000000008009L, 0x000000000000008aL, 0x0000000000000088L, 0x0000000080008009L, 0x000000008000000aL,
548549
0x000000008000808bL, 0x800000000000008bL, 0x8000000000008089L, 0x8000000000008003L, 0x8000000000008002L,
@@ -625,6 +626,12 @@ private void absorb(final byte[] data,
625626
int count = 0;
626627
while (count < len)
627628
{
629+
if (bytesInQueue == theRateBytes)
630+
{
631+
KangarooAbsorb(theQueue, 0);
632+
bytesInQueue = 0;
633+
}
634+
628635
if (bytesInQueue == 0 && count <= (len - theRateBytes))
629636
{
630637
do
@@ -642,12 +649,6 @@ private void absorb(final byte[] data,
642649

643650
bytesInQueue += partialBlock;
644651
count += partialBlock;
645-
646-
if (bytesInQueue == theRateBytes)
647-
{
648-
KangarooAbsorb(theQueue, 0);
649-
bytesInQueue = 0;
650-
}
651652
}
652653
}
653654
}

core/src/main/java/org/bouncycastle/crypto/signers/SM2Signer.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,10 @@ public void init(boolean forSigning, CipherParameters param)
7979
baseParam = ((ParametersWithID)param).getParameters();
8080
userID = ((ParametersWithID)param).getID();
8181

82+
// The length in bits must be expressible in two bytes
8283
if (userID.length >= 8192)
8384
{
84-
throw new IllegalArgumentException("SM2 user ID must be less than 2^13 bits long");
85+
throw new IllegalArgumentException("SM2 user ID must be less than 2^16 bits long");
8586
}
8687
}
8788
else
@@ -323,6 +324,8 @@ private byte[] getZ(byte[] userID)
323324
private void addUserID(Digest digest, byte[] userID)
324325
{
325326
int len = userID.length * 8;
327+
// assert len >>> 16 == 0;
328+
326329
digest.update((byte)(len >>> 8));
327330
digest.update((byte)len);
328331
digest.update(userID, 0, userID.length);

core/src/test/java/org/bouncycastle/crypto/test/KangarooTest.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88

99
/**
1010
* Test Cases for Kangaroo12. No TestVectors are available for MarsupilamiFourteen.
11-
* Test Vectors taken from https://tools.ietf.org/html/draft-viguier-kangarootwelve-04.
11+
* Test Vectors taken from https://tools.ietf.org/html/draft-viguier-kangarootwelve-04,
12+
* and generated using the reference implementation given in https://keccak.team/files/KangarooTwelve.pdf.
1213
*/
1314
public class KangarooTest
1415
extends SimpleTest
@@ -147,7 +148,13 @@ static class Kangaroo12Test
147148
"FAB658DB63E94A246188BF7AF69A133045F46EE984C56E3C3328CAAF1AA1A583",
148149
"D848C5068CED736F4462159B9867FD4C20B808ACC3D5BC48E0B06BA0A3762EC4",
149150
"C389E5009AE57120854C2E8C64670AC01358CF4C1BAF89447A724234DC7CED74",
150-
"75D2F86A2E644566726B4FBCFC5657B9DBCF070C7B0DCA06450AB291D7443BCF"
151+
"75D2F86A2E644566726B4FBCFC5657B9DBCF070C7B0DCA06450AB291D7443BCF",
152+
"61F2AD5657F4F2632A0822138EFE20C6A68A1885E1C0643EBF5587103219301D",
153+
"CBBE9DD1E423F20003FBA7BB219491C8D1F445FA5C4199D6C6C70C9FDC101964",
154+
"77DF46FD2D22BCE26E636E02CE10F9A42AE925E071F9056A9236328DB01BA411",
155+
"711835517A182DD4BC0E816BF5C72A278B227AE0B3D68F82577F97AD3CBFCA6A",
156+
"640728E5B4BE29F04A4FFFA645CB308102170F4D2B69D61F030CDC569BC74BAC",
157+
"5D7D68B49A5D999B8699FC4EDBEF0F0B4E4E7E904FE4B2B6B10C7C922407CF66"
151158
};
152159

153160
/**
@@ -170,6 +177,12 @@ void checkDigests(final KangarooTest pTest)
170177
pTest.testKangaroo(1, false, 41, EXPECTED[11]);
171178
pTest.testKangaroo(3, false, 41*41, EXPECTED[12]);
172179
pTest.testKangaroo(7, false, 41*41*41, EXPECTED[13]);
180+
pTest.testKangaroo(165, true, 0, EXPECTED[14]);
181+
pTest.testKangaroo(166, true, 0, EXPECTED[15]);
182+
pTest.testKangaroo(167, true, 0, EXPECTED[16]);
183+
pTest.testKangaroo(8192 + 165, false, 0, EXPECTED[17]);
184+
pTest.testKangaroo(8192 + 166, false, 0, EXPECTED[18]);
185+
pTest.testKangaroo(8192 + 167, false, 0, EXPECTED[19]);
173186
}
174187
}
175188

tls/src/main/java/org/bouncycastle/jsse/provider/JsseUtils.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.bouncycastle.tls.CertificateStatus;
4646
import org.bouncycastle.tls.CertificateStatusType;
4747
import org.bouncycastle.tls.ClientCertificateType;
48+
import org.bouncycastle.tls.ExtensionType;
4849
import org.bouncycastle.tls.IdentifierType;
4950
import org.bouncycastle.tls.KeyExchangeAlgorithm;
5051
import org.bouncycastle.tls.NamedGroup;
@@ -158,6 +159,24 @@ static String[] getArray(Collection<String> c)
158159
return c.toArray(new String[c.size()]);
159160
}
160161

162+
static String getExtensionsReport(String title, Hashtable extensions)
163+
{
164+
StringBuilder sb = new StringBuilder(title);
165+
sb.append(':');
166+
if (extensions != null)
167+
{
168+
Enumeration e = extensions.keys();
169+
while (e.hasMoreElements())
170+
{
171+
Integer extType = (Integer)e.nextElement();
172+
173+
sb.append(' ');
174+
sb.append(ExtensionType.getText(extType.intValue()));
175+
}
176+
}
177+
return sb.toString();
178+
}
179+
161180
static String[] getKeysArray(Map<String, ?> m)
162181
{
163182
return getArray(m.keySet());

tls/src/main/java/org/bouncycastle/jsse/provider/ProvTlsClientProtocol.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
11
package org.bouncycastle.jsse.provider;
22

3+
import java.io.ByteArrayInputStream;
34
import java.io.Closeable;
45
import java.io.IOException;
56
import java.io.InputStream;
67
import java.io.OutputStream;
8+
import java.util.logging.Level;
9+
import java.util.logging.Logger;
710

11+
import org.bouncycastle.tls.HandshakeMessageInput;
12+
import org.bouncycastle.tls.HandshakeType;
813
import org.bouncycastle.tls.RenegotiationPolicy;
14+
import org.bouncycastle.tls.ServerHello;
915
import org.bouncycastle.tls.TlsClientProtocol;
1016

1117
class ProvTlsClientProtocol extends TlsClientProtocol
1218
{
19+
private static final Logger LOG = Logger.getLogger(ProvTlsClientProtocol.class.getName());
20+
1321
private static final boolean provAcceptRenegotiation = PropertyUtils.getBooleanSystemProperty(
1422
"org.bouncycastle.jsse.client.acceptRenegotiation", false);
1523

@@ -33,4 +41,47 @@ protected int getRenegotiationPolicy()
3341
{
3442
return provAcceptRenegotiation ? RenegotiationPolicy.ACCEPT : RenegotiationPolicy.DENY;
3543
}
44+
45+
@Override
46+
protected void handleHandshakeMessage(short type, HandshakeMessageInput buf) throws IOException
47+
{
48+
if (LOG.isLoggable(Level.FINEST))
49+
{
50+
int length = buf.available();
51+
LOG.finest(getClientID() + " inbound handshake message: " + HandshakeType.getText(type) + "[" + length + "]");
52+
}
53+
54+
super.handleHandshakeMessage(type, buf);
55+
}
56+
57+
@Override
58+
protected ServerHello receiveServerHelloMessage(ByteArrayInputStream buf) throws IOException
59+
{
60+
ServerHello serverHello = super.receiveServerHelloMessage(buf);
61+
62+
if (LOG.isLoggable(Level.FINEST))
63+
{
64+
String title = getClientID() + " ServerHello extensions";
65+
LOG.finest(JsseUtils.getExtensionsReport(title, serverHello.getExtensions()));
66+
}
67+
68+
return serverHello;
69+
}
70+
71+
@Override
72+
protected void sendClientHelloMessage() throws IOException
73+
{
74+
if (LOG.isLoggable(Level.FINEST))
75+
{
76+
String title = getClientID() + " ClientHello extensions";
77+
LOG.finest(JsseUtils.getExtensionsReport(title, clientHello.getExtensions()));
78+
}
79+
80+
super.sendClientHelloMessage();
81+
}
82+
83+
private String getClientID()
84+
{
85+
return ((ProvTlsClient)tlsClient).getID();
86+
}
3687
}

tls/src/main/java/org/bouncycastle/tls/TlsClientProtocol.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,6 +1119,7 @@ protected void process13ServerHelloCoda(ServerHello serverHello, boolean afterHe
11191119
protected void processServerHello(ServerHello serverHello)
11201120
throws IOException
11211121
{
1122+
Hashtable clientHelloExtensions = clientHello.getExtensions();
11221123
Hashtable serverHelloExtensions = serverHello.getExtensions();
11231124

11241125
final ProtocolVersion legacy_version = serverHello.getVersion();
@@ -1257,7 +1258,7 @@ protected void processServerHello(ServerHello serverHello)
12571258
* associated ClientHello, it MUST abort the handshake with an unsupported_extension
12581259
* fatal alert.
12591260
*/
1260-
if (null == TlsUtils.getExtensionData(this.clientExtensions, extType))
1261+
if (null == TlsUtils.getExtensionData(clientHelloExtensions, extType))
12611262
{
12621263
throw new TlsFatalAlert(AlertDescription.unsupported_extension,
12631264
"Unrequested extension in ServerHello: " + ExtensionType.getText(extType.intValue()));
@@ -1359,7 +1360,7 @@ protected void processServerHello(ServerHello serverHello)
13591360
{
13601361
boolean negotiatedEMS = false;
13611362

1362-
if (TlsExtensionsUtils.hasExtendedMasterSecretExtension(clientExtensions))
1363+
if (TlsExtensionsUtils.hasExtendedMasterSecretExtension(clientHelloExtensions))
13631364
{
13641365
negotiatedEMS = TlsExtensionsUtils.hasExtendedMasterSecretExtension(serverHelloExtensions);
13651366

@@ -1400,7 +1401,7 @@ protected void processServerHello(ServerHello serverHello)
14001401
securityParameters.applicationProtocol = TlsExtensionsUtils.getALPNExtensionServer(serverHelloExtensions);
14011402
securityParameters.applicationProtocolSet = true;
14021403

1403-
Hashtable sessionClientExtensions = clientExtensions, sessionServerExtensions = serverHelloExtensions;
1404+
Hashtable sessionClientExtensions = clientHelloExtensions, sessionServerExtensions = serverHelloExtensions;
14041405
if (securityParameters.isResumedSession())
14051406
{
14061407
sessionClientExtensions = null;

tls/src/main/java/org/bouncycastle/tls/TlsProtocol.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -943,7 +943,7 @@ protected void safeWriteRecord(short type, byte[] buf, int offset, int len)
943943
{
944944
try
945945
{
946-
recordStream.writeRecord(type, buf, offset, len);
946+
writeRecord(type, buf, offset, len);
947947
}
948948
catch (TlsFatalAlert e)
949949
{
@@ -962,6 +962,12 @@ protected void safeWriteRecord(short type, byte[] buf, int offset, int len)
962962
}
963963
}
964964

965+
protected void writeRecord(short type, byte[] buf, int off, int len)
966+
throws IOException
967+
{
968+
recordStream.writeRecord(type, buf, off, len);
969+
}
970+
965971
/**
966972
* Write some application data. Fragmentation is handled internally. Usable in both blocking/non-blocking
967973
* modes.<br>
@@ -1699,7 +1705,7 @@ protected void raiseAlertFatal(short alertDescription, String message, Throwable
16991705

17001706
try
17011707
{
1702-
recordStream.writeRecord(ContentType.alert, alert, 0, 2);
1708+
writeRecord(ContentType.alert, alert, 0, 2);
17031709
}
17041710
catch (Exception e)
17051711
{

0 commit comments

Comments
 (0)