You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by dr...@apache.org on 2006/06/24 16:07:06 UTC

svn commit: r416919 - in /apr/apr-util/trunk: ssl/apr_ssl.c ssl/apr_ssl_openssl.c test/ test/Makefile.in test/echod.c test/sockperf.c test/ssl_data/ test/ssl_data/cert.csr test/ssl_data/cert.pem test/ssl_data/private.key

Author: dreid
Date: Sat Jun 24 07:07:06 2006
New Revision: 416919

URL: http://svn.apache.org/viewvc?rev=416919&view=rev
Log:
- add echod and sockperf in ssl enabled versions for apr-util
- correct bug in apr_ssl_accept()
- add key and cert for echod/sockperf test

This gets us testing both server and client aspects of the ssl code and
allows us to compare vs raw sockets directly :-)


Added:
    apr/apr-util/trunk/test/echod.c
    apr/apr-util/trunk/test/sockperf.c
    apr/apr-util/trunk/test/ssl_data/
    apr/apr-util/trunk/test/ssl_data/cert.csr
    apr/apr-util/trunk/test/ssl_data/cert.pem
    apr/apr-util/trunk/test/ssl_data/private.key
Modified:
    apr/apr-util/trunk/ssl/apr_ssl.c
    apr/apr-util/trunk/ssl/apr_ssl_openssl.c
    apr/apr-util/trunk/test/   (props changed)
    apr/apr-util/trunk/test/Makefile.in

Modified: apr/apr-util/trunk/ssl/apr_ssl.c
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/ssl/apr_ssl.c?rev=416919&r1=416918&r2=416919&view=diff
==============================================================================
--- apr/apr-util/trunk/ssl/apr_ssl.c (original)
+++ apr/apr-util/trunk/ssl/apr_ssl.c Sat Jun 24 07:07:06 2006
@@ -43,6 +43,7 @@
 
 {
     apr_ssl_factory_t *asf;
+    apr_status_t rv;
 
     if (!p)
         return APR_ENOPOOL;
@@ -59,8 +60,9 @@
 
     *fact = NULL;
     asf->pool = p;
-    if (apu_ssl_factory_create(asf, privateKeyFn, certFn, digestType) != APR_SUCCESS)
-        return -1;
+    if ((rv = apu_ssl_factory_create(asf, privateKeyFn, certFn, 
+                                     digestType)) != APR_SUCCESS)
+        return rv;
 
     /* should we register a cleanup here? */
     *fact = asf;

Modified: apr/apr-util/trunk/ssl/apr_ssl_openssl.c
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/ssl/apr_ssl_openssl.c?rev=416919&r1=416918&r2=416919&view=diff
==============================================================================
--- apr/apr-util/trunk/ssl/apr_ssl_openssl.c (original)
+++ apr/apr-util/trunk/ssl/apr_ssl_openssl.c Sat Jun 24 07:07:06 2006
@@ -77,7 +77,7 @@
                                               SSL_FILETYPE_PEM) ||
                 !SSL_CTX_check_private_key(sslData->ctx)) {
                 SSL_CTX_free(sslData->ctx);
-                return -1; /* what code shoudl we return? */
+                return APR_ENOENT; /* what code shoudl we return? */
             }
         }
     } else {
@@ -182,13 +182,15 @@
     return -1;
 }
 
-apr_status_t apu_ssl_accept(apr_ssl_socket_t *newSock, apr_ssl_socket_t *oldSock, apr_pool_t *pool)
+apr_status_t apu_ssl_accept(apr_ssl_socket_t *newSock, 
+                            apr_ssl_socket_t *oldSock, apr_pool_t *pool)
 {
     apu_ssl_socket_data_t *sslData = apr_pcalloc(pool, sizeof(*sslData));
     apr_os_sock_t fd;
+    int sslOp;
 
     if (!sslData || !oldSock->factory)
-        return -1;
+        return APR_EINVAL;
 
     sslData->ssl = SSL_new(oldSock->factory->sslData->ctx);
     if (!sslData->ssl)
@@ -197,6 +199,11 @@
     if (apr_os_sock_get(&fd, newSock->plain) != APR_SUCCESS)
         return -1;
     SSL_set_fd(sslData->ssl, fd);
+
+    if ((sslOp = SSL_accept(sslData->ssl)) != 1) {
+        openssl_get_error(newSock, sslOp);
+        return -1;
+    }
 
     newSock->pool = pool;
     newSock->sslData = sslData;

Propchange: apr/apr-util/trunk/test/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Sat Jun 24 07:07:06 2006
@@ -23,3 +23,5 @@
 testdbd
 dbd
 testssl
+echod
+sockperf

Modified: apr/apr-util/trunk/test/Makefile.in
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/test/Makefile.in?rev=416919&r1=416918&r2=416919&view=diff
==============================================================================
--- apr/apr-util/trunk/test/Makefile.in (original)
+++ apr/apr-util/trunk/test/Makefile.in Sat Jun 24 07:07:06 2006
@@ -3,7 +3,8 @@
 INCLUDES = @APRUTIL_PRIV_INCLUDES@ @APR_INCLUDES@ @APRUTIL_INCLUDES@
 
 PROGRAMS = testall testdbm testdate testxml testrmm \
-	   testreslist testqueue testxlate dbd testssl
+	   testreslist testqueue testxlate dbd testssl \
+           echod sockperf
 TARGETS = $(PROGRAMS)
 
 APRUTIL_DOTTED_VERSION=@APRUTIL_DOTTED_VERSION@
@@ -77,6 +78,18 @@
 testssl_LDADD =  $(TARGET_LIB_PATH)
 testssl: $(testssl_OBJECTS) $(testssl_LDADD)
 	$(LINK) $(APRUTIL_LDFLAGS) $(testssl_OBJECTS) $(testssl_LDADD) $(PROGRAM_DEPENDENCIES)
+
+echod_OBJECTS = echod.lo
+echod_LDADD =  $(TARGET_LIB_PATH)
+echod: $(echod_OBJECTS) $(echod_LDADD)
+	$(LINK) $(APRUTIL_LDFLAGS) $(echod_OBJECTS) $(echod_LDADD) \
+                $(PROGRAM_DEPENDENCIES)
+
+sockperf_OBJECTS = sockperf.lo
+sockperf_LDADD =  $(TARGET_LIB_PATH)
+sockperf: $(echod_OBJECTS) $(sockperf_LDADD)
+	$(LINK) $(APRUTIL_LDFLAGS) $(sockperf_OBJECTS) $(sockperf_LDADD) \
+                $(PROGRAM_DEPENDENCIES)
 
 testall_OBJECTS = teststrmatch.lo testuri.lo testuuid.lo abts.lo testutil.lo \
 	testbuckets.lo testpass.lo testmd4.lo testmd5.lo testldap.lo \

Added: apr/apr-util/trunk/test/echod.c
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/test/echod.c?rev=416919&view=auto
==============================================================================
--- apr/apr-util/trunk/test/echod.c (added)
+++ apr/apr-util/trunk/test/echod.c Sat Jun 24 07:07:06 2006
@@ -0,0 +1,166 @@
+/* Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Simple echo daemon, designed to be used for network throughput
+ * benchmarks. The aim is to allow us to monitor changes in performance
+ * of APR networking code, nothing more.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>  /* for atexit() */
+
+#include "apr.h"
+#include "apr_network_io.h"
+#include "apr_strings.h"
+#include "apr_ssl.h"
+#include "apr_getopt.h"
+
+#define BUF_SIZE 4096
+
+static apr_ssl_factory_t *asf = NULL;
+
+static void reportError(const char *msg, apr_status_t rv, 
+                        apr_pool_t *pool)
+{
+    fprintf(stderr, "%s\nError: %d\n'%s'\n", msg, rv,
+            apr_psprintf(pool, "%pm", &rv));
+}
+
+static apr_status_t talkTalk(apr_ssl_socket_t *socket, apr_pool_t *parent)
+{
+    apr_pool_t *pool;
+    apr_size_t len;
+    char *buf;
+    apr_status_t rv;
+
+    if (apr_pool_create(&pool, parent) != APR_SUCCESS)
+        return APR_ENOPOOL;
+
+
+    buf = apr_palloc(pool, BUF_SIZE);
+    if (!buf)
+        return ENOMEM;
+
+    do {
+        len = BUF_SIZE;
+        rv = apr_ssl_socket_recv(socket, buf, &len);
+        if (APR_STATUS_IS_EOF(rv) || len == 0 || rv != APR_SUCCESS)
+            break;
+        rv = apr_ssl_socket_send(socket, buf, &len);
+        if (len == 0 || rv != APR_SUCCESS)
+            break;
+    } while (rv == APR_SUCCESS);
+
+    apr_pool_clear(pool);
+    return APR_SUCCESS;
+}
+
+static apr_status_t glassToWall(apr_int16_t port, apr_pool_t *parent)
+{
+    apr_sockaddr_t *sockAddr;
+    apr_ssl_socket_t *listener, *accepted;
+    apr_status_t rv;
+
+    rv = apr_ssl_socket_create(&listener, APR_INET, SOCK_STREAM, APR_PROTO_TCP,
+                               asf, parent);
+    if (rv != APR_SUCCESS) {
+        reportError("Unable to create an SSL socket", rv, parent);
+        return rv;
+    }
+
+    rv = apr_sockaddr_info_get(&sockAddr, "127.0.0.1", APR_UNSPEC,
+                               port, 0, parent);
+    if (rv != APR_SUCCESS) {
+        reportError("Unable to get socket info", rv, parent);
+        apr_ssl_socket_close(listener);
+        return rv;
+    }
+
+    if ((rv = apr_ssl_socket_bind(listener, sockAddr)) != APR_SUCCESS ||
+        (rv = apr_ssl_socket_listen(listener, 5)) != APR_SUCCESS) {
+        reportError("Unable to bind or listen to socket", rv, parent);
+        apr_ssl_socket_close(listener);
+        return rv;
+    }
+
+    for (;;) {
+        rv = apr_ssl_socket_accept(&accepted, listener, parent);
+        if (rv != APR_SUCCESS) {
+            reportError("Error accepting on socket", rv, parent);
+            break;
+        }
+        printf("\tAnswering connection\n");
+        rv = talkTalk(accepted, parent);
+        apr_ssl_socket_close(accepted);
+        printf("\tConnection closed\n");
+        if (rv != APR_SUCCESS)
+            break;
+    }
+
+    apr_ssl_socket_close(listener);
+    return APR_SUCCESS;
+}
+
+int main(int argc, const char * const * argv)
+{
+    apr_pool_t *pool;
+    apr_status_t rv;
+    apr_int16_t theport = 4747;
+    char *keyFn = "ssl_data/private.key";
+    char *certFn = "ssl_data/cert.pem";
+    apr_getopt_t *os;
+    char optch;
+    const char *optarg;
+
+    printf("APR Test Application: echod\n");
+
+    apr_initialize();
+    atexit(apr_terminate);
+
+    apr_pool_create(&pool, NULL);
+
+    (void) apr_getopt_init(&os, pool, argc, argv);
+    while (apr_getopt(os, "kcp:", &optch, &optarg) == APR_SUCCESS) {
+        switch (optch) {
+            case 'k':
+                keyFn = (char *)optarg;
+                break;
+            case 'c':
+                certFn = (char *)optarg;
+                break;
+            case 'p':
+                theport = atoi(optarg);
+                break;
+            default:
+                printf("Unknown option! '%c'\n", optch);
+                break;
+       }
+    }
+
+    printf("\tListening at port %d\n", theport);
+    printf("\tPrivate key: %s\n", keyFn);
+    printf("\tCertificate: %s\n", certFn);
+
+    rv = apr_ssl_factory_create(&asf, keyFn, certFn, NULL, pool);
+    if (rv != APR_SUCCESS) {
+        reportError("Unable to create an SSL factory!", rv, pool);
+        exit(1);
+    }
+
+    rv = glassToWall(theport, pool);
+
+    return 0;
+}

Added: apr/apr-util/trunk/test/sockperf.c
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/test/sockperf.c?rev=416919&view=auto
==============================================================================
--- apr/apr-util/trunk/test/sockperf.c (added)
+++ apr/apr-util/trunk/test/sockperf.c Sat Jun 24 07:07:06 2006
@@ -0,0 +1,247 @@
+/* Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* sockperf.c
+ * This simple network client tries to connect to an echo daemon (echod)
+ * listening on a port it supplies, then time how long it takes to
+ * reply with packets of varying sizes.
+ * It prints results once completed.
+ *
+ * To run,
+ *
+ *   ./echod &
+ *   ./sockperf
+ */
+
+#include <stdio.h>
+#include <stdlib.h>  /* for atexit() */
+
+#include "apr.h"
+#include "apr_network_io.h"
+#include "apr_strings.h"
+#include "apr_ssl.h"
+
+#define MAX_ITERS    10
+#define TEST_SIZE  1024
+
+struct testSet {
+    char c;
+    int size;
+    int iters;
+} testRuns[] = {
+    { 'a', 1, 3 },
+    { 'b', 4, 3 },
+    { 'c', 16, 5 },
+    { 'd', 64, 5 },
+    { 'e', 256, 10 },
+};
+
+struct testResult {
+    int size;
+    int iters;
+    apr_time_t msecs[MAX_ITERS];
+    apr_time_t avg;
+};
+
+static apr_int16_t testPort = 4747;
+static apr_sockaddr_t *sockAddr = NULL;
+static apr_ssl_factory_t *asf = NULL;
+
+static void reportError(const char *msg, apr_status_t rv, 
+                        apr_pool_t *pool)
+{
+    fprintf(stderr, "%s\n", msg);
+    if (rv != APR_SUCCESS)
+        fprintf(stderr, "Error: %d\n'%s'\n", rv,
+                apr_psprintf(pool, "%pm", &rv));
+    
+}
+
+static void closeConnection(apr_ssl_socket_t *sock)
+{
+    apr_size_t len = 0;
+    apr_ssl_socket_send(sock, NULL, &len);
+}
+
+static apr_status_t sendRecvBuffer(apr_time_t *t, const char *buf, 
+                                   int size, apr_pool_t *pool)
+{
+    apr_ssl_socket_t *sock;
+    apr_status_t rv;
+    apr_size_t len = size, thistime = size;
+    char *recvBuf;
+    apr_time_t testStart = apr_time_now(), testEnd;
+    int i;
+
+    if (! sockAddr) {
+        rv = apr_sockaddr_info_get(&sockAddr, "127.0.0.1", APR_UNSPEC,
+                                   testPort, 0, pool);
+        if (rv != APR_SUCCESS) {
+            reportError("Unable to get socket info", rv, pool);
+            return rv;
+        }
+
+        /* make sure we can connect to daemon before we try tests */
+
+        rv = apr_ssl_socket_create(&sock, APR_INET, SOCK_STREAM, APR_PROTO_TCP,
+                                   asf, pool);
+        if (rv != APR_SUCCESS)
+            return rv;
+
+        rv = apr_ssl_socket_connect(sock, sockAddr);
+        if (rv != APR_SUCCESS) {
+            reportError("Unable to connect to echod!", rv, pool);
+            apr_ssl_socket_close(sock);
+            return rv;
+        }
+        apr_ssl_socket_close(sock);
+
+    }
+
+    recvBuf = apr_palloc(pool, size);
+    if (! recvBuf)
+        return ENOMEM;
+    *t = 0;
+
+    /* START! */
+    testStart = apr_time_now();
+    rv = apr_ssl_socket_create(&sock, APR_INET, SOCK_STREAM, APR_PROTO_TCP,
+                               asf, pool);
+    if (rv != APR_SUCCESS)
+        return rv;
+
+    rv = apr_ssl_socket_connect(sock, sockAddr);
+    if (rv != APR_SUCCESS) {
+        reportError("Unable to connect to echod!", rv, pool);
+        apr_ssl_socket_close(sock);
+        return rv;
+    }
+
+    for (i = 0; i < 3; i++) {
+
+        len = size;
+        thistime = size;
+
+        rv = apr_ssl_socket_send(sock, buf, &len);
+        if (rv != APR_SUCCESS || len != size) {
+            reportError(apr_psprintf(pool, 
+                         "Unable to send data correctly (iteration %d of 3)",
+                         i) , rv, pool);
+            closeConnection(sock);
+            apr_ssl_socket_close(sock);
+            return rv;
+        }
+    
+        do {
+            len = thistime;
+            rv = apr_ssl_socket_recv(sock, &recvBuf[size - thistime], &len);
+            if (rv != APR_SUCCESS)
+                break;
+            thistime -= len;
+        } while (thistime);
+    }
+
+    closeConnection(sock);
+    apr_ssl_socket_close(sock);
+    testEnd = apr_time_now();
+    /* STOP! */
+
+    if (thistime) {
+        reportError("Received less than we sent :-(", rv, pool);
+        return rv;
+    }        
+    if (strncmp(recvBuf, buf, size) != 0) {
+        reportError("Received corrupt data :-(", 0, pool);
+        printf("We sent:\n%s\nWe received:\n%s\n", buf, recvBuf);
+        return EINVAL;
+    }
+    *t = testEnd - testStart;
+    return APR_SUCCESS;
+}
+
+static apr_status_t runTest(struct testSet *ts, struct testResult *res,
+                            apr_pool_t *pool)
+{
+    char *buffer;
+    apr_status_t rv;
+    int i, sz = ts->size * TEST_SIZE;
+    
+    buffer = apr_palloc(pool, sz);
+    if (!buffer) {
+        reportError("Unable to allocate buffer", ENOMEM, pool);
+        return ENOMEM;
+    }
+    memset(buffer, ts->c, sz);
+
+    res->iters = ts->iters > MAX_ITERS ? MAX_ITERS : ts->iters;
+
+    for (i = 0; i < res->iters; i++) {
+        apr_time_t iterTime;
+        rv = sendRecvBuffer(&iterTime, buffer, sz, pool);
+        if (rv != APR_SUCCESS) {
+            res->iters = i;
+            break;
+        }
+        res->msecs[i] = iterTime;
+    }
+
+    return rv;
+}
+
+int main(int argc, char **argv)
+{
+    apr_pool_t *pool;
+    apr_status_t rv;
+    int i;
+    int nTests = sizeof(testRuns) / sizeof(testRuns[0]);
+    struct testResult *results;
+
+    printf("APR Test Application: SSL sockperf\n");
+
+    apr_initialize();
+    atexit(apr_terminate);
+
+    apr_pool_create(&pool, NULL);
+
+    rv = apr_ssl_factory_create(&asf, NULL, NULL, NULL, pool);
+
+    results = (struct testResult *)apr_pcalloc(pool, 
+                                        sizeof(*results) * nTests);
+
+    printf("Starting tests...");
+    fflush(stdout);
+    for(i = 0; i < nTests; i++) {
+        results[i].size = testRuns[i].size * TEST_SIZE;
+        rv = runTest(&testRuns[i], &results[i], pool);
+    }
+    printf("Complete\n");
+
+    printf("\nSummary\n=======\n");
+    for(i = 0; i < nTests; i++) {
+        int j;
+        apr_time_t totTime = 0;
+        printf("%10d byte block:\n", results[i].size);
+        printf("\t%2d iterations : ", results[i].iters);
+        for (j = 0; j < results[i].iters; j++) {
+            printf("%6Ld ", results[i].msecs[j]);
+            totTime += results[i].msecs[j];
+        }
+        printf("<\n");
+        printf("\t  Average: %6Ld\n", totTime / results[i].iters);
+    }
+
+    return 0;
+}

Added: apr/apr-util/trunk/test/ssl_data/cert.csr
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/test/ssl_data/cert.csr?rev=416919&view=auto
==============================================================================
--- apr/apr-util/trunk/test/ssl_data/cert.csr (added)
+++ apr/apr-util/trunk/test/ssl_data/cert.csr Sat Jun 24 07:07:06 2006
@@ -0,0 +1,17 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIICvzCCAacCAQAwejELMAkGA1UEBhMCR0IxFDASBgNVBAgTC1dlc3QgU3Vzc2V4
+MR0wGwYDVQQKExRBUFIgVGVzdCBDZXJ0aWZpY2F0ZTETMBEGA1UEAxMKQVBSIFRl
+c3RlcjEhMB8GCSqGSIb3DQEJARYSZGV2QGFwci5hcGFjaGUub3JnMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0mAG7FBmigUCAjvvwkp3WnboN4+nJDv+
+9JtN2FWECIi2sfPa4uIYXlWtfzXIsDtvivW8nbQ4DreiilX6rngcFt+cxFFHzqOs
+qvyMUnQnFElHLmwgPTtMzgqyGl52dsH8LKC24fvziSfLZth03w+/RA4dVYcjz4Gm
+6t3bheFG0g7SMz9U4610SefHEag6Zu5OS8SHTuR0yQPiwbKMcZ6T5jqyHh7mPm39
+jnOlD7yIgD6rwi4mW0Sau2+XgDIpFXb119PKSko8Z6sHFJXD8vpriWOmVbDgjfTd
+EksuE672ftFms7f5UDoLmR7gNWCXFAgcJ6nbuXI0Uec0ea9Dsww/UQIDAQABoAAw
+DQYJKoZIhvcNAQEFBQADggEBAJ+0DC6CCoxfkGAfazLEP1dWspv/whsyroWLwju0
+2XY8CkWZgSI06/4njn0cz5vVUN15dOlfhfkR5OJGm8Fiyy0MeVYwriF2VqMGONdv
+1nceZPklrToGstTlN+JYiM/CXgH3fZ4lABoPobRTJGHVwTj6QkZTN4j0h8N9NB2M
+3v8W8+8QGed+Fh1MX1QV/zKJgKgQTqwxuA6UGznroWX778GV9FUhXqfV9As/OWn9
+lpHqyZ+JrbhNrfO5g/S/1HaNkEoF8CFVxKPSv+iDYeyuYYhK/M1aWang0rwX5Lhp
+8JBo50OdOSN3e5IZUv9p0ef73h/OwozOnSX3NjfP8A1yc5U=
+-----END CERTIFICATE REQUEST-----

Added: apr/apr-util/trunk/test/ssl_data/cert.pem
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/test/ssl_data/cert.pem?rev=416919&view=auto
==============================================================================
--- apr/apr-util/trunk/test/ssl_data/cert.pem (added)
+++ apr/apr-util/trunk/test/ssl_data/cert.pem Sat Jun 24 07:07:06 2006
@@ -0,0 +1,21 @@
+-----BEGIN CERTIFICATE-----
+MIIDcDCCAlgCCQCaj+Wa2RLbDDANBgkqhkiG9w0BAQUFADB6MQswCQYDVQQGEwJH
+QjEUMBIGA1UECBMLV2VzdCBTdXNzZXgxHTAbBgNVBAoTFEFQUiBUZXN0IENlcnRp
+ZmljYXRlMRMwEQYDVQQDEwpBUFIgVGVzdGVyMSEwHwYJKoZIhvcNAQkBFhJkZXZA
+YXByLmFwYWNoZS5vcmcwHhcNMDYwNjI0MTI0NDQ4WhcNMzMxMTA5MTI0NDQ4WjB6
+MQswCQYDVQQGEwJHQjEUMBIGA1UECBMLV2VzdCBTdXNzZXgxHTAbBgNVBAoTFEFQ
+UiBUZXN0IENlcnRpZmljYXRlMRMwEQYDVQQDEwpBUFIgVGVzdGVyMSEwHwYJKoZI
+hvcNAQkBFhJkZXZAYXByLmFwYWNoZS5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQDSYAbsUGaKBQICO+/CSndadug3j6ckO/70m03YVYQIiLax89ri
+4hheVa1/NciwO2+K9bydtDgOt6KKVfqueBwW35zEUUfOo6yq/IxSdCcUSUcubCA9
+O0zOCrIaXnZ2wfwsoLbh+/OJJ8tm2HTfD79EDh1VhyPPgabq3duF4UbSDtIzP1Tj
+rXRJ58cRqDpm7k5LxIdO5HTJA+LBsoxxnpPmOrIeHuY+bf2Oc6UPvIiAPqvCLiZb
+RJq7b5eAMikVdvXX08pKSjxnqwcUlcPy+muJY6ZVsOCN9N0SSy4TrvZ+0Wazt/lQ
+OguZHuA1YJcUCBwnqdu5cjRR5zR5r0OzDD9RAgMBAAEwDQYJKoZIhvcNAQEFBQAD
+ggEBACOhwWAossglzxxj0oICjK9dsa6OAWQy4nBKRvWMo8VV6RAlmPi8Tvh3Zhaq
+z+23La+lgk8bEohdKt+kcCVAEG2hA3M83RTBqGd6ZUkaXUXXuF3GRkcFx3EW0EE/
+XQhFEBYdVUSmDf4y7cKPu3swbgl9GuNCFZYLCsF3qNofEm7E8NneOM6YnUUOKUpT
+2yFzUad78+F3pUq4eFz+1jOLruV9Kw0SwVppcNzdaaDWyQrlle1Aq8eLHQ0Thfnu
+yjdj8d5PFS3hEwMN1iMMOLWpqQ0Ik4sl6F5+WwDP6eZQuAqucc9VmQadK2pWABpn
+dOzKKjm57jOuFNX04gBE7SPtLws=
+-----END CERTIFICATE-----

Added: apr/apr-util/trunk/test/ssl_data/private.key
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/test/ssl_data/private.key?rev=416919&view=auto
==============================================================================
--- apr/apr-util/trunk/test/ssl_data/private.key (added)
+++ apr/apr-util/trunk/test/ssl_data/private.key Sat Jun 24 07:07:06 2006
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEA0mAG7FBmigUCAjvvwkp3WnboN4+nJDv+9JtN2FWECIi2sfPa
+4uIYXlWtfzXIsDtvivW8nbQ4DreiilX6rngcFt+cxFFHzqOsqvyMUnQnFElHLmwg
+PTtMzgqyGl52dsH8LKC24fvziSfLZth03w+/RA4dVYcjz4Gm6t3bheFG0g7SMz9U
+4610SefHEag6Zu5OS8SHTuR0yQPiwbKMcZ6T5jqyHh7mPm39jnOlD7yIgD6rwi4m
+W0Sau2+XgDIpFXb119PKSko8Z6sHFJXD8vpriWOmVbDgjfTdEksuE672ftFms7f5
+UDoLmR7gNWCXFAgcJ6nbuXI0Uec0ea9Dsww/UQIDAQABAoIBAQC1OZO9LuWmL/oz
+An7f2FZIz/XrJwzM4gIXpVHB8qjy0RLQ6Ui9+hcT7Kqw0xw29Hx6MIZzNDS2OOsE
+UFzKvx0zdx4M4BgDomu0QCqBPR4NE7MGAo8jMFpRhFU48fcLBsC9kRT6R5jbpjRK
+PF0xatdRQPd0Hh5zOzUXTlc1VYM0n48i9ZwwEb4LokftYsbSp15DgddJiXyjR7g3
+38av2iNmjMrbVlEbHKmDMsnPWLtq79bZqT7HwvVPRkazNJS0K3e48e0sg2ix5yt8
+yIJPQpTyA37Xut5DEIBu2lfHrTvgUWccHE60IEHpnnIqMjFSV+pjv7oFw35GESCN
+EAKWA+IBAoGBAPhhlWGlt79rJbDNbkcsL+x1u4fkr5ArlQnDnDkdnhAFN+jxz4g1
+7789BncJNEnkTqZRLZQ0cj5afWKlVhnwFvBf9Cube/wiFjUQJzd0t0V+ji+PmGdN
+AbSJHHectQYfjzDwEfTBKoj1b5D55suQpBiCBnsMUoaz7qJUzZjfIGoJAoGBANjU
+ABLGxCAvwtUnDFUBSmdM+9pl4uGVGySX+F42buy2rQXcwFjW12OS/nqYNIsP+Ei6
+BoSnA2tZv0i6O4nBbw7qkiSMadC8NF/Na1MIc6q4H1q3wkEuKhnGQjxHJEsSw8pm
+ASqu19XiZ4nQshRVv/PZr0lKI0BPb6KV17FnGZ0JAoGATVGLP99naLYBAJ2ic5Nk
+w7YOj4n3wOhgN67lxb3bg18sfV4w3VT08dIcXhfGaC4i8ZEZoCYHXjOrDncra12a
+tm8YQi7flKhDw3bozlGN75sqxdFsftOw8TMxYmasz2ApofFJlahABmxos3enibzX
+6C0puUonsnj2kx/U9H6Yx4kCgYBoMNcoLqMn5Et3KaBfaJNcOD39oF/5jjDQ0MXk
+X7vFu7JA0ucKyZIOox/twR3ehPoF2H4xWB/ogePNCtB5TZ4USNuY/HAMgaOZNZiQ
++cq7CmbmrM6Hi6tnX0GMvZLPEGFM7N86p3HHsVeXfdVUuC/Y+Y2lZh6yVHmMYvyW
+nrhMIQKBgQDpQoczIjZWFRpdCJS88X7IVXtpkr1v7TuRBlcWj2Bs2NPQuNl7/flP
+/GDRkNgEi0bJ9pqukGqutRexstCYE123prXhluH2LtPh0TRVK1AZy+Zl9VoZLAWn
+m1RIHWUwPIwGhbxV7V2qNiCXpVSSZNwGfptnuIx4mMTUX4rdXMZTaA==
+-----END RSA PRIVATE KEY-----