Skip to content

Commit 31cdfd6

Browse files
authored
Merge pull request #758 from tls-attacker/certSelectionFix
Fixed certificate key selection for new certificates
2 parents 1fbec5b + 6d134bf commit 31cdfd6

File tree

167 files changed

+1863
-1183
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

167 files changed

+1863
-1183
lines changed

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/certificate/CertificateByteChooser.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,20 @@ private List<String> getResourceFiles() throws IOException {
5656
filenames.add("ec_secp160r2_rsa_cert.pem");
5757
filenames.add("ec_sect409k1_rsa_cert.pem");
5858
filenames.add("ec_sect193r2_ecdsa_cert.pem");
59-
filenames.add("dh_dsa_cert.pem");
59+
filenames.add("dh3072_dsa_cert.pem");
60+
filenames.add("dh2048_dsa_cert.pem");
61+
filenames.add("dh1024_dsa_cert.pem");
62+
filenames.add("dh512_dsa_cert.pem");
6063
filenames.add("ec_sect163r2_rsa_cert.pem");
6164
filenames.add("ec_secp224r1_ecdsa_cert.pem");
6265
filenames.add("ec_sect571r1_ecdsa_cert.pem");
6366
filenames.add("ec_secp192k1_rsa_cert.pem");
6467
filenames.add("ec_sect409r1_rsa_cert.pem");
6568
filenames.add("ec_sect233k1_ecdsa_cert.pem");
66-
filenames.add("dh_rsa_cert.pem");
69+
filenames.add("dh3072_rsa_cert.pem");
70+
filenames.add("dh2048_rsa_cert.pem");
71+
filenames.add("dh1024_rsa_cert.pem");
72+
filenames.add("dh512_rsa_cert.pem");
6773
filenames.add("ec_sect193r1_rsa_cert.pem");
6874
filenames.add("ec_secp256k1_ecdsa_cert.pem");
6975
filenames.add("rsa1024_rsa_cert.pem");
@@ -108,6 +114,10 @@ private List<String> getResourceFiles() throws IOException {
108114
filenames.add("ec_sect193r1_ecdsa_cert.pem");
109115
filenames.add("ec_secp256r1_ecdsa_cert.pem");
110116
filenames.add("ec_secp256r1_rsa_cert.pem");
117+
filenames.add("dh3072_ecdsa_cert.pem");
118+
filenames.add("dh2048_ecdsa_cert.pem");
119+
filenames.add("dh1024_ecdsa_cert.pem");
120+
filenames.add("dh512_ecdsa_cert.pem");
111121
// filenames.add("gost01_0_cert.pem");
112122
filenames.add("gost01_A_cert.pem");
113123
filenames.add("gost01_B_cert.pem");
@@ -133,7 +143,7 @@ private void loadKeys() {
133143
try {
134144
Certificate readCertificate = PemUtil.readCertificate(
135145
this.getClass().getClassLoader().getResourceAsStream(RESOURCE_PATH + file));
136-
String keyName = file.replace("cert.pem", "key.pem");
146+
String keyName = resolveKeyfileFromCert(file);
137147
PrivateKey privateKey = PemUtil.readPrivateKey(
138148
this.getClass().getClassLoader().getResourceAsStream(RESOURCE_PATH + keyName));
139149
keyPairList.add(new CertificateKeyPair(readCertificate, privateKey));
@@ -260,4 +270,17 @@ public CertificateKeyPair chooseCertificateKeyPair(Chooser chooser) {
260270
}
261271
return keyPairList.get(0);
262272
}
273+
274+
private String resolveKeyfileFromCert(String certName) {
275+
int signatureTypeSuffixIndex;
276+
if (certName.startsWith("ec_")) {
277+
signatureTypeSuffixIndex = certName.indexOf("_", 4);
278+
return certName.substring(0, signatureTypeSuffixIndex) + "_key.pem";
279+
} else if (certName.startsWith("rsa") || certName.startsWith("dh") || certName.startsWith("dsa")) {
280+
signatureTypeSuffixIndex = certName.indexOf("_");
281+
return certName.substring(0, signatureTypeSuffixIndex) + "_key.pem";
282+
} else {
283+
return certName.replace("cert.pem", "key.pem");
284+
}
285+
}
263286
}

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/config/Config.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import de.rub.nds.tlsattacker.core.constants.GOSTCurve;
3535
import de.rub.nds.tlsattacker.core.constants.HashAlgorithm;
3636
import de.rub.nds.tlsattacker.core.constants.HeartbeatMode;
37+
import de.rub.nds.tlsattacker.core.constants.KeyUpdateRequest;
3738
import de.rub.nds.tlsattacker.core.constants.MaxFragmentLength;
3839
import de.rub.nds.tlsattacker.core.constants.NameType;
3940
import de.rub.nds.tlsattacker.core.constants.NamedGroup;
@@ -305,6 +306,11 @@ public static Config createEmptyConfig() {
305306
*/
306307
private MaxFragmentLength maxFragmentLength = MaxFragmentLength.TWO_9;
307308

309+
/**
310+
* Determine if a KeyUpdate should be requested from peer
311+
*/
312+
private KeyUpdateRequest defaultKeyUpdateRequestMode = KeyUpdateRequest.UPDATE_NOT_REQUESTED;
313+
308314
/**
309315
* Determine if CCS should be encrypted in TLS 1.3 if encryption is set up for record layer
310316
*/
@@ -3923,4 +3929,12 @@ public Boolean isEncryptChangeCipherSpec() {
39233929
public void setEncryptChangeCipherSpec(Boolean encryptChangeCipherSpec) {
39243930
this.encryptChangeCipherSpecTls13 = encryptChangeCipherSpec;
39253931
}
3932+
3933+
public KeyUpdateRequest getDefaultKeyUpdateRequestMode() {
3934+
return defaultKeyUpdateRequestMode;
3935+
}
3936+
3937+
public void setDefaultKeyUpdateRequestMode(KeyUpdateRequest defaultKeyUpdateRequestMode) {
3938+
this.defaultKeyUpdateRequestMode = defaultKeyUpdateRequestMode;
3939+
}
39263940
}

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/constants/KeyUpdateRequest.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,18 @@
99

1010
package de.rub.nds.tlsattacker.core.constants;
1111

12-
import de.rub.nds.modifiablevariable.ModifiableVariableFactory;
13-
import de.rub.nds.modifiablevariable.singlebyte.ModifiableByte;
14-
1512
public enum KeyUpdateRequest {
1613

1714
UPDATE_NOT_REQUESTED((byte) 0),
1815
UPDATE_REQUESTED((byte) 1);
1916

20-
private ModifiableByte requestUpdate;
17+
private byte value;
2118

22-
private KeyUpdateRequest(byte requestUpdate) {
23-
this.requestUpdate = ModifiableVariableFactory.safelySetValue(this.requestUpdate, requestUpdate);
19+
private KeyUpdateRequest(byte value) {
20+
this.value = value;
2421
}
2522

2623
public byte getValue() {
27-
return requestUpdate.getValue();
24+
return value;
2825
}
29-
3026
}

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/protocol/message/KeyUpdateMessage.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
package de.rub.nds.tlsattacker.core.protocol.message;
1111

12+
import de.rub.nds.modifiablevariable.ModifiableVariableFactory;
13+
import de.rub.nds.modifiablevariable.singlebyte.ModifiableByte;
1214
import de.rub.nds.tlsattacker.core.config.Config;
1315
import de.rub.nds.tlsattacker.core.constants.HandshakeMessageType;
1416
import de.rub.nds.tlsattacker.core.constants.KeyUpdateRequest;
@@ -22,7 +24,7 @@ public class KeyUpdateMessage extends HandshakeMessage {
2224

2325
private static final Logger LOGGER = LogManager.getLogger();
2426

25-
private KeyUpdateRequest requestUpdate;
27+
private ModifiableByte requestMode;
2628

2729
@Override
2830
public KeyUpdateHandler getHandler(TlsContext context) {
@@ -32,27 +34,29 @@ public KeyUpdateHandler getHandler(TlsContext context) {
3234
public KeyUpdateMessage() {
3335
super(HandshakeMessageType.KEY_UPDATE);
3436
this.setIncludeInDigest(false);
35-
this.requestUpdate = KeyUpdateRequest.UPDATE_NOT_REQUESTED;
3637
}
3738

3839
public KeyUpdateMessage(Config tlsConfig) {
3940
super(tlsConfig, HandshakeMessageType.KEY_UPDATE);
40-
this.requestUpdate = KeyUpdateRequest.UPDATE_NOT_REQUESTED;
4141
this.setIncludeInDigest(false);
4242
}
4343

44-
public KeyUpdateMessage(HandshakeMessageType handshakeMessageType, KeyUpdateRequest requestUpdate) {
45-
super(handshakeMessageType);
46-
this.requestUpdate = requestUpdate;
44+
public KeyUpdateMessage(Config tlsConfig, KeyUpdateRequest requestUpdate) {
45+
super(tlsConfig, HandshakeMessageType.KEY_UPDATE);
46+
setRequestMode(requestUpdate);
4747
this.setIncludeInDigest(false);
4848
}
4949

50-
public void setRequestUpdate(KeyUpdateRequest keyupdaterequest) {
51-
requestUpdate = keyupdaterequest;
50+
public final void setRequestMode(KeyUpdateRequest requestMode) {
51+
this.requestMode = ModifiableVariableFactory.safelySetValue(this.requestMode, requestMode.getValue());
52+
}
53+
54+
public void setRequestMode(ModifiableByte requestMode) {
55+
this.requestMode = requestMode;
5256
}
5357

54-
public KeyUpdateRequest getRequestUpdate() {
55-
return this.requestUpdate;
58+
public ModifiableByte getRequestMode() {
59+
return this.requestMode;
5660
}
5761

5862
}

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/protocol/parser/KeyUpdateParser.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@ protected KeyUpdateMessage createHandshakeMessage() {
3838
}
3939

4040
private void parseUpdateRequest(KeyUpdateMessage msg) {
41-
42-
if (parseByteField(HandshakeByteLength.KEY_UPDATE_LENGTH) == KeyUpdateRequest.UPDATE_REQUESTED.getValue()) {
43-
msg.setRequestUpdate(KeyUpdateRequest.UPDATE_REQUESTED);
41+
byte requestMode = parseByteField(HandshakeByteLength.KEY_UPDATE_LENGTH);
42+
if (requestMode == KeyUpdateRequest.UPDATE_REQUESTED.getValue()) {
43+
msg.setRequestMode(KeyUpdateRequest.UPDATE_REQUESTED);
4444
} else {
45-
msg.setRequestUpdate(KeyUpdateRequest.UPDATE_NOT_REQUESTED);
45+
msg.setRequestMode(KeyUpdateRequest.UPDATE_NOT_REQUESTED);
4646
}
47-
LOGGER.debug("KeyUpdateValue: " + msg.getRequestUpdate());
47+
LOGGER.debug("KeyUpdateValue: " + msg.getRequestMode().getValue());
4848

4949
}
5050

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/protocol/preparator/KeyUpdatePreparator.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
package de.rub.nds.tlsattacker.core.protocol.preparator;
1111

12-
import de.rub.nds.tlsattacker.core.constants.KeyUpdateRequest;
1312
import de.rub.nds.tlsattacker.core.protocol.message.KeyUpdateMessage;
1413
import de.rub.nds.tlsattacker.core.workflow.chooser.Chooser;
1514
import org.apache.logging.log4j.LogManager;
@@ -27,8 +26,10 @@ public KeyUpdatePreparator(Chooser chooser, KeyUpdateMessage message) {
2726

2827
@Override
2928
protected void prepareHandshakeMessageContents() {
30-
msg.setRequestUpdate(msg.getRequestUpdate());
31-
LOGGER.debug("Preparing KeyUpdate - MessageContent is: " + msg.getRequestUpdate());
29+
if (msg.getRequestMode() == null) {
30+
msg.setRequestMode(chooser.getConfig().getDefaultKeyUpdateRequestMode());
31+
}
32+
LOGGER.debug("Preparing KeyUpdate - MessageContent is: " + msg.getRequestMode().getValue());
3233
}
3334

3435
}

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/protocol/serializer/KeyUpdateSerializer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ public byte[] serializeHandshakeMessageContent() {
4343
}
4444

4545
private void writeKeyUpdateData(KeyUpdateMessage msg) {
46-
appendByte(msg.getRequestUpdate().getValue());
47-
LOGGER.debug("Serialized KeyUpdate Value: " + msg.getRequestUpdate());
46+
appendByte(msg.getRequestMode().getValue());
47+
LOGGER.debug("Serialized KeyUpdate Value: " + msg.getRequestMode());
4848
}
4949

5050
}

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/workflow/action/executor/ReceiveMessageHelper.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -779,7 +779,6 @@ private byte[] tryToFetchAdditionalBytes(TlsContext context) {
779779
*/
780780
private boolean recordGroupIndicatesWrongTls13KeySet(List<ProtocolMessage> parsedMessages,
781781
RecordGroup recordGroup) {
782-
// todo: once KeyUpdate is implemented, check if it counts as HS message
783782
Set<Tls13KeySetType> expectedKeyTypes = new HashSet<>();
784783
for (ProtocolMessage msg : parsedMessages) {
785784
if (!(msg instanceof TlsMessage)) {
@@ -788,7 +787,7 @@ private boolean recordGroupIndicatesWrongTls13KeySet(List<ProtocolMessage> parse
788787

789788
switch (((TlsMessage) msg).getProtocolMessageType()) {
790789
case HANDSHAKE:
791-
if (msg instanceof NewSessionTicketMessage) {
790+
if (msg instanceof NewSessionTicketMessage || msg instanceof KeyUpdateMessage) {
792791
expectedKeyTypes.add(Tls13KeySetType.APPLICATION_TRAFFIC_SECRETS);
793792
} else if (msg instanceof ClientHelloMessage || msg instanceof ServerHelloMessage) {
794793
expectedKeyTypes.add(Tls13KeySetType.NONE);

TLS-Core/src/main/resources/Config.xsd

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@
171171
<xs:element name="prefferedCertRsaKeySize" type="xs:int" minOccurs="0"/>
172172
<xs:element name="prefferedCertDssKeySize" type="xs:int" minOccurs="0"/>
173173
<xs:element name="maxFragmentLength" type="maxFragmentLength" minOccurs="0"/>
174+
<xs:element name="defaultKeyUpdateRequestMode" type="keyUpdateRequest" minOccurs="0"/>
174175
<xs:element name="encryptChangeCipherSpecTls13" type="xs:boolean" minOccurs="0"/>
175176
<xs:element name="tlsSessionTicket" type="xs:string" minOccurs="0"/>
176177
<xs:element name="defaultClientRenegotiationInfo" type="xs:string" minOccurs="0"/>
@@ -1902,6 +1903,13 @@
19021903
</xs:restriction>
19031904
</xs:simpleType>
19041905

1906+
<xs:simpleType name="keyUpdateRequest">
1907+
<xs:restriction base="xs:string">
1908+
<xs:enumeration value="UPDATE_NOT_REQUESTED"/>
1909+
<xs:enumeration value="UPDATE_REQUESTED"/>
1910+
</xs:restriction>
1911+
</xs:simpleType>
1912+
19051913
<xs:simpleType name="tokenBindingVersion">
19061914
<xs:restriction base="xs:string">
19071915
<xs:enumeration value="DRAFT_1"/>
Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
11
-----BEGIN CERTIFICATE-----
2-
MIIEsTCCBG+gAwIBAgIUTJr2OVFsu4NGKzgmVC89Tp9ImGEwCwYJYIZIAWUDBAMC
2+
MIIEyjCCBHigAwIBAgIUcl0c6yH7eukzGmbEUxZ5Vzf3B2IwCwYJYIZIAWUDBAMC
33
MEgxCzAJBgNVBAYTAkRFMQwwCgYDVQQIDANOUlcxDzANBgNVBAcMBkJvY2h1bTEM
4-
MAoGA1UECgwDUlVCMQwwCgYDVQQLDANORFMwHhcNMjEwNTE5MDc1NjAxWhcNMjYx
5-
MTA5MDc1NjAxWjBIMQswCQYDVQQGEwJERTEMMAoGA1UECAwDTlJXMQ8wDQYDVQQH
6-
DAZCb2NodW0xDDAKBgNVBAoMA1JVQjEMMAoGA1UECwwDTkRTMIIDOjCCAi0GByqG
7-
SM44BAEwggIgAoIBAQDzEYcKCMBrTdDBjjuL/9wGItPzwSqJZfN1+3PjeOz66t0Z
8-
/zvioORtcsnTdsJF1wLRn0lPNm2XCagfLREmU3pxOsA+VapwMAAzJNfq5udWZ4gw
9-
lUURl0irAgUuFO8oDXIkZVREXAMSYQP5kFzCrjMVUIUr4xtT5XPk+0x5cFX2SUpy
10-
3HEzAOd/Of1SBZG9BO6yP4g5879xTTYRtlluvJLJ53zub29VYSYHyk9vSD9WCbXp
11-
TU6p4Jy6iB8r2mRPa/Hbn0gVhEPKxmZexp4uP//C1ArNX3HAgLIdHrN3rznhBkkd
12-
0FssuW5DJB9pYlKXUU7H5y1LXtqYDGKXXCQbDUWDAhUA+ROHs5eW4dgEoc+vQ1xy
13-
zpwdFpcCggEAODpkqjFui65M/tHG2O/gqa8yhmFl9uubj3yiULzYI0yC7gE/cjuu
14-
5JYnDXF+Bo9ooQU8KHXhMObwcSND2JuzInpWNZsLcqyyI0v2oNMDBlDe/xIBjPUg
15-
bJgCX7Xf+oMro2TW//EV0qhfNczIjFtDEqaBpG0JWeWPrKNpynQ0DincdeqbixxJ
16-
8mJb7Gq98UluQ18vKEJ7BG0k7yvnazhGsbHZYKP530+cL2wscZDYFOzE2S3NXdP1
17-
hxJlurdfzGT3Cg16JbkUUGw59hpV0vZnejO28mFi6HWbFuYNVe+NEL+KhOxWHZZI
18-
Oda/KKe2J79ioj2QpMDRcac6R+F28rT3AgOCAQUAAoIBACLABMpypaQev2i6LV6S
19-
8IhM2+bYGSTICDPoWlgWq2eE71vSgvoUfLhoiv7jsDmHkZ3oEo/xFZaMhBQrU2vm
20-
WfkkiefaeomIbaakDCPnGSu7Kw6OfKsoKZKDCxCYTV/1RDYz8+SXAIwAxuJwc+eR
21-
c8FeFMjWXOzjZN21rMO7MuYDKPPoMwMKUy0nf1u1ChbYHhaojL4XSuhJHK+5SFu2
22-
CLADI/SdpfYL0XGLf3dbYT0nG/Kjp1OFhLBmNKe+KlM1PK2Ynp0SS4FK2d97LV8f
23-
/k0yyJieUyV4UPddO1Wvm6/v6h5gH840LkIK2EOQVHopYHe3mJ74nTmJLqeKRvt4
24-
cE6jUzBRMB0GA1UdDgQWBBRpmsxkkFVUZPBQDxNc5k1rgzzFAjAfBgNVHSMEGDAW
25-
gBRpmsxkkFVUZPBQDxNc5k1rgzzFAjAPBgNVHRMBAf8EBTADAQH/MAsGCWCGSAFl
26-
AwQDAgMvADAsAhQJho851YfUpoXF2ltclHKa6aPqFAIUGBggZqDYClOkbi8Vah/A
27-
VW5mgFQ=
4+
MAoGA1UECgwDUlVCMQwwCgYDVQQLDANORFMwHhcNMjEwNjE0MTMyMTA4WhcNMjYx
5+
MjA1MTMyMTA4WjBIMQswCQYDVQQGEwJERTEMMAoGA1UECAwDTlJXMQ8wDQYDVQQH
6+
DAZCb2NodW0xDDAKBgNVBAoMA1JVQjEMMAoGA1UECwwDTkRTMIIDQzCCAjYGByqG
7+
SM44BAEwggIpAoIBAQDziAT0PzIOuDMGg2CPws9Itrq9nLJwo4suN8DghR6p/9wr
8+
XBE6C0s05CEeZyvcgoOYTWrdhOBkf52lav8zBHBt27QiGFYhR0L3TNbkHHM8b2h/
9+
O0eK06IRa7raMlPmUCLHOjObaBQNT5EhQqnR7DV1MiFLWXDMYCzbopFnJqGlMKV7
10+
jji+oSCLYUVDDKBQLacVe/QfqmZUQ2MjFm7At/RU2WZz6FTJsuSKGuMa0hl8oVAc
11+
6Ytu0iREb3dwblpQWGIwraIiSqWlCL8LHaU2zVND77jjtth43lV3FArCA0Y19/mn
12+
nmDBavrYY1ZNLBQFWi4xvY7hmwX2putDBkFZmUzVAh0AlSuhpBqUa23nLWdsmBQf
13+
qzwjKRnJs4TpcbKbJQKCAQEAs6Zk1NTJHq/pg4PFDE1OCn99YQQLT/RbQS8MmUcm
14+
/W2rglgFwwi0LyH9SjhcSs3Mqbh4JCXYYUD9W+p0B0J7MtNBj4BExaJo4wW6G5Km
15+
Hi8RefAE7XRxtEBvOi18pCz0Ih6F4WDpgKQARp66KH42V2Fob0cgs+owTfMaMTT4
16+
8an1Hdlr+edPr3mu/WKqvLYDdgPBA2yk4eCbEa2HLUwIWgzFVLEqb9zSP69InZsL
17+
pFju1NnaYjSD6+V6bDPU0h/cbmqCietqI3iyreh/Qx0zZ+h1b1XI2UWYdlsmiyzu
18+
XVqAOjrg8jzyNW+A4oNcdhriXSMaZ/ygmVdNsQuDDPC7KQOCAQUAAoIBAE5OV4Tv
19+
+015r5Cm3+BMQ+k/tWGsTa35Pelz4VsMi6MTFWQP77ViSG0MinYrL5I5rEK6r2IR
20+
j/iWPWCo0VTXYm/Wqt6FO2whNy0Bd+Lrpfo6RRIpYMEt9Em5R0bFhuKy4sG+DgM4
21+
qx0YQzVQ/5g97r3Z0rWUAOXp5xcJl2uwhYaE0JnHpwCldavUWQ0C8hbaBm16Vn69
22+
qXYjnA9cFjh7NtYbBJMQHiuc/8jq/m4bGntlrvKccTYmetFQnwfG5a1q0DIKOVBs
23+
AqrsePSLeVoRd+rGepb0uYnA6aQuykyujCtYqOfYKYbWrWm3rX9efdHBDKszx8gr
24+
cmld6SxnjoQPUYyjUzBRMB0GA1UdDgQWBBR77/xSjbFxBJmzuzt0I/SFwiitHDAf
25+
BgNVHSMEGDAWgBR77/xSjbFxBJmzuzt0I/SFwiitHDAPBgNVHRMBAf8EBTADAQH/
26+
MAsGCWCGSAFlAwQDAgM/ADA8AhwEo/5+gv/hSJg4oZzuL8l3GagURbA3kxR3AQIL
27+
AhxN1NVag0cdU3KXP20GJE8ccQTOHXBYmC0LZXjN
2828
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)