Blame tests/mini-x509-2.c

Packit 549fdc
/*
Packit 549fdc
 * Copyright (C) 2008-2012 Free Software Foundation, Inc.
Packit 549fdc
 *
Packit 549fdc
 * Author: Simon Josefsson
Packit 549fdc
 *
Packit 549fdc
 * This file is part of GnuTLS.
Packit 549fdc
 *
Packit 549fdc
 * GnuTLS is free software; you can redistribute it and/or modify it
Packit 549fdc
 * under the terms of the GNU General Public License as published by
Packit 549fdc
 * the Free Software Foundation; either version 3 of the License, or
Packit 549fdc
 * (at your option) any later version.
Packit 549fdc
 *
Packit 549fdc
 * GnuTLS is distributed in the hope that it will be useful, but
Packit 549fdc
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 549fdc
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 549fdc
 * General Public License for more details.
Packit 549fdc
 *
Packit 549fdc
 * You should have received a copy of the GNU General Public License
Packit 549fdc
 * along with GnuTLS; if not, write to the Free Software Foundation,
Packit 549fdc
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
Packit 549fdc
 */
Packit 549fdc
Packit 549fdc
#ifdef HAVE_CONFIG_H
Packit 549fdc
#include <config.h>
Packit 549fdc
#endif
Packit 549fdc
Packit 549fdc
#include <stdio.h>
Packit 549fdc
#include <stdlib.h>
Packit 549fdc
#include <string.h>
Packit 549fdc
#include <errno.h>
Packit 549fdc
#include <gnutls/gnutls.h>
Packit 549fdc
#include <gnutls/x509.h>
Packit 549fdc
#include "utils.h"
Packit 549fdc
#include "eagain-common.h"
Packit 549fdc
Packit 549fdc
/* This tests gnutls_certificate_set_x509_key() */
Packit 549fdc
Packit 549fdc
const char *side;
Packit 549fdc
Packit 549fdc
static void tls_log_func(int level, const char *str)
Packit 549fdc
{
Packit 549fdc
	fprintf(stderr, "%s|<%d>| %s", side, level, str);
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
static unsigned char ca_cert_pem[] =
Packit 549fdc
"-----BEGIN CERTIFICATE-----\n"
Packit 549fdc
"MIIC4DCCAcigAwIBAgIBADANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDEwRDQS0w\n"
Packit 549fdc
"MCIYDzIwMTQwNDA5MDgwMjM0WhgPOTk5OTEyMzEyMzU5NTlaMA8xDTALBgNVBAMT\n"
Packit 549fdc
"BENBLTAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCuLSye8pe3yWKZ\n"
Packit 549fdc
"Yp7tLQ4ImwLqqh1aN7x9pc5spLDj6krVArzkyyYDcWvtQNDjErEfLUrZZrCc4aIl\n"
Packit 549fdc
"oU1Ghb92kI8ofZnHFbj3z5zdcWqiPppj5Y+hRdc4LszTWb+itrD9Ht/D67EK+m7W\n"
Packit 549fdc
"ev6xxUdyiBYUmb2O3CnPZpUVshMRtEe45EDGI5hUgL2n4Msj41htTq8hATYPXgoq\n"
Packit 549fdc
"gQUyXFpKAX5XDCyOG+FC6jmEys7UCRYv3SCl7TPWJ4cm+lHcFI2/OTOCBvMlKN2J\n"
Packit 549fdc
"mWCdfnudZldqthin+8fR9l4nbuutOfPNt1Dj9InDzWZ1W/o4LrjKa7fsvszj2Z5A\n"
Packit 549fdc
"Fn+xN/4zAgMBAAGjQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcE\n"
Packit 549fdc
"ADAdBgNVHQ4EFgQUwRHwbXyPosKNNkBiZduEwL5ZCwswDQYJKoZIhvcNAQELBQAD\n"
Packit 549fdc
"ggEBAEKr0b7WoJL+L8St/LEITU/i7FwFrCP6DkbaNo0kgzPmwnvNmw88MLI6UKwE\n"
Packit 549fdc
"JecnjFhurRBBZ4FA85ucNyizeBnuXqFcyJ20+XziaXGPKV/ugKyYv9KBoTYkQOCh\n"
Packit 549fdc
"nbOthmDqjvy2UYQj0BU2dOywkjUKWhYHEZLBpZYck0Orynxydwil5Ncsz4t3smJw\n"
Packit 549fdc
"ahzCW8SzBFTiO99qQBCH2RH1PbUYzfAnJxZS2VScpcqlu9pr+Qv7r8E3p9qHxnQM\n"
Packit 549fdc
"gO5laWO6lc13rNsbZRrtlCvacsiDSuDnS8EVXm0ih4fAntpRHacPbXZbOPQqJ/+1\n"
Packit 549fdc
"G7/qJ6cDC/9aW+fU80ogTkAoFg4=\n"
Packit 549fdc
"-----END CERTIFICATE-----\n";
Packit 549fdc
Packit 549fdc
const gnutls_datum_t ca_cert = { ca_cert_pem,
Packit 549fdc
	sizeof(ca_cert_pem)
Packit 549fdc
};
Packit 549fdc
Packit 549fdc
static unsigned char server_cert_pem[] =
Packit 549fdc
"-----BEGIN CERTIFICATE-----\n"
Packit 549fdc
"MIIDOjCCAiKgAwIBAgIMU0T+mwoDu5uVLKeeMA0GCSqGSIb3DQEBCwUAMA8xDTAL\n"
Packit 549fdc
"BgNVBAMTBENBLTEwIhgPMjAxNDA0MDkwODAyMzVaGA85OTk5MTIzMTIzNTk1OVow\n"
Packit 549fdc
"EzERMA8GA1UEAxMIc2VydmVyLTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\n"
Packit 549fdc
"AoIBAQDXfvgsMWXHNf3iUaEoZSNztZZr6+UdBkoUhbdWJDR+GwR+GHfnYaYHsuqb\n"
Packit 549fdc
"bNEl/QFI+8Jeth0SmG7TNB+b/AlHFoBm8TwBt7H+Mn6AQIdo872Vs262UkHgbZN6\n"
Packit 549fdc
"dEQeRCgiXmlsOVe+MVpf79Xi32MYz1FZ/ueS6tr8sIDhECThIZkq2eulVjAV86N2\n"
Packit 549fdc
"zQ72Ml1k8rPw4SdK5OFhcXNdXr6CsAol8MmiORKDF0iAZxwtFVc00nBGqQC5rwrN\n"
Packit 549fdc
"3A8czH5TsvyvrcW0mwV2XOVvZM5kFM1T/X0jF6RQHiGGFBYK4s6JZxSSOhJMFYYh\n"
Packit 549fdc
"koPEKsuVZdmBJ2yTTdGumHZfG9LDAgMBAAGjgY0wgYowDAYDVR0TAQH/BAIwADAU\n"
Packit 549fdc
"BgNVHREEDTALgglsb2NhbGhvc3QwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0P\n"
Packit 549fdc
"AQH/BAUDAwegADAdBgNVHQ4EFgQURXiN5VD5vgqAprhd/37ldGKv4/4wHwYDVR0j\n"
Packit 549fdc
"BBgwFoAU8MUzmkotjSmVa5r1ejMkMQ6BiZYwDQYJKoZIhvcNAQELBQADggEBABSU\n"
Packit 549fdc
"cmMX0nGeg43itPnLjSTIUuYEamRhfsFDwgRYQn5w+BcFG1p0scBRxLAShUEb9A2A\n"
Packit 549fdc
"oEJV4rQDpCn9bcMrMHhTCR5sOlLh/2o9BROjK0+DjQLDkooQK5xa+1GYEiy6QYCx\n"
Packit 549fdc
"QjdCCnMhHh24oP2/vUggRKhevvD2QQFKcCDT6n13RFYm+HX82gIh6SAtRs0oahY5\n"
Packit 549fdc
"k9CM9TYRPzXy+tQqhZisJzc8BLTW/XA97kAJW6+hUhPir7AYR6BKJhNeIxcN/yMy\n"
Packit 549fdc
"jsHzWDLezip/8q+kzw658V5e40hne7ZaJycGUaUdLVnJcpNtBgGE82TRS/XZSQKF\n"
Packit 549fdc
"fpy8FLGcJynqlIOzdKs=\n"
Packit 549fdc
"-----END CERTIFICATE-----\n"
Packit 549fdc
"-----BEGIN CERTIFICATE-----\n"
Packit 549fdc
"MIIDATCCAemgAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDEwRDQS0w\n"
Packit 549fdc
"MCIYDzIwMTQwNDA5MDgwMjM0WhgPOTk5OTEyMzEyMzU5NTlaMA8xDTALBgNVBAMT\n"
Packit 549fdc
"BENBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZq3sA+mjFadII\n"
Packit 549fdc
"EMDHfj1fYh+UOUSa8c814E9NfCdYZ9Z11BmPpBeR5mXV12j1DKjkTlqTUL7s4lVR\n"
Packit 549fdc
"RKfyAdCpQIfeXHDeTYYUq2uBnbi5YMG5Y+WbCiYacgRU3IypYrSzaeh1mY7GiEFe\n"
Packit 549fdc
"U/NaImHLCf+TdAvTJ3Fo0QPe5QN2Lrv6l//cqOv7enZ91KRWxClDMM6EAr+C/7dk\n"
Packit 549fdc
"rOTXRrCuH/e/KVBXEJ/YeSYPmBIwolGktRrGdsVagdqYArr4dhJ7VThIVRUX1Ijl\n"
Packit 549fdc
"THCLstI/LuD8WkDccU3ZSdm47f2U43p/+rSO0MiNOXiaskeK56G/9DbJEeETUbzm\n"
Packit 549fdc
"/B2712MVAgMBAAGjZDBiMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcE\n"
Packit 549fdc
"ADAdBgNVHQ4EFgQU8MUzmkotjSmVa5r1ejMkMQ6BiZYwHwYDVR0jBBgwFoAUwRHw\n"
Packit 549fdc
"bXyPosKNNkBiZduEwL5ZCwswDQYJKoZIhvcNAQELBQADggEBACKxBPj9u1t52uIF\n"
Packit 549fdc
"eQ2JPb8/u+MBttvSLo0qPKXwpc4q8hNclh66dpqGWiF0iSumsKyKU54r6CIF9Ikm\n"
Packit 549fdc
"t1V1GR9Ll4iTnz3NdIt1w3ns8rSlU5O/dgKysK/1C/5xJWEUYtEO5mnyi4Zaf8FB\n"
Packit 549fdc
"hKmQ1aWF5dTB81PVAQxyCiFEnH7YumK7pJeIpnCOPIqLZLUHfrTUeL8zONF4i5Sb\n"
Packit 549fdc
"7taZ8SQ6b7IaioU+NJ50uT2wy34lsyvCWf76Azezv9bggkdNDo/7ktMgsfRrSyM8\n"
Packit 549fdc
"+MVob5ePGTjKx5yMy/sy2vUkkefwW3RiEss/y2JRb8Hw7nDlA9ttilYKFwGFwRvw\n"
Packit 549fdc
"KRsXqo8=\n"
Packit 549fdc
"-----END CERTIFICATE-----\n";
Packit 549fdc
Packit 549fdc
const gnutls_datum_t server_cert = { server_cert_pem,
Packit 549fdc
	sizeof(server_cert_pem)
Packit 549fdc
};
Packit 549fdc
Packit 549fdc
static unsigned char server_key_pem[] =
Packit 549fdc
"-----BEGIN RSA PRIVATE KEY-----\n"
Packit 549fdc
"MIIEpAIBAAKCAQEA1374LDFlxzX94lGhKGUjc7WWa+vlHQZKFIW3ViQ0fhsEfhh3\n"
Packit 549fdc
"52GmB7Lqm2zRJf0BSPvCXrYdEphu0zQfm/wJRxaAZvE8Abex/jJ+gECHaPO9lbNu\n"
Packit 549fdc
"tlJB4G2TenREHkQoIl5pbDlXvjFaX+/V4t9jGM9RWf7nkura/LCA4RAk4SGZKtnr\n"
Packit 549fdc
"pVYwFfOjds0O9jJdZPKz8OEnSuThYXFzXV6+grAKJfDJojkSgxdIgGccLRVXNNJw\n"
Packit 549fdc
"RqkAua8KzdwPHMx+U7L8r63FtJsFdlzlb2TOZBTNU/19IxekUB4hhhQWCuLOiWcU\n"
Packit 549fdc
"kjoSTBWGIZKDxCrLlWXZgSdsk03Rrph2XxvSwwIDAQABAoIBAB7trDS7ij4DM8MN\n"
Packit 549fdc
"sDGaAnKS91nZ63I0+uDjKCMG4znOKuDmJh9hVnD4bs+L2KC5JTwSVh09ygJnOlC5\n"
Packit 549fdc
"xGegzrwTMK6VpOUiNjujh6BkooqfoPAhZpxoReguEeKbWUN2yMPWBQ9xU3SKpMvs\n"
Packit 549fdc
"IiiDozdmWeiuuxHM/00REA49QO3Gnx2logeB+fcvXXD1UiZV3x0xxSApiJt1sr2r\n"
Packit 549fdc
"NmqSyGdNUgpmnTP8zbKnDaRe5Wj4tj1TCTLE/HZ0tzdRuwlkIqvcpGg1LMtKm5N8\n"
Packit 549fdc
"xIWjTGMFwGjG+OF8LGqHLH+28pI3iMB6QqO2YLwOp+WZKImKP3+Dp3s8lCw8t8cm\n"
Packit 549fdc
"q5/Qc9ECgYEA2xwxm+pFkrFmZNLCakP/6S5AZqpfSBRUlF/uX2pBKO7o6I6aOV9o\n"
Packit 549fdc
"zq2QWYIZfdyD+9MvAFUQ36sWfTVWpGA34WGtsGtcRRygKKTigpJHvBldaPxiuYuk\n"
Packit 549fdc
"xbS54nWUdix/JzyQAy22xJXlp4XJvtFJjHhA2td0XA7tfng9n8jmvEUCgYEA+8cA\n"
Packit 549fdc
"uFIQFbaZ2y6pnOvlVj8OH0f1hZa9M+3q01fWy1rnDAsLrIzJy8TZnBtpDwy9lAun\n"
Packit 549fdc
"Sa6wzu6qeHmF17xwk5U7BCyK2Qj/9KhRLg1mnDebQ/CiLSAaJVnrYFp9Du96fTkN\n"
Packit 549fdc
"ollvbFiGF92QwPTDf2f1gHZQEPwa+f/ox37ad2cCgYEAwMgXpfUD7cOEMeV2BQV7\n"
Packit 549fdc
"XnDBXRM97i9lE38sPmtAlYFPD36Yly4pCt+PCBH9181zmtf+nK47wG/Jw7RwXQQD\n"
Packit 549fdc
"ZpwItBZiArTi/Z/FY9jMoOU4WKznOBVzjjgq7ONDEo6n+Z/BnepUyraQb0q5bNi7\n"
Packit 549fdc
"e4o6ldHHoU/JCeNFZRbgXHkCgYA6vJU9at+XwS6phHxLQHkTIsivoYD0tlLTX4it\n"
Packit 549fdc
"30sby8wk8hq6GWomYHkHwxlCSo2bkRBozxkuXV1ll6wSxUJaG7FV6vJFaaUUtYOi\n"
Packit 549fdc
"w7uRbCOLuQKMlnWjCxQvOUz9g/7GYd39ZvHoi8pUnPrdGPzWpzEN1AwfukCs2/e5\n"
Packit 549fdc
"Oq3KtwKBgQCkHmDU8h0kOfN28f8ZiyjJemQMNoOGiJqnGexaKvsRd+bt4H+7DsWQ\n"
Packit 549fdc
"OnyKm/oR0wCCSmFM5aQc6GgzPD7orueKVYHChbY7HLTWKRHNs6Rlk+6hXJvOld0i\n"
Packit 549fdc
"Cl7KqL2x2ibGMtt4LtSntdzWqa87N7vCWMSTmvd8uLgflBs33xUIiQ==\n"
Packit 549fdc
"-----END RSA PRIVATE KEY-----\n";
Packit 549fdc
Packit 549fdc
static unsigned char cert_pem[] =
Packit 549fdc
    "-----BEGIN CERTIFICATE-----\n"
Packit 549fdc
    "MIICHjCCAYmgAwIBAgIERiYdNzALBgkqhkiG9w0BAQUwGTEXMBUGA1UEAxMOR251\n"
Packit 549fdc
    "VExTIHRlc3QgQ0EwHhcNMDcwNDE4MTMyOTI3WhcNMDgwNDE3MTMyOTI3WjAdMRsw\n"
Packit 549fdc
    "GQYDVQQDExJHbnVUTFMgdGVzdCBjbGllbnQwgZwwCwYJKoZIhvcNAQEBA4GMADCB\n"
Packit 549fdc
    "iAKBgLtmQ/Xyxde2jMzF3/WIO7HJS2oOoa0gUEAIgKFPXKPQ+GzP5jz37AR2ExeL\n"
Packit 549fdc
    "ZIkiW8DdU3w77XwEu4C5KL6Om8aOoKUSy/VXHqLnu7czSZ/ju0quak1o/8kR4jKN\n"
Packit 549fdc
    "zj2AC41179gAgY8oBAOgIo1hBAf6tjd9IQdJ0glhaZiQo1ipAgMBAAGjdjB0MAwG\n"
Packit 549fdc
    "A1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDwYDVR0PAQH/BAUDAweg\n"
Packit 549fdc
    "ADAdBgNVHQ4EFgQUTLkKm/odNON+3svSBxX+odrLaJEwHwYDVR0jBBgwFoAU6Twc\n"
Packit 549fdc
    "+62SbuYGpFYsouHAUyfI8pUwCwYJKoZIhvcNAQEFA4GBALujmBJVZnvaTXr9cFRJ\n"
Packit 549fdc
    "jpfc/3X7sLUsMvumcDE01ls/cG5mIatmiyEU9qI3jbgUf82z23ON/acwJf875D3/\n"
Packit 549fdc
    "U7jyOsBJ44SEQITbin2yUeJMIm1tievvdNXBDfW95AM507ShzP12sfiJkJfjjdhy\n"
Packit 549fdc
    "dc8Siq5JojruiMizAf0pA7in\n" "-----END CERTIFICATE-----\n";
Packit 549fdc
const gnutls_datum_t cli_cert = { cert_pem, sizeof(cert_pem) - 1};
Packit 549fdc
Packit 549fdc
static unsigned char key_pem[] =
Packit 549fdc
    "-----BEGIN RSA PRIVATE KEY-----\n"
Packit 549fdc
    "MIICXAIBAAKBgQC7ZkP18sXXtozMxd/1iDuxyUtqDqGtIFBACIChT1yj0Phsz+Y8\n"
Packit 549fdc
    "9+wEdhMXi2SJIlvA3VN8O+18BLuAuSi+jpvGjqClEsv1Vx6i57u3M0mf47tKrmpN\n"
Packit 549fdc
    "aP/JEeIyjc49gAuNde/YAIGPKAQDoCKNYQQH+rY3fSEHSdIJYWmYkKNYqQIDAQAB\n"
Packit 549fdc
    "AoGADpmARG5CQxS+AesNkGmpauepiCz1JBF/JwnyiX6vEzUh0Ypd39SZztwrDxvF\n"
Packit 549fdc
    "PJjQaKVljml1zkJpIDVsqvHdyVdse8M+Qn6hw4x2p5rogdvhhIL1mdWo7jWeVJTF\n"
Packit 549fdc
    "RKB7zLdMPs3ySdtcIQaF9nUAQ2KJEvldkO3m/bRJFEp54k0CQQDYy+RlTmwRD6hy\n"
Packit 549fdc
    "7UtMjR0H3CSZJeQ8svMCxHLmOluG9H1UKk55ZBYfRTsXniqUkJBZ5wuV1L+pR9EK\n"
Packit 549fdc
    "ca89a+1VAkEA3UmBelwEv2u9cAU1QjKjmwju1JgXbrjEohK+3B5y0ESEXPAwNQT9\n"
Packit 549fdc
    "TrDM1m9AyxYTWLxX93dI5QwNFJtmbtjeBQJARSCWXhsoaDRG8QZrCSjBxfzTCqZD\n"
Packit 549fdc
    "ZXtl807ymCipgJm60LiAt0JLr4LiucAsMZz6+j+quQbSakbFCACB8SLV1QJBAKZQ\n"
Packit 549fdc
    "YKf+EPNtnmta/rRKKvySsi3GQZZN+Dt3q0r094XgeTsAqrqujVNfPhTMeP4qEVBX\n"
Packit 549fdc
    "/iVX2cmMTSh3w3z8MaECQEp0XJWDVKOwcTW6Ajp9SowtmiZ3YDYo1LF9igb4iaLv\n"
Packit 549fdc
    "sWZGfbnU3ryjvkb6YuFjgtzbZDZHWQCo8/cOtOBmPdk=\n"
Packit 549fdc
    "-----END RSA PRIVATE KEY-----\n";
Packit 549fdc
const gnutls_datum_t cli_key = { key_pem, sizeof(key_pem) - 1};
Packit 549fdc
Packit 549fdc
const gnutls_datum_t server_key = { server_key_pem,
Packit 549fdc
	sizeof(server_key_pem)
Packit 549fdc
};
Packit 549fdc
Packit 549fdc
void doit(void)
Packit 549fdc
{
Packit 549fdc
	int exit_code = EXIT_SUCCESS;
Packit 549fdc
	int ret;
Packit 549fdc
	/* Server stuff. */
Packit 549fdc
	gnutls_certificate_credentials_t serverx509cred;
Packit 549fdc
	gnutls_session_t server;
Packit 549fdc
	int sret = GNUTLS_E_AGAIN;
Packit 549fdc
	/* Client stuff. */
Packit 549fdc
	gnutls_certificate_credentials_t clientx509cred;
Packit 549fdc
	gnutls_session_t client;
Packit 549fdc
	int cret = GNUTLS_E_AGAIN;
Packit 549fdc
	gnutls_x509_crt_t *crts;
Packit 549fdc
	unsigned int crts_size;
Packit 549fdc
	unsigned i;
Packit 549fdc
	gnutls_x509_privkey_t pkey;
Packit 549fdc
Packit 549fdc
	/* General init. */
Packit 549fdc
	global_init();
Packit 549fdc
	gnutls_global_set_log_function(tls_log_func);
Packit 549fdc
	if (debug)
Packit 549fdc
		gnutls_global_set_log_level(2);
Packit 549fdc
Packit 549fdc
	ret = gnutls_x509_crt_list_import2(&crts, &crts_size, &server_cert, GNUTLS_X509_FMT_PEM,
Packit 549fdc
			GNUTLS_X509_CRT_LIST_FAIL_IF_UNSORTED);
Packit 549fdc
	if (ret < 0) {
Packit 549fdc
		fprintf(stderr, "error: %s\n", gnutls_strerror(ret));
Packit 549fdc
		exit(1);
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	ret = gnutls_x509_privkey_init(&pkey);
Packit 549fdc
	if (ret < 0) {
Packit 549fdc
		fprintf(stderr, "error: %s\n", gnutls_strerror(ret));
Packit 549fdc
		exit(1);
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	ret =
Packit 549fdc
	    gnutls_x509_privkey_import(pkey, &server_key,
Packit 549fdc
					GNUTLS_X509_FMT_PEM);
Packit 549fdc
	if (ret < 0) {
Packit 549fdc
		fprintf(stderr, "error: %s\n", gnutls_strerror(ret));
Packit 549fdc
		exit(1);
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	/* Init server */
Packit 549fdc
	gnutls_certificate_allocate_credentials(&serverx509cred);
Packit 549fdc
	gnutls_certificate_set_x509_key(serverx509cred, crts, crts_size, pkey);
Packit 549fdc
	gnutls_x509_privkey_deinit(pkey);
Packit 549fdc
	for (i=0;i
Packit 549fdc
		gnutls_x509_crt_deinit(crts[i]);
Packit 549fdc
	gnutls_free(crts);
Packit 549fdc
Packit 549fdc
	gnutls_init(&server, GNUTLS_SERVER);
Packit 549fdc
	gnutls_credentials_set(server, GNUTLS_CRD_CERTIFICATE,
Packit 549fdc
				serverx509cred);
Packit 549fdc
	gnutls_priority_set_direct(server,
Packit 549fdc
				   "NORMAL:-CIPHER-ALL:+AES-128-GCM",
Packit 549fdc
				   NULL);
Packit 549fdc
	gnutls_transport_set_push_function(server, server_push);
Packit 549fdc
	gnutls_transport_set_pull_function(server, server_pull);
Packit 549fdc
	gnutls_transport_set_ptr(server, server);
Packit 549fdc
	gnutls_certificate_server_set_request(server, GNUTLS_CERT_REQUEST);
Packit 549fdc
Packit 549fdc
	/* Init client */
Packit 549fdc
	/* Init client */
Packit 549fdc
	ret = gnutls_certificate_allocate_credentials(&clientx509cred);
Packit 549fdc
	if (ret < 0)
Packit 549fdc
		exit(1);
Packit 549fdc
Packit 549fdc
	ret = gnutls_certificate_set_x509_trust_mem(clientx509cred, &ca_cert, GNUTLS_X509_FMT_PEM);
Packit 549fdc
	if (ret < 0)
Packit 549fdc
		exit(1);
Packit 549fdc
Packit 549fdc
	ret = gnutls_certificate_set_x509_key_mem(clientx509cred,
Packit 549fdc
						  &cli_cert, &cli_key,
Packit 549fdc
						  GNUTLS_X509_FMT_PEM);
Packit 549fdc
Packit 549fdc
	ret = gnutls_init(&client, GNUTLS_CLIENT);
Packit 549fdc
	if (ret < 0)
Packit 549fdc
		exit(1);
Packit 549fdc
Packit 549fdc
	ret = gnutls_credentials_set(client, GNUTLS_CRD_CERTIFICATE,
Packit 549fdc
				clientx509cred);
Packit 549fdc
	if (ret < 0)
Packit 549fdc
		exit(1);
Packit 549fdc
Packit 549fdc
	gnutls_priority_set_direct(client, "NORMAL", NULL);
Packit 549fdc
	gnutls_transport_set_push_function(client, client_push);
Packit 549fdc
	gnutls_transport_set_pull_function(client, client_pull);
Packit 549fdc
	gnutls_transport_set_ptr(client, client);
Packit 549fdc
Packit 549fdc
	HANDSHAKE(client, server);
Packit 549fdc
Packit 549fdc
	/* check gnutls_certificate_get_ours() - server side */
Packit 549fdc
	{
Packit 549fdc
		const gnutls_datum_t *mcert;
Packit 549fdc
		gnutls_datum_t scert;
Packit 549fdc
		gnutls_x509_crt_t crt;
Packit 549fdc
Packit 549fdc
		mcert = gnutls_certificate_get_ours(server);
Packit 549fdc
		if (mcert == NULL) {
Packit 549fdc
			fail("gnutls_certificate_get_ours(): failed\n");
Packit 549fdc
			exit(1);
Packit 549fdc
		}
Packit 549fdc
Packit 549fdc
		gnutls_x509_crt_init(&crt;;
Packit 549fdc
		ret = gnutls_x509_crt_import(crt, &server_cert, GNUTLS_X509_FMT_PEM);
Packit 549fdc
		if (ret < 0) {
Packit 549fdc
			fail("gnutls_x509_crt_import: %s\n", gnutls_strerror(ret));
Packit 549fdc
			exit(1);
Packit 549fdc
		}
Packit 549fdc
Packit 549fdc
		ret = gnutls_x509_crt_export2(crt, GNUTLS_X509_FMT_DER, &scert);
Packit 549fdc
		if (ret < 0) {
Packit 549fdc
			fail("gnutls_x509_crt_export2: %s\n", gnutls_strerror(ret));
Packit 549fdc
			exit(1);
Packit 549fdc
		}
Packit 549fdc
		gnutls_x509_crt_deinit(crt);
Packit 549fdc
Packit 549fdc
		if (scert.size != mcert->size || memcmp(scert.data, mcert->data, mcert->size) != 0) {
Packit 549fdc
			fail("gnutls_certificate_get_ours output doesn't match cert\n");
Packit 549fdc
			exit(1);
Packit 549fdc
		}
Packit 549fdc
		gnutls_free(scert.data);
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	/* check gnutls_certificate_get_ours() - client side */
Packit 549fdc
	{
Packit 549fdc
		const gnutls_datum_t *mcert;
Packit 549fdc
		gnutls_datum_t ccert;
Packit 549fdc
		gnutls_x509_crt_t crt;
Packit 549fdc
Packit 549fdc
		mcert = gnutls_certificate_get_ours(client);
Packit 549fdc
		if (mcert == NULL) {
Packit 549fdc
			fail("gnutls_certificate_get_ours(): failed\n");
Packit 549fdc
			exit(1);
Packit 549fdc
		}
Packit 549fdc
Packit 549fdc
		gnutls_x509_crt_init(&crt;;
Packit 549fdc
		ret = gnutls_x509_crt_import(crt, &cli_cert, GNUTLS_X509_FMT_PEM);
Packit 549fdc
		if (ret < 0) {
Packit 549fdc
			fail("gnutls_x509_crt_import: %s\n", gnutls_strerror(ret));
Packit 549fdc
			exit(1);
Packit 549fdc
		}
Packit 549fdc
Packit 549fdc
		ret = gnutls_x509_crt_export2(crt, GNUTLS_X509_FMT_DER, &ccert);
Packit 549fdc
		if (ret < 0) {
Packit 549fdc
			fail("gnutls_x509_crt_export2: %s\n", gnutls_strerror(ret));
Packit 549fdc
			exit(1);
Packit 549fdc
		}
Packit 549fdc
		gnutls_x509_crt_deinit(crt);
Packit 549fdc
Packit 549fdc
		if (ccert.size != mcert->size || memcmp(ccert.data, mcert->data, mcert->size) != 0) {
Packit 549fdc
			fail("gnutls_certificate_get_ours output doesn't match cert\n");
Packit 549fdc
			exit(1);
Packit 549fdc
		}
Packit 549fdc
		gnutls_free(ccert.data);
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	/* check the number of certificates received */
Packit 549fdc
	{
Packit 549fdc
		unsigned cert_list_size = 0;
Packit 549fdc
		gnutls_typed_vdata_st data[2];
Packit 549fdc
		unsigned status;
Packit 549fdc
Packit 549fdc
		memset(data, 0, sizeof(data));
Packit 549fdc
Packit 549fdc
		/* check with wrong hostname */
Packit 549fdc
		data[0].type = GNUTLS_DT_DNS_HOSTNAME;
Packit 549fdc
		data[0].data = (void*)"localhost1";
Packit 549fdc
Packit 549fdc
		data[1].type = GNUTLS_DT_KEY_PURPOSE_OID;
Packit 549fdc
		data[1].data = (void*)GNUTLS_KP_TLS_WWW_SERVER;
Packit 549fdc
Packit 549fdc
		gnutls_certificate_get_peers(client, &cert_list_size);
Packit 549fdc
		if (cert_list_size < 2) {
Packit 549fdc
			fprintf(stderr, "received a certificate list of %d!\n", cert_list_size);
Packit 549fdc
			exit(1);
Packit 549fdc
		}
Packit 549fdc
Packit 549fdc
		ret = gnutls_certificate_verify_peers(client, data, 2, &status);
Packit 549fdc
		if (ret < 0) {
Packit 549fdc
			fprintf(stderr, "could not verify certificate: %s\n", gnutls_strerror(ret));
Packit 549fdc
			exit(1);
Packit 549fdc
		}
Packit 549fdc
Packit 549fdc
		if (status == 0) {
Packit 549fdc
			fprintf(stderr, "should not have accepted!\n");
Packit 549fdc
			exit(1);
Packit 549fdc
		}
Packit 549fdc
Packit 549fdc
		/* check with wrong purpose */
Packit 549fdc
		data[0].type = GNUTLS_DT_DNS_HOSTNAME;
Packit 549fdc
		data[0].data = (void*)"localhost";
Packit 549fdc
Packit 549fdc
		data[1].type = GNUTLS_DT_KEY_PURPOSE_OID;
Packit 549fdc
		data[1].data = (void*)GNUTLS_KP_TLS_WWW_CLIENT;
Packit 549fdc
Packit 549fdc
		gnutls_certificate_get_peers(client, &cert_list_size);
Packit 549fdc
		if (cert_list_size < 2) {
Packit 549fdc
			fprintf(stderr, "received a certificate list of %d!\n", cert_list_size);
Packit 549fdc
			exit(1);
Packit 549fdc
		}
Packit 549fdc
Packit 549fdc
		ret = gnutls_certificate_verify_peers(client, data, 2, &status);
Packit 549fdc
		if (ret < 0) {
Packit 549fdc
			fprintf(stderr, "could not verify certificate: %s\n", gnutls_strerror(ret));
Packit 549fdc
			exit(1);
Packit 549fdc
		}
Packit 549fdc
Packit 549fdc
		if (status == 0) {
Packit 549fdc
			fprintf(stderr, "should not have accepted!\n");
Packit 549fdc
			exit(1);
Packit 549fdc
		}
Packit 549fdc
Packit 549fdc
		/* check with correct purpose */
Packit 549fdc
		data[0].type = GNUTLS_DT_DNS_HOSTNAME;
Packit 549fdc
		data[0].data = (void*)"localhost";
Packit 549fdc
Packit 549fdc
		data[1].type = GNUTLS_DT_KEY_PURPOSE_OID;
Packit 549fdc
		data[1].data = (void*)GNUTLS_KP_TLS_WWW_SERVER;
Packit 549fdc
Packit 549fdc
		ret = gnutls_certificate_verify_peers(client, data, 2, &status);
Packit 549fdc
		if (ret < 0) {
Packit 549fdc
			fprintf(stderr, "could not verify certificate: %s\n", gnutls_strerror(ret));
Packit 549fdc
			exit(1);
Packit 549fdc
		}
Packit 549fdc
Packit 549fdc
		if (status != 0) {
Packit 549fdc
			fprintf(stderr, "could not verify certificate: %.4x\n", status);
Packit 549fdc
			exit(1);
Packit 549fdc
		}
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	gnutls_bye(client, GNUTLS_SHUT_RDWR);
Packit 549fdc
	gnutls_bye(server, GNUTLS_SHUT_RDWR);
Packit 549fdc
Packit 549fdc
	gnutls_deinit(client);
Packit 549fdc
	gnutls_deinit(server);
Packit 549fdc
Packit 549fdc
	gnutls_certificate_free_credentials(serverx509cred);
Packit 549fdc
	gnutls_certificate_free_credentials(clientx509cred);
Packit 549fdc
Packit 549fdc
	gnutls_global_deinit();
Packit 549fdc
Packit 549fdc
	if (debug > 0) {
Packit 549fdc
		if (exit_code == 0)
Packit 549fdc
			puts("Self-test successful");
Packit 549fdc
		else
Packit 549fdc
			puts("Self-test failed");
Packit 549fdc
	}
Packit 549fdc
}