Merge pull request #4444 from ctiller/ssl-bad-con
Add tests for failed SSL connections: bad cert, and bad alpn configpull/4451/head
commit
633d9ad914
10 changed files with 871 additions and 2 deletions
@ -0,0 +1,171 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* Copyright 2015, Google Inc. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* * Redistributions in binary form must reproduce the above |
||||||
|
* copyright notice, this list of conditions and the following disclaimer |
||||||
|
* in the documentation and/or other materials provided with the |
||||||
|
* distribution. |
||||||
|
* * Neither the name of Google Inc. nor the names of its |
||||||
|
* contributors may be used to endorse or promote products derived from |
||||||
|
* this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <string.h> |
||||||
|
#include <stdio.h> |
||||||
|
|
||||||
|
#include <grpc/grpc.h> |
||||||
|
#include <grpc/grpc_security.h> |
||||||
|
#include <grpc/support/alloc.h> |
||||||
|
#include <grpc/support/host_port.h> |
||||||
|
#include <grpc/support/log.h> |
||||||
|
#include <grpc/support/string_util.h> |
||||||
|
#include <grpc/support/subprocess.h> |
||||||
|
#include "src/core/support/string.h" |
||||||
|
#include "test/core/util/port.h" |
||||||
|
#include "test/core/end2end/cq_verifier.h" |
||||||
|
#include "test/core/util/test_config.h" |
||||||
|
|
||||||
|
static void *tag(gpr_intptr t) { return (void *)t; } |
||||||
|
|
||||||
|
static void run_test(const char *target, size_t nops) { |
||||||
|
grpc_channel_credentials *ssl_creds = |
||||||
|
grpc_ssl_credentials_create(NULL, NULL, NULL); |
||||||
|
grpc_channel *channel; |
||||||
|
grpc_call *c; |
||||||
|
|
||||||
|
grpc_metadata_array initial_metadata_recv; |
||||||
|
grpc_metadata_array trailing_metadata_recv; |
||||||
|
char *details = NULL; |
||||||
|
size_t details_capacity = 0; |
||||||
|
grpc_status_code status; |
||||||
|
grpc_call_error error; |
||||||
|
gpr_timespec deadline = GRPC_TIMEOUT_SECONDS_TO_DEADLINE(5); |
||||||
|
grpc_completion_queue *cq = grpc_completion_queue_create(NULL); |
||||||
|
cq_verifier *cqv = cq_verifier_create(cq); |
||||||
|
|
||||||
|
grpc_op ops[6]; |
||||||
|
grpc_op *op; |
||||||
|
|
||||||
|
grpc_arg ssl_name_override = {GRPC_ARG_STRING, |
||||||
|
GRPC_SSL_TARGET_NAME_OVERRIDE_ARG, |
||||||
|
{"foo.test.google.fr"}}; |
||||||
|
grpc_channel_args args; |
||||||
|
|
||||||
|
args.num_args = 1; |
||||||
|
args.args = &ssl_name_override; |
||||||
|
|
||||||
|
grpc_metadata_array_init(&initial_metadata_recv); |
||||||
|
grpc_metadata_array_init(&trailing_metadata_recv); |
||||||
|
|
||||||
|
channel = grpc_secure_channel_create(ssl_creds, target, &args, NULL); |
||||||
|
c = grpc_channel_create_call(channel, NULL, GRPC_PROPAGATE_DEFAULTS, cq, |
||||||
|
"/foo", "foo.test.google.fr:1234", deadline, |
||||||
|
NULL); |
||||||
|
|
||||||
|
op = ops; |
||||||
|
op->op = GRPC_OP_SEND_INITIAL_METADATA; |
||||||
|
op->data.send_initial_metadata.count = 0; |
||||||
|
op->flags = 0; |
||||||
|
op->reserved = NULL; |
||||||
|
op++; |
||||||
|
op->op = GRPC_OP_RECV_STATUS_ON_CLIENT; |
||||||
|
op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv; |
||||||
|
op->data.recv_status_on_client.status = &status; |
||||||
|
op->data.recv_status_on_client.status_details = &details; |
||||||
|
op->data.recv_status_on_client.status_details_capacity = &details_capacity; |
||||||
|
op->flags = 0; |
||||||
|
op->reserved = NULL; |
||||||
|
op++; |
||||||
|
op->op = GRPC_OP_RECV_INITIAL_METADATA; |
||||||
|
op->data.recv_initial_metadata = &initial_metadata_recv; |
||||||
|
op->flags = 0; |
||||||
|
op->reserved = NULL; |
||||||
|
op++; |
||||||
|
op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT; |
||||||
|
op->flags = 0; |
||||||
|
op->reserved = NULL; |
||||||
|
op++; |
||||||
|
error = grpc_call_start_batch(c, ops, nops, tag(1), NULL); |
||||||
|
GPR_ASSERT(GRPC_CALL_OK == error); |
||||||
|
|
||||||
|
cq_expect_completion(cqv, tag(1), 1); |
||||||
|
cq_verify(cqv); |
||||||
|
|
||||||
|
GPR_ASSERT(status != GRPC_STATUS_OK); |
||||||
|
|
||||||
|
grpc_call_destroy(c); |
||||||
|
gpr_free(details); |
||||||
|
grpc_metadata_array_destroy(&initial_metadata_recv); |
||||||
|
grpc_metadata_array_destroy(&trailing_metadata_recv); |
||||||
|
|
||||||
|
grpc_channel_destroy(channel); |
||||||
|
grpc_completion_queue_destroy(cq); |
||||||
|
cq_verifier_destroy(cqv); |
||||||
|
grpc_channel_credentials_release(ssl_creds); |
||||||
|
} |
||||||
|
|
||||||
|
int main(int argc, char **argv) { |
||||||
|
char *me = argv[0]; |
||||||
|
char *lslash = strrchr(me, '/'); |
||||||
|
char *lunder = strrchr(me, '_'); |
||||||
|
char *tmp; |
||||||
|
char root[1024]; |
||||||
|
char test[64]; |
||||||
|
int port = grpc_pick_unused_port_or_die(); |
||||||
|
char *args[10]; |
||||||
|
int status; |
||||||
|
size_t i; |
||||||
|
gpr_subprocess *svr; |
||||||
|
/* figure out where we are */ |
||||||
|
if (lslash) { |
||||||
|
memcpy(root, me, (size_t)(lslash - me)); |
||||||
|
root[lslash - me] = 0; |
||||||
|
} else { |
||||||
|
strcpy(root, "."); |
||||||
|
} |
||||||
|
/* figure out our test name */ |
||||||
|
tmp = lunder - 1; |
||||||
|
while (*tmp != '_') tmp--; |
||||||
|
tmp++; |
||||||
|
memcpy(test, tmp, (size_t)(lunder - tmp)); |
||||||
|
/* start the server */ |
||||||
|
gpr_asprintf(&args[0], "%s/bad_ssl_%s_server%s", root, test, |
||||||
|
gpr_subprocess_binary_extension()); |
||||||
|
args[1] = "--bind"; |
||||||
|
gpr_join_host_port(&args[2], "::", port); |
||||||
|
svr = gpr_subprocess_create(4, (const char **)args); |
||||||
|
gpr_free(args[0]); |
||||||
|
|
||||||
|
for (i = 3; i <= 4; i++) { |
||||||
|
grpc_init(); |
||||||
|
run_test(args[2], i); |
||||||
|
grpc_shutdown(); |
||||||
|
} |
||||||
|
gpr_free(args[2]); |
||||||
|
|
||||||
|
gpr_subprocess_interrupt(svr); |
||||||
|
status = gpr_subprocess_join(svr); |
||||||
|
gpr_subprocess_destroy(svr); |
||||||
|
return status; |
||||||
|
} |
@ -0,0 +1,104 @@ |
|||||||
|
#!/usr/bin/env python2.7 |
||||||
|
# Copyright 2015, Google Inc. |
||||||
|
# All rights reserved. |
||||||
|
# |
||||||
|
# Redistribution and use in source and binary forms, with or without |
||||||
|
# modification, are permitted provided that the following conditions are |
||||||
|
# met: |
||||||
|
# |
||||||
|
# * Redistributions of source code must retain the above copyright |
||||||
|
# notice, this list of conditions and the following disclaimer. |
||||||
|
# * Redistributions in binary form must reproduce the above |
||||||
|
# copyright notice, this list of conditions and the following disclaimer |
||||||
|
# in the documentation and/or other materials provided with the |
||||||
|
# distribution. |
||||||
|
# * Neither the name of Google Inc. nor the names of its |
||||||
|
# contributors may be used to endorse or promote products derived from |
||||||
|
# this software without specific prior written permission. |
||||||
|
# |
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
|
||||||
|
"""Generates the appropriate build.json data for all the end2end tests.""" |
||||||
|
|
||||||
|
|
||||||
|
import collections |
||||||
|
import yaml |
||||||
|
|
||||||
|
TestOptions = collections.namedtuple('TestOptions', 'flaky') |
||||||
|
default_test_options = TestOptions(False) |
||||||
|
|
||||||
|
# maps test names to options |
||||||
|
BAD_CLIENT_TESTS = { |
||||||
|
'cert': default_test_options, |
||||||
|
'alpn': default_test_options, |
||||||
|
} |
||||||
|
|
||||||
|
def main(): |
||||||
|
json = { |
||||||
|
'#': 'generated with test/bad_ssl/gen_build_json.py', |
||||||
|
'libs': [ |
||||||
|
{ |
||||||
|
'name': 'bad_ssl_test_server', |
||||||
|
'build': 'private', |
||||||
|
'language': 'c', |
||||||
|
'src': ['test/core/bad_ssl/server.c'], |
||||||
|
'headers': ['test/core/bad_ssl/server.h'], |
||||||
|
'vs_proj_dir': 'test', |
||||||
|
'platforms': ['linux', 'posix', 'mac'], |
||||||
|
'deps': [ |
||||||
|
'grpc_test_util', |
||||||
|
'grpc', |
||||||
|
'gpr_test_util', |
||||||
|
'gpr' |
||||||
|
] |
||||||
|
} |
||||||
|
], |
||||||
|
'targets': [ |
||||||
|
{ |
||||||
|
'name': 'bad_ssl_%s_server' % t, |
||||||
|
'build': 'test', |
||||||
|
'language': 'c', |
||||||
|
'run': False, |
||||||
|
'src': ['test/core/bad_ssl/servers/%s.c' % t], |
||||||
|
'vs_proj_dir': 'test', |
||||||
|
'platforms': ['linux', 'posix', 'mac'], |
||||||
|
'deps': [ |
||||||
|
'bad_ssl_test_server', |
||||||
|
'grpc_test_util', |
||||||
|
'grpc', |
||||||
|
'gpr_test_util', |
||||||
|
'gpr' |
||||||
|
] |
||||||
|
} |
||||||
|
for t in sorted(BAD_CLIENT_TESTS.keys())] + [ |
||||||
|
{ |
||||||
|
'name': 'bad_ssl_%s_test' % t, |
||||||
|
'build': 'test', |
||||||
|
'language': 'c', |
||||||
|
'src': ['test/core/bad_ssl/bad_ssl_test.c'], |
||||||
|
'vs_proj_dir': 'test', |
||||||
|
'platforms': ['linux', 'posix', 'mac'], |
||||||
|
'deps': [ |
||||||
|
'grpc_test_util', |
||||||
|
'grpc', |
||||||
|
'gpr_test_util', |
||||||
|
'gpr' |
||||||
|
] |
||||||
|
} |
||||||
|
for t in sorted(BAD_CLIENT_TESTS.keys())]} |
||||||
|
print yaml.dump(json) |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
main() |
@ -0,0 +1,114 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* Copyright 2015, Google Inc. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* * Redistributions in binary form must reproduce the above |
||||||
|
* copyright notice, this list of conditions and the following disclaimer |
||||||
|
* in the documentation and/or other materials provided with the |
||||||
|
* distribution. |
||||||
|
* * Neither the name of Google Inc. nor the names of its |
||||||
|
* contributors may be used to endorse or promote products derived from |
||||||
|
* this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <grpc/support/cmdline.h> |
||||||
|
#include <grpc/support/log.h> |
||||||
|
#include <signal.h> |
||||||
|
|
||||||
|
#include "test/core/bad_ssl/server.h" |
||||||
|
#include "test/core/util/test_config.h" |
||||||
|
|
||||||
|
/* Common server implementation details for all servers in servers/.
|
||||||
|
* There's nothing *wrong* with these servers per-se, but they are |
||||||
|
* configured to cause some failure case in the SSL connection path. |
||||||
|
*/ |
||||||
|
|
||||||
|
static int got_sigint = 0; |
||||||
|
|
||||||
|
static void sigint_handler(int x) { got_sigint = 1; } |
||||||
|
|
||||||
|
const char *bad_ssl_addr(int argc, char **argv) { |
||||||
|
gpr_cmdline *cl; |
||||||
|
char *addr = NULL; |
||||||
|
cl = gpr_cmdline_create("test server"); |
||||||
|
gpr_cmdline_add_string(cl, "bind", "Bind host:port", &addr); |
||||||
|
gpr_cmdline_parse(cl, argc, argv); |
||||||
|
gpr_cmdline_destroy(cl); |
||||||
|
GPR_ASSERT(addr); |
||||||
|
return addr; |
||||||
|
} |
||||||
|
|
||||||
|
void bad_ssl_run(grpc_server *server) { |
||||||
|
int shutdown_started = 0; |
||||||
|
int shutdown_finished = 0; |
||||||
|
grpc_event ev; |
||||||
|
grpc_call_error error; |
||||||
|
grpc_call *s = NULL; |
||||||
|
grpc_call_details call_details; |
||||||
|
grpc_metadata_array request_metadata_recv; |
||||||
|
grpc_completion_queue *cq = grpc_completion_queue_create(NULL); |
||||||
|
|
||||||
|
grpc_call_details_init(&call_details); |
||||||
|
grpc_metadata_array_init(&request_metadata_recv); |
||||||
|
|
||||||
|
grpc_server_register_completion_queue(server, cq, NULL); |
||||||
|
grpc_server_start(server); |
||||||
|
|
||||||
|
error = |
||||||
|
grpc_server_request_call(server, &s, &call_details, |
||||||
|
&request_metadata_recv, cq, cq, (void*)1); |
||||||
|
GPR_ASSERT(GRPC_CALL_OK == error); |
||||||
|
|
||||||
|
signal(SIGINT, sigint_handler); |
||||||
|
while (!shutdown_finished) { |
||||||
|
if (got_sigint && !shutdown_started) { |
||||||
|
gpr_log(GPR_INFO, "Shutting down due to SIGINT"); |
||||||
|
grpc_server_shutdown_and_notify(server, cq, NULL); |
||||||
|
GPR_ASSERT(grpc_completion_queue_pluck( |
||||||
|
cq, NULL, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(5), NULL) |
||||||
|
.type == GRPC_OP_COMPLETE); |
||||||
|
grpc_completion_queue_shutdown(cq); |
||||||
|
shutdown_started = 1; |
||||||
|
} |
||||||
|
ev = grpc_completion_queue_next( |
||||||
|
cq, gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), |
||||||
|
gpr_time_from_micros(1000000, GPR_TIMESPAN)), |
||||||
|
NULL); |
||||||
|
switch (ev.type) { |
||||||
|
case GRPC_OP_COMPLETE: |
||||||
|
GPR_ASSERT(ev.tag == (void*)1); |
||||||
|
GPR_ASSERT(ev.success == 0); |
||||||
|
break; |
||||||
|
case GRPC_QUEUE_SHUTDOWN: |
||||||
|
GPR_ASSERT(shutdown_started); |
||||||
|
shutdown_finished = 1; |
||||||
|
break; |
||||||
|
case GRPC_QUEUE_TIMEOUT: |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
GPR_ASSERT(s == NULL); |
||||||
|
grpc_call_details_destroy(&call_details); |
||||||
|
grpc_metadata_array_destroy(&request_metadata_recv); |
||||||
|
} |
@ -0,0 +1,42 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* Copyright 2015, Google Inc. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* * Redistributions in binary form must reproduce the above |
||||||
|
* copyright notice, this list of conditions and the following disclaimer |
||||||
|
* in the documentation and/or other materials provided with the |
||||||
|
* distribution. |
||||||
|
* * Neither the name of Google Inc. nor the names of its |
||||||
|
* contributors may be used to endorse or promote products derived from |
||||||
|
* this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef GRPC_TEST_CORE_BAD_SSL_SERVER_H |
||||||
|
#define GRPC_TEST_CORE_BAD_SSL_SERVER_H |
||||||
|
|
||||||
|
#include <grpc/grpc.h> |
||||||
|
|
||||||
|
const char *bad_ssl_addr(int argc, char **argv); |
||||||
|
void bad_ssl_run(grpc_server *server); |
||||||
|
|
||||||
|
#endif /* GRPC_TEST_CORE_BAD_SSL_SERVER_H */ |
@ -0,0 +1,86 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* Copyright 2015, Google Inc. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* * Redistributions in binary form must reproduce the above |
||||||
|
* copyright notice, this list of conditions and the following disclaimer |
||||||
|
* in the documentation and/or other materials provided with the |
||||||
|
* distribution. |
||||||
|
* * Neither the name of Google Inc. nor the names of its |
||||||
|
* contributors may be used to endorse or promote products derived from |
||||||
|
* this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <string.h> |
||||||
|
|
||||||
|
#include <grpc/grpc.h> |
||||||
|
#include <grpc/grpc_security.h> |
||||||
|
#include <grpc/support/log.h> |
||||||
|
#include <grpc/support/useful.h> |
||||||
|
|
||||||
|
#include "src/core/transport/chttp2/alpn.h" |
||||||
|
#include "test/core/bad_ssl/server.h" |
||||||
|
#include "test/core/end2end/data/ssl_test_data.h" |
||||||
|
|
||||||
|
/* This test starts a server that is configured to advertise (via alpn and npn)
|
||||||
|
* a protocol that the connecting client does not support. It does this by |
||||||
|
* overriding the functions declared in alpn.c from the core library. */ |
||||||
|
|
||||||
|
static const char *const fake_versions[] = {"not-h2"}; |
||||||
|
|
||||||
|
int grpc_chttp2_is_alpn_version_supported(const char *version, size_t size) { |
||||||
|
size_t i; |
||||||
|
for (i = 0; i < GPR_ARRAY_SIZE(fake_versions); i++) { |
||||||
|
if (!strncmp(version, fake_versions[i], size)) return 1; |
||||||
|
} |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
size_t grpc_chttp2_num_alpn_versions(void) { |
||||||
|
return GPR_ARRAY_SIZE(fake_versions); |
||||||
|
} |
||||||
|
|
||||||
|
const char *grpc_chttp2_get_alpn_version_index(size_t i) { |
||||||
|
GPR_ASSERT(i < GPR_ARRAY_SIZE(fake_versions)); |
||||||
|
return fake_versions[i]; |
||||||
|
} |
||||||
|
|
||||||
|
int main(int argc, char **argv) { |
||||||
|
const char *addr = bad_ssl_addr(argc, argv); |
||||||
|
grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {test_server1_key, |
||||||
|
test_server1_cert}; |
||||||
|
grpc_server_credentials *ssl_creds; |
||||||
|
grpc_server *server; |
||||||
|
|
||||||
|
grpc_init(); |
||||||
|
ssl_creds = |
||||||
|
grpc_ssl_server_credentials_create(NULL, &pem_key_cert_pair, 1, 0, NULL); |
||||||
|
server = grpc_server_create(NULL, NULL); |
||||||
|
GPR_ASSERT(grpc_server_add_secure_http2_port(server, addr, ssl_creds)); |
||||||
|
grpc_server_credentials_release(ssl_creds); |
||||||
|
|
||||||
|
bad_ssl_run(server); |
||||||
|
grpc_shutdown(); |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
@ -0,0 +1,79 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* Copyright 2015, Google Inc. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* * Redistributions in binary form must reproduce the above |
||||||
|
* copyright notice, this list of conditions and the following disclaimer |
||||||
|
* in the documentation and/or other materials provided with the |
||||||
|
* distribution. |
||||||
|
* * Neither the name of Google Inc. nor the names of its |
||||||
|
* contributors may be used to endorse or promote products derived from |
||||||
|
* this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <string.h> |
||||||
|
|
||||||
|
#include <grpc/grpc.h> |
||||||
|
#include <grpc/grpc_security.h> |
||||||
|
#include <grpc/support/log.h> |
||||||
|
#include <grpc/support/useful.h> |
||||||
|
|
||||||
|
#include "src/core/support/file.h" |
||||||
|
|
||||||
|
#include "test/core/bad_ssl/server.h" |
||||||
|
#include "test/core/end2end/data/ssl_test_data.h" |
||||||
|
|
||||||
|
/* This server will present an untrusted cert to the connecting client,
|
||||||
|
* causing the SSL handshake to fail */ |
||||||
|
|
||||||
|
int main(int argc, char **argv) { |
||||||
|
const char *addr = bad_ssl_addr(argc, argv); |
||||||
|
grpc_ssl_pem_key_cert_pair pem_key_cert_pair; |
||||||
|
grpc_server_credentials *ssl_creds; |
||||||
|
grpc_server *server; |
||||||
|
gpr_slice cert_slice, key_slice; |
||||||
|
int ok; |
||||||
|
|
||||||
|
grpc_init(); |
||||||
|
|
||||||
|
cert_slice = gpr_load_file("src/core/tsi/test_creds/badserver.pem", 1, &ok); |
||||||
|
GPR_ASSERT(ok); |
||||||
|
key_slice = gpr_load_file("src/core/tsi/test_creds/badserver.key", 1, &ok); |
||||||
|
GPR_ASSERT(ok); |
||||||
|
pem_key_cert_pair.private_key = (const char *)GPR_SLICE_START_PTR(key_slice); |
||||||
|
pem_key_cert_pair.cert_chain = (const char *)GPR_SLICE_START_PTR(cert_slice); |
||||||
|
|
||||||
|
ssl_creds = |
||||||
|
grpc_ssl_server_credentials_create(NULL, &pem_key_cert_pair, 1, 0, NULL); |
||||||
|
server = grpc_server_create(NULL, NULL); |
||||||
|
GPR_ASSERT(grpc_server_add_secure_http2_port(server, addr, ssl_creds)); |
||||||
|
grpc_server_credentials_release(ssl_creds); |
||||||
|
|
||||||
|
gpr_slice_unref(cert_slice); |
||||||
|
gpr_slice_unref(key_slice); |
||||||
|
|
||||||
|
bad_ssl_run(server); |
||||||
|
grpc_shutdown(); |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
Loading…
Reference in new issue