Example program to test AES-GCM functionality. Used for a workshop

Dependencies:   mbed

Committer:
HannesTschofenig
Date:
Thu Sep 27 06:34:22 2018 +0000
Revision:
0:796d0f61a05b
Example AES-GCM test program

Who changed what in which revision?

UserRevisionLine numberNew contents of line
HannesTschofenig 0:796d0f61a05b 1 /*
HannesTschofenig 0:796d0f61a05b 2 * X.509 Certificate Signing Request writing
HannesTschofenig 0:796d0f61a05b 3 *
HannesTschofenig 0:796d0f61a05b 4 * Copyright (C) 2006-2014, Brainspark B.V.
HannesTschofenig 0:796d0f61a05b 5 *
HannesTschofenig 0:796d0f61a05b 6 * This file is part of PolarSSL (http://www.polarssl.org)
HannesTschofenig 0:796d0f61a05b 7 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
HannesTschofenig 0:796d0f61a05b 8 *
HannesTschofenig 0:796d0f61a05b 9 * All rights reserved.
HannesTschofenig 0:796d0f61a05b 10 *
HannesTschofenig 0:796d0f61a05b 11 * This program is free software; you can redistribute it and/or modify
HannesTschofenig 0:796d0f61a05b 12 * it under the terms of the GNU General Public License as published by
HannesTschofenig 0:796d0f61a05b 13 * the Free Software Foundation; either version 2 of the License, or
HannesTschofenig 0:796d0f61a05b 14 * (at your option) any later version.
HannesTschofenig 0:796d0f61a05b 15 *
HannesTschofenig 0:796d0f61a05b 16 * This program is distributed in the hope that it will be useful,
HannesTschofenig 0:796d0f61a05b 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
HannesTschofenig 0:796d0f61a05b 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
HannesTschofenig 0:796d0f61a05b 19 * GNU General Public License for more details.
HannesTschofenig 0:796d0f61a05b 20 *
HannesTschofenig 0:796d0f61a05b 21 * You should have received a copy of the GNU General Public License along
HannesTschofenig 0:796d0f61a05b 22 * with this program; if not, write to the Free Software Foundation, Inc.,
HannesTschofenig 0:796d0f61a05b 23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
HannesTschofenig 0:796d0f61a05b 24 */
HannesTschofenig 0:796d0f61a05b 25 /*
HannesTschofenig 0:796d0f61a05b 26 * References:
HannesTschofenig 0:796d0f61a05b 27 * - CSRs: PKCS#10 v1.7 aka RFC 2986
HannesTschofenig 0:796d0f61a05b 28 * - attributes: PKCS#9 v2.0 aka RFC 2985
HannesTschofenig 0:796d0f61a05b 29 */
HannesTschofenig 0:796d0f61a05b 30
HannesTschofenig 0:796d0f61a05b 31 #if !defined(POLARSSL_CONFIG_FILE)
HannesTschofenig 0:796d0f61a05b 32 #include "polarssl/config.h"
HannesTschofenig 0:796d0f61a05b 33 #else
HannesTschofenig 0:796d0f61a05b 34 #include POLARSSL_CONFIG_FILE
HannesTschofenig 0:796d0f61a05b 35 #endif
HannesTschofenig 0:796d0f61a05b 36
HannesTschofenig 0:796d0f61a05b 37 #if defined(POLARSSL_X509_CSR_WRITE_C)
HannesTschofenig 0:796d0f61a05b 38
HannesTschofenig 0:796d0f61a05b 39 #include "polarssl/x509_csr.h"
HannesTschofenig 0:796d0f61a05b 40 #include "polarssl/oid.h"
HannesTschofenig 0:796d0f61a05b 41 #include "polarssl/asn1write.h"
HannesTschofenig 0:796d0f61a05b 42
HannesTschofenig 0:796d0f61a05b 43 #if defined(POLARSSL_PEM_WRITE_C)
HannesTschofenig 0:796d0f61a05b 44 #include "polarssl/pem.h"
HannesTschofenig 0:796d0f61a05b 45 #endif
HannesTschofenig 0:796d0f61a05b 46
HannesTschofenig 0:796d0f61a05b 47 #include <string.h>
HannesTschofenig 0:796d0f61a05b 48 #include <stdlib.h>
HannesTschofenig 0:796d0f61a05b 49
HannesTschofenig 0:796d0f61a05b 50 void x509write_csr_init( x509write_csr *ctx )
HannesTschofenig 0:796d0f61a05b 51 {
HannesTschofenig 0:796d0f61a05b 52 memset( ctx, 0, sizeof(x509write_csr) );
HannesTschofenig 0:796d0f61a05b 53 }
HannesTschofenig 0:796d0f61a05b 54
HannesTschofenig 0:796d0f61a05b 55 void x509write_csr_free( x509write_csr *ctx )
HannesTschofenig 0:796d0f61a05b 56 {
HannesTschofenig 0:796d0f61a05b 57 asn1_free_named_data_list( &ctx->subject );
HannesTschofenig 0:796d0f61a05b 58 asn1_free_named_data_list( &ctx->extensions );
HannesTschofenig 0:796d0f61a05b 59
HannesTschofenig 0:796d0f61a05b 60 memset( ctx, 0, sizeof(x509write_csr) );
HannesTschofenig 0:796d0f61a05b 61 }
HannesTschofenig 0:796d0f61a05b 62
HannesTschofenig 0:796d0f61a05b 63 void x509write_csr_set_md_alg( x509write_csr *ctx, md_type_t md_alg )
HannesTschofenig 0:796d0f61a05b 64 {
HannesTschofenig 0:796d0f61a05b 65 ctx->md_alg = md_alg;
HannesTschofenig 0:796d0f61a05b 66 }
HannesTschofenig 0:796d0f61a05b 67
HannesTschofenig 0:796d0f61a05b 68 void x509write_csr_set_key( x509write_csr *ctx, pk_context *key )
HannesTschofenig 0:796d0f61a05b 69 {
HannesTschofenig 0:796d0f61a05b 70 ctx->key = key;
HannesTschofenig 0:796d0f61a05b 71 }
HannesTschofenig 0:796d0f61a05b 72
HannesTschofenig 0:796d0f61a05b 73 int x509write_csr_set_subject_name( x509write_csr *ctx,
HannesTschofenig 0:796d0f61a05b 74 const char *subject_name )
HannesTschofenig 0:796d0f61a05b 75 {
HannesTschofenig 0:796d0f61a05b 76 return x509_string_to_names( &ctx->subject, subject_name );
HannesTschofenig 0:796d0f61a05b 77 }
HannesTschofenig 0:796d0f61a05b 78
HannesTschofenig 0:796d0f61a05b 79 int x509write_csr_set_extension( x509write_csr *ctx,
HannesTschofenig 0:796d0f61a05b 80 const char *oid, size_t oid_len,
HannesTschofenig 0:796d0f61a05b 81 const unsigned char *val, size_t val_len )
HannesTschofenig 0:796d0f61a05b 82 {
HannesTschofenig 0:796d0f61a05b 83 return x509_set_extension( &ctx->extensions, oid, oid_len,
HannesTschofenig 0:796d0f61a05b 84 0, val, val_len );
HannesTschofenig 0:796d0f61a05b 85 }
HannesTschofenig 0:796d0f61a05b 86
HannesTschofenig 0:796d0f61a05b 87 int x509write_csr_set_key_usage( x509write_csr *ctx, unsigned char key_usage )
HannesTschofenig 0:796d0f61a05b 88 {
HannesTschofenig 0:796d0f61a05b 89 unsigned char buf[4];
HannesTschofenig 0:796d0f61a05b 90 unsigned char *c;
HannesTschofenig 0:796d0f61a05b 91 int ret;
HannesTschofenig 0:796d0f61a05b 92
HannesTschofenig 0:796d0f61a05b 93 c = buf + 4;
HannesTschofenig 0:796d0f61a05b 94
HannesTschofenig 0:796d0f61a05b 95 if( ( ret = asn1_write_bitstring( &c, buf, &key_usage, 7 ) ) != 4 )
HannesTschofenig 0:796d0f61a05b 96 return( ret );
HannesTschofenig 0:796d0f61a05b 97
HannesTschofenig 0:796d0f61a05b 98 ret = x509write_csr_set_extension( ctx, OID_KEY_USAGE,
HannesTschofenig 0:796d0f61a05b 99 OID_SIZE( OID_KEY_USAGE ),
HannesTschofenig 0:796d0f61a05b 100 buf, 4 );
HannesTschofenig 0:796d0f61a05b 101 if( ret != 0 )
HannesTschofenig 0:796d0f61a05b 102 return( ret );
HannesTschofenig 0:796d0f61a05b 103
HannesTschofenig 0:796d0f61a05b 104 return( 0 );
HannesTschofenig 0:796d0f61a05b 105 }
HannesTschofenig 0:796d0f61a05b 106
HannesTschofenig 0:796d0f61a05b 107 int x509write_csr_set_ns_cert_type( x509write_csr *ctx,
HannesTschofenig 0:796d0f61a05b 108 unsigned char ns_cert_type )
HannesTschofenig 0:796d0f61a05b 109 {
HannesTschofenig 0:796d0f61a05b 110 unsigned char buf[4];
HannesTschofenig 0:796d0f61a05b 111 unsigned char *c;
HannesTschofenig 0:796d0f61a05b 112 int ret;
HannesTschofenig 0:796d0f61a05b 113
HannesTschofenig 0:796d0f61a05b 114 c = buf + 4;
HannesTschofenig 0:796d0f61a05b 115
HannesTschofenig 0:796d0f61a05b 116 if( ( ret = asn1_write_bitstring( &c, buf, &ns_cert_type, 8 ) ) != 4 )
HannesTschofenig 0:796d0f61a05b 117 return( ret );
HannesTschofenig 0:796d0f61a05b 118
HannesTschofenig 0:796d0f61a05b 119 ret = x509write_csr_set_extension( ctx, OID_NS_CERT_TYPE,
HannesTschofenig 0:796d0f61a05b 120 OID_SIZE( OID_NS_CERT_TYPE ),
HannesTschofenig 0:796d0f61a05b 121 buf, 4 );
HannesTschofenig 0:796d0f61a05b 122 if( ret != 0 )
HannesTschofenig 0:796d0f61a05b 123 return( ret );
HannesTschofenig 0:796d0f61a05b 124
HannesTschofenig 0:796d0f61a05b 125 return( 0 );
HannesTschofenig 0:796d0f61a05b 126 }
HannesTschofenig 0:796d0f61a05b 127
HannesTschofenig 0:796d0f61a05b 128 int x509write_csr_der( x509write_csr *ctx, unsigned char *buf, size_t size,
HannesTschofenig 0:796d0f61a05b 129 int (*f_rng)(void *, unsigned char *, size_t),
HannesTschofenig 0:796d0f61a05b 130 void *p_rng )
HannesTschofenig 0:796d0f61a05b 131 {
HannesTschofenig 0:796d0f61a05b 132 int ret;
HannesTschofenig 0:796d0f61a05b 133 const char *sig_oid;
HannesTschofenig 0:796d0f61a05b 134 size_t sig_oid_len = 0;
HannesTschofenig 0:796d0f61a05b 135 unsigned char *c, *c2;
HannesTschofenig 0:796d0f61a05b 136 unsigned char hash[64];
HannesTschofenig 0:796d0f61a05b 137 unsigned char sig[POLARSSL_MPI_MAX_SIZE];
HannesTschofenig 0:796d0f61a05b 138 unsigned char tmp_buf[2048];
HannesTschofenig 0:796d0f61a05b 139 size_t pub_len = 0, sig_and_oid_len = 0, sig_len;
HannesTschofenig 0:796d0f61a05b 140 size_t len = 0;
HannesTschofenig 0:796d0f61a05b 141 pk_type_t pk_alg;
HannesTschofenig 0:796d0f61a05b 142
HannesTschofenig 0:796d0f61a05b 143 /*
HannesTschofenig 0:796d0f61a05b 144 * Prepare data to be signed in tmp_buf
HannesTschofenig 0:796d0f61a05b 145 */
HannesTschofenig 0:796d0f61a05b 146 c = tmp_buf + sizeof( tmp_buf );
HannesTschofenig 0:796d0f61a05b 147
HannesTschofenig 0:796d0f61a05b 148 ASN1_CHK_ADD( len, x509_write_extensions( &c, tmp_buf, ctx->extensions ) );
HannesTschofenig 0:796d0f61a05b 149
HannesTschofenig 0:796d0f61a05b 150 if( len )
HannesTschofenig 0:796d0f61a05b 151 {
HannesTschofenig 0:796d0f61a05b 152 ASN1_CHK_ADD( len, asn1_write_len( &c, tmp_buf, len ) );
HannesTschofenig 0:796d0f61a05b 153 ASN1_CHK_ADD( len, asn1_write_tag( &c, tmp_buf, ASN1_CONSTRUCTED |
HannesTschofenig 0:796d0f61a05b 154 ASN1_SEQUENCE ) );
HannesTschofenig 0:796d0f61a05b 155
HannesTschofenig 0:796d0f61a05b 156 ASN1_CHK_ADD( len, asn1_write_len( &c, tmp_buf, len ) );
HannesTschofenig 0:796d0f61a05b 157 ASN1_CHK_ADD( len, asn1_write_tag( &c, tmp_buf, ASN1_CONSTRUCTED |
HannesTschofenig 0:796d0f61a05b 158 ASN1_SET ) );
HannesTschofenig 0:796d0f61a05b 159
HannesTschofenig 0:796d0f61a05b 160 ASN1_CHK_ADD( len, asn1_write_oid( &c, tmp_buf, OID_PKCS9_CSR_EXT_REQ,
HannesTschofenig 0:796d0f61a05b 161 OID_SIZE( OID_PKCS9_CSR_EXT_REQ ) ) );
HannesTschofenig 0:796d0f61a05b 162
HannesTschofenig 0:796d0f61a05b 163 ASN1_CHK_ADD( len, asn1_write_len( &c, tmp_buf, len ) );
HannesTschofenig 0:796d0f61a05b 164 ASN1_CHK_ADD( len, asn1_write_tag( &c, tmp_buf, ASN1_CONSTRUCTED |
HannesTschofenig 0:796d0f61a05b 165 ASN1_SEQUENCE ) );
HannesTschofenig 0:796d0f61a05b 166 }
HannesTschofenig 0:796d0f61a05b 167
HannesTschofenig 0:796d0f61a05b 168 ASN1_CHK_ADD( len, asn1_write_len( &c, tmp_buf, len ) );
HannesTschofenig 0:796d0f61a05b 169 ASN1_CHK_ADD( len, asn1_write_tag( &c, tmp_buf, ASN1_CONSTRUCTED |
HannesTschofenig 0:796d0f61a05b 170 ASN1_CONTEXT_SPECIFIC ) );
HannesTschofenig 0:796d0f61a05b 171
HannesTschofenig 0:796d0f61a05b 172 ASN1_CHK_ADD( pub_len, pk_write_pubkey_der( ctx->key,
HannesTschofenig 0:796d0f61a05b 173 tmp_buf, c - tmp_buf ) );
HannesTschofenig 0:796d0f61a05b 174 c -= pub_len;
HannesTschofenig 0:796d0f61a05b 175 len += pub_len;
HannesTschofenig 0:796d0f61a05b 176
HannesTschofenig 0:796d0f61a05b 177 /*
HannesTschofenig 0:796d0f61a05b 178 * Subject ::= Name
HannesTschofenig 0:796d0f61a05b 179 */
HannesTschofenig 0:796d0f61a05b 180 ASN1_CHK_ADD( len, x509_write_names( &c, tmp_buf, ctx->subject ) );
HannesTschofenig 0:796d0f61a05b 181
HannesTschofenig 0:796d0f61a05b 182 /*
HannesTschofenig 0:796d0f61a05b 183 * Version ::= INTEGER { v1(0), v2(1), v3(2) }
HannesTschofenig 0:796d0f61a05b 184 */
HannesTschofenig 0:796d0f61a05b 185 ASN1_CHK_ADD( len, asn1_write_int( &c, tmp_buf, 0 ) );
HannesTschofenig 0:796d0f61a05b 186
HannesTschofenig 0:796d0f61a05b 187 ASN1_CHK_ADD( len, asn1_write_len( &c, tmp_buf, len ) );
HannesTschofenig 0:796d0f61a05b 188 ASN1_CHK_ADD( len, asn1_write_tag( &c, tmp_buf, ASN1_CONSTRUCTED |
HannesTschofenig 0:796d0f61a05b 189 ASN1_SEQUENCE ) );
HannesTschofenig 0:796d0f61a05b 190
HannesTschofenig 0:796d0f61a05b 191 /*
HannesTschofenig 0:796d0f61a05b 192 * Prepare signature
HannesTschofenig 0:796d0f61a05b 193 */
HannesTschofenig 0:796d0f61a05b 194 md( md_info_from_type( ctx->md_alg ), c, len, hash );
HannesTschofenig 0:796d0f61a05b 195
HannesTschofenig 0:796d0f61a05b 196 pk_alg = pk_get_type( ctx->key );
HannesTschofenig 0:796d0f61a05b 197 if( pk_alg == POLARSSL_PK_ECKEY )
HannesTschofenig 0:796d0f61a05b 198 pk_alg = POLARSSL_PK_ECDSA;
HannesTschofenig 0:796d0f61a05b 199
HannesTschofenig 0:796d0f61a05b 200 if( ( ret = pk_sign( ctx->key, ctx->md_alg, hash, 0, sig, &sig_len,
HannesTschofenig 0:796d0f61a05b 201 f_rng, p_rng ) ) != 0 ||
HannesTschofenig 0:796d0f61a05b 202 ( ret = oid_get_oid_by_sig_alg( pk_alg, ctx->md_alg,
HannesTschofenig 0:796d0f61a05b 203 &sig_oid, &sig_oid_len ) ) != 0 )
HannesTschofenig 0:796d0f61a05b 204 {
HannesTschofenig 0:796d0f61a05b 205 return( ret );
HannesTschofenig 0:796d0f61a05b 206 }
HannesTschofenig 0:796d0f61a05b 207
HannesTschofenig 0:796d0f61a05b 208 /*
HannesTschofenig 0:796d0f61a05b 209 * Write data to output buffer
HannesTschofenig 0:796d0f61a05b 210 */
HannesTschofenig 0:796d0f61a05b 211 c2 = buf + size;
HannesTschofenig 0:796d0f61a05b 212 ASN1_CHK_ADD( sig_and_oid_len, x509_write_sig( &c2, buf,
HannesTschofenig 0:796d0f61a05b 213 sig_oid, sig_oid_len, sig, sig_len ) );
HannesTschofenig 0:796d0f61a05b 214
HannesTschofenig 0:796d0f61a05b 215 c2 -= len;
HannesTschofenig 0:796d0f61a05b 216 memcpy( c2, c, len );
HannesTschofenig 0:796d0f61a05b 217
HannesTschofenig 0:796d0f61a05b 218 len += sig_and_oid_len;
HannesTschofenig 0:796d0f61a05b 219 ASN1_CHK_ADD( len, asn1_write_len( &c2, buf, len ) );
HannesTschofenig 0:796d0f61a05b 220 ASN1_CHK_ADD( len, asn1_write_tag( &c2, buf, ASN1_CONSTRUCTED |
HannesTschofenig 0:796d0f61a05b 221 ASN1_SEQUENCE ) );
HannesTschofenig 0:796d0f61a05b 222
HannesTschofenig 0:796d0f61a05b 223 return( (int) len );
HannesTschofenig 0:796d0f61a05b 224 }
HannesTschofenig 0:796d0f61a05b 225
HannesTschofenig 0:796d0f61a05b 226 #define PEM_BEGIN_CSR "-----BEGIN CERTIFICATE REQUEST-----\n"
HannesTschofenig 0:796d0f61a05b 227 #define PEM_END_CSR "-----END CERTIFICATE REQUEST-----\n"
HannesTschofenig 0:796d0f61a05b 228
HannesTschofenig 0:796d0f61a05b 229 #if defined(POLARSSL_PEM_WRITE_C)
HannesTschofenig 0:796d0f61a05b 230 int x509write_csr_pem( x509write_csr *ctx, unsigned char *buf, size_t size,
HannesTschofenig 0:796d0f61a05b 231 int (*f_rng)(void *, unsigned char *, size_t),
HannesTschofenig 0:796d0f61a05b 232 void *p_rng )
HannesTschofenig 0:796d0f61a05b 233 {
HannesTschofenig 0:796d0f61a05b 234 int ret;
HannesTschofenig 0:796d0f61a05b 235 unsigned char output_buf[4096];
HannesTschofenig 0:796d0f61a05b 236 size_t olen = 0;
HannesTschofenig 0:796d0f61a05b 237
HannesTschofenig 0:796d0f61a05b 238 if( ( ret = x509write_csr_der( ctx, output_buf, sizeof(output_buf),
HannesTschofenig 0:796d0f61a05b 239 f_rng, p_rng ) ) < 0 )
HannesTschofenig 0:796d0f61a05b 240 {
HannesTschofenig 0:796d0f61a05b 241 return( ret );
HannesTschofenig 0:796d0f61a05b 242 }
HannesTschofenig 0:796d0f61a05b 243
HannesTschofenig 0:796d0f61a05b 244 if( ( ret = pem_write_buffer( PEM_BEGIN_CSR, PEM_END_CSR,
HannesTschofenig 0:796d0f61a05b 245 output_buf + sizeof(output_buf) - ret,
HannesTschofenig 0:796d0f61a05b 246 ret, buf, size, &olen ) ) != 0 )
HannesTschofenig 0:796d0f61a05b 247 {
HannesTschofenig 0:796d0f61a05b 248 return( ret );
HannesTschofenig 0:796d0f61a05b 249 }
HannesTschofenig 0:796d0f61a05b 250
HannesTschofenig 0:796d0f61a05b 251 return( 0 );
HannesTschofenig 0:796d0f61a05b 252 }
HannesTschofenig 0:796d0f61a05b 253 #endif /* POLARSSL_PEM_WRITE_C */
HannesTschofenig 0:796d0f61a05b 254
HannesTschofenig 0:796d0f61a05b 255 #endif /* POLARSSL_X509_CSR_WRITE_C */
HannesTschofenig 0:796d0f61a05b 256
HannesTschofenig 0:796d0f61a05b 257