View | Details | Raw Unified | Return to bug 58303
Collapse All | Expand All

(-)a/src/components/org/apache/jmeter/assertions/SMIMEAssertion.java (-39 / +53 lines)
Lines 27-67 import java.io.InputStream; Link Here
27
import java.math.BigInteger;
27
import java.math.BigInteger;
28
import java.security.GeneralSecurityException;
28
import java.security.GeneralSecurityException;
29
import java.security.Security;
29
import java.security.Security;
30
import java.security.cert.CertStore;
31
import java.security.cert.CertificateException;
30
import java.security.cert.CertificateException;
32
import java.security.cert.CertificateFactory;
31
import java.security.cert.CertificateFactory;
33
import java.security.cert.X509Certificate;
32
import java.security.cert.X509Certificate;
34
import java.util.ArrayList;
33
import java.util.ArrayList;
35
import java.util.Collection;
36
import java.util.Iterator;
34
import java.util.Iterator;
37
import java.util.List;
35
import java.util.List;
38
import java.util.Properties;
36
import java.util.Properties;
39
import java.util.Vector;
40
37
41
import javax.mail.MessagingException;
38
import javax.mail.MessagingException;
42
import javax.mail.Session;
39
import javax.mail.Session;
43
import javax.mail.internet.MimeMessage;
40
import javax.mail.internet.MimeMessage;
44
import javax.mail.internet.MimeMultipart;
41
import javax.mail.internet.MimeMultipart;
45
import javax.security.auth.x500.X500Principal;
46
42
47
import org.apache.commons.io.IOUtils;
43
import org.apache.commons.io.IOUtils;
48
import org.apache.jmeter.samplers.SampleResult;
44
import org.apache.jmeter.samplers.SampleResult;
49
import org.apache.jorphan.logging.LoggingManager;
45
import org.apache.jorphan.logging.LoggingManager;
50
import org.apache.jorphan.util.JOrphanUtils;
46
import org.apache.jorphan.util.JOrphanUtils;
51
import org.apache.log.Logger;
47
import org.apache.log.Logger;
48
import org.bouncycastle.asn1.x500.AttributeTypeAndValue;
49
import org.bouncycastle.asn1.x500.RDN;
50
import org.bouncycastle.asn1.x500.X500Name;
51
import org.bouncycastle.asn1.x500.style.BCStyle;
52
import org.bouncycastle.asn1.x500.style.IETFUtils;
53
import org.bouncycastle.asn1.x509.Extension;
52
import org.bouncycastle.asn1.x509.GeneralName;
54
import org.bouncycastle.asn1.x509.GeneralName;
53
import org.bouncycastle.asn1.x509.X509Name;
55
import org.bouncycastle.asn1.x509.GeneralNames;
56
import org.bouncycastle.cert.X509CertificateHolder;
57
import org.bouncycastle.cert.jcajce.JcaX509CertificateHolder;
54
import org.bouncycastle.cms.CMSException;
58
import org.bouncycastle.cms.CMSException;
55
import org.bouncycastle.cms.SignerInformation;
59
import org.bouncycastle.cms.SignerInformation;
56
import org.bouncycastle.cms.SignerInformationStore;
60
import org.bouncycastle.cms.SignerInformationStore;
57
import org.bouncycastle.cms.jcajce.JcaX509CertSelectorConverter;
61
import org.bouncycastle.cms.SignerInformationVerifier;
58
import org.bouncycastle.jce.PrincipalUtil;
62
import org.bouncycastle.cms.jcajce.JcaSimpleSignerInfoVerifierBuilder;
59
import org.bouncycastle.jce.X509Principal;
60
import org.bouncycastle.jce.provider.BouncyCastleProvider;
63
import org.bouncycastle.jce.provider.BouncyCastleProvider;
61
import org.bouncycastle.mail.smime.SMIMEException;
64
import org.bouncycastle.mail.smime.SMIMEException;
62
import org.bouncycastle.mail.smime.SMIMESignedParser;
65
import org.bouncycastle.mail.smime.SMIMESignedParser;
66
import org.bouncycastle.operator.OperatorCreationException;
63
import org.bouncycastle.operator.bc.BcDigestCalculatorProvider;
67
import org.bouncycastle.operator.bc.BcDigestCalculatorProvider;
64
import org.bouncycastle.x509.extension.X509ExtensionUtil;
68
import org.bouncycastle.util.Store;
65
69
66
/**
70
/**
67
 * Helper class which isolates the BouncyCastle code.
71
 * Helper class which isolates the BouncyCastle code.
Lines 148-170 class SMIMEAssertion { Link Here
148
        AssertionResult res = new AssertionResult(name);
152
        AssertionResult res = new AssertionResult(name);
149
153
150
        try {
154
        try {
151
            CertStore certs = s.getCertificatesAndCRLs("Collection", "BC"); // $NON-NLS-1$  // $NON-NLS-2$
155
            Store certs = s.getCertificates();
152
            SignerInformationStore signers = s.getSignerInfos();
156
            SignerInformationStore signers = s.getSignerInfos();
153
            Iterator<?> signerIt = signers.getSigners().iterator();
157
            Iterator<?> signerIt = signers.getSigners().iterator();
154
158
155
            if (signerIt.hasNext()) {
159
            if (signerIt.hasNext()) {
156
160
157
                SignerInformation signer = (SignerInformation) signerIt.next();
161
                SignerInformation signer = (SignerInformation) signerIt.next();
158
                Iterator<?> certIt = certs.getCertificates(
162
                Iterator<?> certIt = certs.getMatches(signer.getSID()).iterator();
159
                        (new JcaX509CertSelectorConverter()).getCertSelector(signer.getSID())).iterator();
160
163
161
                if (certIt.hasNext()) {
164
                if (certIt.hasNext()) {
162
                    // the signer certificate
165
                    // the signer certificate
163
                    X509Certificate cert = (X509Certificate) certIt.next();
166
                    X509CertificateHolder cert = (X509CertificateHolder) certIt.next();
164
167
165
                    if (testElement.isVerifySignature()) {
168
                    if (testElement.isVerifySignature()) {
166
169
167
                        if (!signer.verify(cert.getPublicKey(), "BC")) { // $NON-NLS-1$
170
                        SignerInformationVerifier verifier = null;
171
                        try {
172
                            verifier = new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC")
173
                                    .build(cert);
174
                        } catch (OperatorCreationException e) {
175
                            log.error("Can't create a provider", e);
176
                        }
177
                        if (verifier == null || !signer.verify(verifier)) {
168
                            res.setFailure(true);
178
                            res.setFailure(true);
169
                            res.setFailureMessage("Signature is invalid");
179
                            res.setFailureMessage("Signature is invalid");
170
                        }
180
                        }
Lines 201-210 class SMIMEAssertion { Link Here
201
211
202
                        String subject = testElement.getSignerDn();
212
                        String subject = testElement.getSignerDn();
203
                        if (subject.length() > 0) {
213
                        if (subject.length() > 0) {
204
                            final X500Principal certPrincipal = cert.getSubjectX500Principal();
214
                            final X500Name certPrincipal = cert.getSubject();
205
                            log.debug(certPrincipal.getName(X500Principal.CANONICAL));
215
                            log.debug("DN from cert: " + certPrincipal.toString());
206
                            X500Principal principal = new X500Principal(subject);
216
                            X500Name principal = new X500Name(subject);
207
                            log.debug(principal.getName(X500Principal.CANONICAL));
217
                            log.debug("DN from assertion: " + principal.toString());
208
                            if (!principal.equals(certPrincipal)) {
218
                            if (!principal.equals(certPrincipal)) {
209
                                res.setFailure(true);
219
                                res.setFailure(true);
210
                                failureMessage
220
                                failureMessage
Lines 215-225 class SMIMEAssertion { Link Here
215
225
216
                        String issuer = testElement.getIssuerDn();
226
                        String issuer = testElement.getIssuerDn();
217
                        if (issuer.length() > 0) {
227
                        if (issuer.length() > 0) {
218
                            final X500Principal issuerX500Principal = cert.getIssuerX500Principal();
228
                            final X500Name issuerX500Name = cert.getIssuer();
219
                            log.debug(issuerX500Principal.getName(X500Principal.CANONICAL));
229
                            log.debug("IssuerDN from cert: " + issuerX500Name.toString());
220
                            X500Principal principal = new X500Principal(issuer);
230
                            X500Name principal = new X500Name(issuer);
221
                            log.debug(principal.getName(X500Principal.CANONICAL));
231
                            log.debug("IssuerDN from assertion: " + principal);
222
                            if (!principal.equals(issuerX500Principal)) {
232
                            if (!principal.equals(issuerX500Name)) {
223
                                res.setFailure(true);
233
                                res.setFailure(true);
224
                                failureMessage
234
                                failureMessage
225
                                        .append("Issuer distinguished name of signer certificate does not match \"")
235
                                        .append("Issuer distinguished name of signer certificate does not match \"")
Lines 235-245 class SMIMEAssertion { Link Here
235
                    if (testElement.isSignerCheckByFile()) {
245
                    if (testElement.isSignerCheckByFile()) {
236
                        CertificateFactory cf = CertificateFactory
246
                        CertificateFactory cf = CertificateFactory
237
                                .getInstance("X.509");
247
                                .getInstance("X.509");
238
                        X509Certificate certFromFile;
248
                        X509CertificateHolder certFromFile;
239
                        InputStream inStream = null;
249
                        InputStream inStream = null;
240
                        try {
250
                        try {
241
                            inStream = new BufferedInputStream(new FileInputStream(testElement.getSignerCertFile()));
251
                            inStream = new BufferedInputStream(new FileInputStream(testElement.getSignerCertFile()));
242
                            certFromFile = (X509Certificate) cf.generateCertificate(inStream);
252
                            certFromFile = new JcaX509CertificateHolder((X509Certificate) cf.generateCertificate(inStream));
243
                        } finally {
253
                        } finally {
244
                            IOUtils.closeQuietly(inStream);
254
                            IOUtils.closeQuietly(inStream);
245
                        }
255
                        }
Lines 317-344 class SMIMEAssertion { Link Here
317
    /**
327
    /**
318
     * Extract email addresses from a certificate
328
     * Extract email addresses from a certificate
319
     * 
329
     * 
320
     * @param cert the X509 certificate
330
     * @param cert the X509 certificate holder
321
     * @return a List of all email addresses found
331
     * @return a List of all email addresses found
322
     * @throws CertificateException
332
     * @throws CertificateException
323
     */
333
     */
324
    private static List<String> getEmailFromCert(X509Certificate cert)
334
    private static List<String> getEmailFromCert(X509CertificateHolder cert)
325
            throws CertificateException {
335
            throws CertificateException {
326
        List<String> res = new ArrayList<>();
336
        List<String> res = new ArrayList<>();
327
337
328
        X509Principal subject = PrincipalUtil.getSubjectX509Principal(cert);
338
        X500Name subject = cert.getSubject();
329
        Vector<?> addresses = subject.getValues(X509Name.EmailAddress);
339
        for (RDN emails : subject.getRDNs(BCStyle.EmailAddress)) {
330
        for (Object address: addresses) {
340
            for (AttributeTypeAndValue emailAttr: emails.getTypesAndValues()) {
331
            res.add((String) address);
341
                log.debug("Add email from RDN: " + IETFUtils.valueToString(emailAttr.getValue()));
342
                res.add(IETFUtils.valueToString(emailAttr.getValue()));
343
            }
332
        }
344
        }
333
345
334
        Collection<?> subjectAltNames =
346
        Extension subjectAlternativeNames = cert
335
            X509ExtensionUtil.getSubjectAlternativeNames(cert);
347
                .getExtension(Extension.subjectAlternativeName);
336
        for (Object altNameObj : subjectAltNames) {
348
        if (subjectAlternativeNames != null) {
337
            List<?> altName = (List<?>) altNameObj;
349
            for (GeneralName name : GeneralNames.getInstance(
338
            Integer type = (Integer) altName.get(0);
350
                    subjectAlternativeNames.getParsedValue()).getNames()) {
339
            if (type.intValue() == GeneralName.rfc822Name) {
351
                if (name.getTagNo() == GeneralName.rfc822Name) {
340
                String address = (String) altName.get(1);
352
                    String email = IETFUtils.valueToString(name.getName());
341
                res.add(address);
353
                    log.debug("Add email from subjectAlternativeName: " + email);
354
                    res.add(email);
355
                }
342
            }
356
            }
343
        }
357
        }
344
358
(-)a/test/src/org/apache/jmeter/assertions/SMIMEAssertionTest.java (+169 lines)
Line 0 Link Here
1
package org.apache.jmeter.assertions;
2
3
import java.io.ByteArrayOutputStream;
4
import java.io.IOException;
5
import java.util.Properties;
6
7
import javax.mail.MessagingException;
8
import javax.mail.Session;
9
import javax.mail.internet.MimeMessage;
10
11
import junit.framework.TestCase;
12
13
import org.apache.jmeter.samplers.SampleResult;
14
15
/**
16
 * Tests for the SMIMEAssertion.
17
 * <p>
18
 * 
19
 * A signed email named {@code signed_email.eml} is needed to complete these
20
 * tests. The one included was generated with the following script:
21
 * 
22
 * <pre>
23
 * {@code
24
 * # Create a key without a password
25
 * openssl genrsa -out email.key 2048 -nodes
26
 * 
27
 * # Create a config for the certificate request
28
 * cat > email.cnf <<EOF
29
 * [req]
30
 * prompt = no
31
 * distinguished_name = dn
32
 * req_extensions = ext
33
 * 
34
 * [dn]
35
 * CN = alice example
36
 * emailAddress = alice@a.example.com
37
 * O = Example Ltd
38
 * L = Wherever
39
 * C = AU
40
 * 
41
 * [ext]
42
 * subjectAltName = email:alice@a.example.com,email:bob@b.example.com,email:charlie@example.com,DNS:notused.example.com
43
 * EOF
44
 * 
45
 * # Create a certificate request
46
 * openssl req -new -config email.cnf -key email.key -out email.csr
47
 * 
48
 * cat > email.ext <<EOF
49
 * subjectAltName = email:alice@a.example.com,email:bob@b.example.com,email:charlie@example.com
50
 * EOF
51
 * 
52
 * # Self-Sign the request and add the subjectAltName
53
 * openssl x509 -req -days 365 -in email.csr -signkey email.key -out email.pem -extfile email.ext
54
 * 
55
 * # Create a simple email text
56
 * cat >email.txt <<EOF
57
 * Content-type: text/plain
58
 * 
59
 * This was really written by me.
60
 * EOF
61
 * 
62
 * # Create the smime with the generated key and the simple mail
63
 * openssl smime -sign -from bob@b.example.com -to someone@example.com \
64
 *               -subject "Signed Message" -signer email.pem \
65
 *               -in email.txt -inkey email.key -out signed_email.eml
66
 * }
67
 * </pre>
68
 * 
69
 * If a new signed email is generated, the signer key and certificate will
70
 * change, and thus the tests will have to be changed as well (serial number!).
71
 */
72
public class SMIMEAssertionTest extends TestCase {
73
74
    private MimeMessage msg;
75
    private SampleResult parent;
76
77
    public void setUp() throws MessagingException, IOException {
78
        Session mailSession = Session.getDefaultInstance(new Properties());
79
        msg = new MimeMessage(mailSession, this.getClass().getResourceAsStream(
80
                "signed_email.eml"));
81
        parent = new SampleResult();
82
        parent.sampleStart();
83
        parent.addSubResult(createChildSample());
84
    }
85
86
    public void testSignature() {
87
        SMIMEAssertionTestElement testElement = new SMIMEAssertionTestElement();
88
        testElement.setVerifySignature(true);
89
        AssertionResult result = SMIMEAssertion.getResult(testElement, parent,
90
                "Test");
91
        assertFalse("Result is not an error", result.isError());
92
        assertFalse("Result did not fail: " + result.getFailureMessage(),
93
                result.isFailure());
94
    }
95
96
    public void testSignerEmail() {
97
        SMIMEAssertionTestElement testElement = new SMIMEAssertionTestElement();
98
        testElement.setSignerCheckConstraints(true);
99
        testElement.setSignerEmail("bob@b.example.com");
100
        AssertionResult result = SMIMEAssertion.getResult(testElement, parent,
101
                "Test");
102
        assertFalse("Result is not an error", result.isError());
103
        assertFalse("Result did not fail: " + result.getFailureMessage(),
104
                result.isFailure());
105
    }
106
107
    public void testSignerSerial() {
108
        SMIMEAssertionTestElement testElement = new SMIMEAssertionTestElement();
109
        testElement.setSignerCheckConstraints(true);
110
        testElement.setSignerSerial("0xc8c46f8fbf9ebea4");
111
        AssertionResult result = SMIMEAssertion.getResult(testElement, parent,
112
                "Test");
113
        assertFalse("Result is not an error", result.isError());
114
        assertFalse("Result did not fail: " + result.getFailureMessage(),
115
                result.isFailure());
116
    }
117
118
    public void testSignerSignerDN() {
119
        SMIMEAssertionTestElement testElement = new SMIMEAssertionTestElement();
120
        testElement.setSignerCheckConstraints(true);
121
        testElement
122
                .setSignerDn("CN=alice example, E=alice@a.example.com, O=Example Ltd, L=Wherever, C=AU");
123
        AssertionResult result = SMIMEAssertion.getResult(testElement, parent,
124
                "Test");
125
        assertFalse("Result is not an error", result.isError());
126
        assertFalse("Result did not fail: " + result.getFailureMessage(),
127
                result.isFailure());
128
    }
129
130
    public void testSignerIssuerDN() {
131
        SMIMEAssertionTestElement testElement = new SMIMEAssertionTestElement();
132
        testElement.setSignerCheckConstraints(true);
133
        testElement
134
                .setIssuerDn("CN=alice example, E=alice@a.example.com, O=Example Ltd, L=Wherever, C=AU");
135
        AssertionResult result = SMIMEAssertion.getResult(testElement, parent,
136
                "Test");
137
        assertFalse("Result is not an error", result.isError());
138
        assertFalse("Result did not fail: " + result.getFailureMessage(),
139
                result.isFailure());
140
    }
141
142
    public void testSignerCert() {
143
        SMIMEAssertionTestElement testElement = new SMIMEAssertionTestElement();
144
        testElement.setSignerCheckConstraints(true);
145
        testElement.setSignerCheckByFile(true);
146
        testElement.setSignerCertFile(getClass().getResource("email.pem")
147
                .getPath());
148
        AssertionResult result = SMIMEAssertion.getResult(testElement, parent,
149
                "Test");
150
        assertFalse("Result is not an error", result.isError());
151
        assertFalse("Result did not fail: " + result.getFailureMessage(),
152
                result.isFailure());
153
    }
154
155
    private SampleResult createChildSample() throws MessagingException,
156
            IOException {
157
        SampleResult child = new SampleResult();
158
        child.setSampleLabel("Message " + msg.getMessageNumber());
159
        child.setContentType(msg.getContentType());
160
        child.setEncodingAndType(msg.getContentType());
161
        ByteArrayOutputStream outbuf = new ByteArrayOutputStream();
162
        msg.writeTo(outbuf);
163
        child.setResponseData(outbuf.toByteArray());
164
        child.setDataType(SampleResult.TEXT);
165
        child.setResponseOK();
166
        return child;
167
    }
168
169
}
(-)a/test/src/org/apache/jmeter/assertions/email.pem (+22 lines)
Line 0 Link Here
1
-----BEGIN CERTIFICATE-----
2
MIIDsTCCApmgAwIBAgIJAMjEb4+/nr6kMA0GCSqGSIb3DQEBCwUAMHIxFjAUBgNV
3
BAMTDWFsaWNlIGV4YW1wbGUxIjAgBgkqhkiG9w0BCQEWE2FsaWNlQGEuZXhhbXBs
4
ZS5jb20xFDASBgNVBAoTC0V4YW1wbGUgTHRkMREwDwYDVQQHEwhXaGVyZXZlcjEL
5
MAkGA1UEBhMCQVUwHhcNMTUxMDA4MTcxMzAwWhcNMTYxMDA3MTcxMzAwWjByMRYw
6
FAYDVQQDEw1hbGljZSBleGFtcGxlMSIwIAYJKoZIhvcNAQkBFhNhbGljZUBhLmV4
7
YW1wbGUuY29tMRQwEgYDVQQKEwtFeGFtcGxlIEx0ZDERMA8GA1UEBxMIV2hlcmV2
8
ZXIxCzAJBgNVBAYTAkFVMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
9
tvFwdH/wkxMHX4CU8j6nnrH4BOu8aeDfjgE3Bb7S7sgUuouvWzUbLk/QxQzaH0uh
10
kkjK6pvYQBnrzvjtWjxE/tgZAY3YYNPux0N1YGcgzsTm8e2b//hXWYZP7+ru4ify
11
oMDn8T5H5ZLwuAaKKUJZbg5HbRHZLanEaksXyNIbeeJ1E8VOBsgpYLayrCYCTZeI
12
N5S0lat77I6Eak8qxCy4BNBWNZC4CpFPgZ+vanS8ZNHlwWcD05+cgyubSedvCyq1
13
UpmHeNs4GrFfJxy7rqMNcDxxqQ+y8sK/kvp/E7EyhUjPct/WJVeyezb7ICqRg/SA
14
4iBiBmQw0xsVR98718ePSQIDAQABo0owSDBGBgNVHREEPzA9gRNhbGljZUBhLmV4
15
YW1wbGUuY29tgRFib2JAYi5leGFtcGxlLmNvbYETY2hhcmxpZUBleGFtcGxlLmNv
16
bTANBgkqhkiG9w0BAQsFAAOCAQEAEa7gGC44HIidRWvCswdKtTvO9yduG7yy1izT
17
LBJd3OSuqJ/tcy4QmImcBvtM0p/M0dIegIJBWueiymf4Rj5d/l4Zs4pO0T72e4qG
18
tjMIWNShkM1EXHqI4T5bSx8dUstDxyop54WhoriLotxAB4fLbqWcDr9x7PaE9FZ8
19
c8O73u3Yo5IgteGJGmSh/SWxFOglDcBkjasNG0LoyC4A8OYtOIZslFDSBBBCovIV
20
3VYKwNgczwj2zpHa8jh3GyqBIscTZyKHU79hR1nrUgVzgaBIhiQ0ZLIFar7XuyMC
21
xqgk0AeDAAcyqbADF5NfDYgWDIrB4WDgnufwVg9Q5hQi5h6z5w==
22
-----END CERTIFICATE-----
(-)a/test/src/org/apache/jmeter/assertions/signed_email.eml (+56 lines)
Line 0 Link Here
1
To: someone@example.com
2
From: bob@b.example.com
3
Subject: Signed Message
4
MIME-Version: 1.0
5
Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg="sha-256"; boundary="----5EFD563634B646BB8C420E6DA8819BE6"
6
7
This is an S/MIME signed message
8
9
------5EFD563634B646BB8C420E6DA8819BE6
10
Content-type: text/plain
11
12
This was really written by me.
13
14
------5EFD563634B646BB8C420E6DA8819BE6
15
Content-Type: application/x-pkcs7-signature; name="smime.p7s"
16
Content-Transfer-Encoding: base64
17
Content-Disposition: attachment; filename="smime.p7s"
18
19
MIIGggYJKoZIhvcNAQcCoIIGczCCBm8CAQExDzANBglghkgBZQMEAgEFADALBgkq
20
hkiG9w0BBwGgggO1MIIDsTCCApmgAwIBAgIJAMjEb4+/nr6kMA0GCSqGSIb3DQEB
21
CwUAMHIxFjAUBgNVBAMTDWFsaWNlIGV4YW1wbGUxIjAgBgkqhkiG9w0BCQEWE2Fs
22
aWNlQGEuZXhhbXBsZS5jb20xFDASBgNVBAoTC0V4YW1wbGUgTHRkMREwDwYDVQQH
23
EwhXaGVyZXZlcjELMAkGA1UEBhMCQVUwHhcNMTUxMDA4MTcxMzAwWhcNMTYxMDA3
24
MTcxMzAwWjByMRYwFAYDVQQDEw1hbGljZSBleGFtcGxlMSIwIAYJKoZIhvcNAQkB
25
FhNhbGljZUBhLmV4YW1wbGUuY29tMRQwEgYDVQQKEwtFeGFtcGxlIEx0ZDERMA8G
26
A1UEBxMIV2hlcmV2ZXIxCzAJBgNVBAYTAkFVMIIBIjANBgkqhkiG9w0BAQEFAAOC
27
AQ8AMIIBCgKCAQEAtvFwdH/wkxMHX4CU8j6nnrH4BOu8aeDfjgE3Bb7S7sgUuouv
28
WzUbLk/QxQzaH0uhkkjK6pvYQBnrzvjtWjxE/tgZAY3YYNPux0N1YGcgzsTm8e2b
29
//hXWYZP7+ru4ifyoMDn8T5H5ZLwuAaKKUJZbg5HbRHZLanEaksXyNIbeeJ1E8VO
30
BsgpYLayrCYCTZeIN5S0lat77I6Eak8qxCy4BNBWNZC4CpFPgZ+vanS8ZNHlwWcD
31
05+cgyubSedvCyq1UpmHeNs4GrFfJxy7rqMNcDxxqQ+y8sK/kvp/E7EyhUjPct/W
32
JVeyezb7ICqRg/SA4iBiBmQw0xsVR98718ePSQIDAQABo0owSDBGBgNVHREEPzA9
33
gRNhbGljZUBhLmV4YW1wbGUuY29tgRFib2JAYi5leGFtcGxlLmNvbYETY2hhcmxp
34
ZUBleGFtcGxlLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAEa7gGC44HIidRWvCswdK
35
tTvO9yduG7yy1izTLBJd3OSuqJ/tcy4QmImcBvtM0p/M0dIegIJBWueiymf4Rj5d
36
/l4Zs4pO0T72e4qGtjMIWNShkM1EXHqI4T5bSx8dUstDxyop54WhoriLotxAB4fL
37
bqWcDr9x7PaE9FZ8c8O73u3Yo5IgteGJGmSh/SWxFOglDcBkjasNG0LoyC4A8OYt
38
OIZslFDSBBBCovIV3VYKwNgczwj2zpHa8jh3GyqBIscTZyKHU79hR1nrUgVzgaBI
39
hiQ0ZLIFar7XuyMCxqgk0AeDAAcyqbADF5NfDYgWDIrB4WDgnufwVg9Q5hQi5h6z
40
5zGCApEwggKNAgEBMH8wcjEWMBQGA1UEAxMNYWxpY2UgZXhhbXBsZTEiMCAGCSqG
41
SIb3DQEJARYTYWxpY2VAYS5leGFtcGxlLmNvbTEUMBIGA1UEChMLRXhhbXBsZSBM
42
dGQxETAPBgNVBAcTCFdoZXJldmVyMQswCQYDVQQGEwJBVQIJAMjEb4+/nr6kMA0G
43
CWCGSAFlAwQCAQUAoIHkMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI
44
hvcNAQkFMQ8XDTE1MTAwODE3MTMwMFowLwYJKoZIhvcNAQkEMSIEIMGcHDb2GAxu
45
gaLHZ+WhdwrgMnYTgE58z3xhClvyHMJqMHkGCSqGSIb3DQEJDzFsMGowCwYJYIZI
46
AWUDBAEqMAsGCWCGSAFlAwQBFjALBglghkgBZQMEAQIwCgYIKoZIhvcNAwcwDgYI
47
KoZIhvcNAwICAgCAMA0GCCqGSIb3DQMCAgFAMAcGBSsOAwIHMA0GCCqGSIb3DQMC
48
AgEoMA0GCSqGSIb3DQEBAQUABIIBAAMGc7T6RiYkZ6i50saYRmXKWw04ft4ocdy+
49
f/T/bllQ9Evrpl/swWlJSKjhjhRigM2g/l/N1sGeOv5dh4+ElNUCSvMwP4p2U8XE
50
MjhPP3UoIkQKC0mYE4oYJttnXrfIPovvOHkqUGBl2XYcNbbVwD41uuq1gP+mOkcW
51
oaScHXBz/bOB0k1PJC8VjYCRfZsx+8IpZTcBMGY0Eij32jEy6T5moFL8DLBeM4S/
52
0fchDro8qJ2arHQXbMnjdo+pXkQb5wS3yfHCZEFjikrHSSGuISYfX/81aXFhbuVC
53
1pwzfLWPX8gV8eU3n9zrf1smiIWw81ujN7aBWi917w9gC6xwim0=
54
55
------5EFD563634B646BB8C420E6DA8819BE6--
56

Return to bug 58303