takashi kadono / Mbed OS Nucleo446_SSD1331

Dependencies:   ssd1331

Committer:
kadonotakashi
Date:
Wed Oct 10 00:33:53 2018 +0000
Revision:
0:8fdf9a60065b
how to make mbed librry

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kadonotakashi 0:8fdf9a60065b 1 /*
kadonotakashi 0:8fdf9a60065b 2 * ASN.1 buffer writing functionality
kadonotakashi 0:8fdf9a60065b 3 *
kadonotakashi 0:8fdf9a60065b 4 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
kadonotakashi 0:8fdf9a60065b 5 * SPDX-License-Identifier: Apache-2.0
kadonotakashi 0:8fdf9a60065b 6 *
kadonotakashi 0:8fdf9a60065b 7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
kadonotakashi 0:8fdf9a60065b 8 * not use this file except in compliance with the License.
kadonotakashi 0:8fdf9a60065b 9 * You may obtain a copy of the License at
kadonotakashi 0:8fdf9a60065b 10 *
kadonotakashi 0:8fdf9a60065b 11 * http://www.apache.org/licenses/LICENSE-2.0
kadonotakashi 0:8fdf9a60065b 12 *
kadonotakashi 0:8fdf9a60065b 13 * Unless required by applicable law or agreed to in writing, software
kadonotakashi 0:8fdf9a60065b 14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
kadonotakashi 0:8fdf9a60065b 15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kadonotakashi 0:8fdf9a60065b 16 * See the License for the specific language governing permissions and
kadonotakashi 0:8fdf9a60065b 17 * limitations under the License.
kadonotakashi 0:8fdf9a60065b 18 *
kadonotakashi 0:8fdf9a60065b 19 * This file is part of mbed TLS (https://tls.mbed.org)
kadonotakashi 0:8fdf9a60065b 20 */
kadonotakashi 0:8fdf9a60065b 21
kadonotakashi 0:8fdf9a60065b 22 #if !defined(MBEDTLS_CONFIG_FILE)
kadonotakashi 0:8fdf9a60065b 23 #include "mbedtls/config.h"
kadonotakashi 0:8fdf9a60065b 24 #else
kadonotakashi 0:8fdf9a60065b 25 #include MBEDTLS_CONFIG_FILE
kadonotakashi 0:8fdf9a60065b 26 #endif
kadonotakashi 0:8fdf9a60065b 27
kadonotakashi 0:8fdf9a60065b 28 #if defined(MBEDTLS_ASN1_WRITE_C)
kadonotakashi 0:8fdf9a60065b 29
kadonotakashi 0:8fdf9a60065b 30 #include "mbedtls/asn1write.h"
kadonotakashi 0:8fdf9a60065b 31
kadonotakashi 0:8fdf9a60065b 32 #include <string.h>
kadonotakashi 0:8fdf9a60065b 33
kadonotakashi 0:8fdf9a60065b 34 #if defined(MBEDTLS_PLATFORM_C)
kadonotakashi 0:8fdf9a60065b 35 #include "mbedtls/platform.h"
kadonotakashi 0:8fdf9a60065b 36 #else
kadonotakashi 0:8fdf9a60065b 37 #include <stdlib.h>
kadonotakashi 0:8fdf9a60065b 38 #define mbedtls_calloc calloc
kadonotakashi 0:8fdf9a60065b 39 #define mbedtls_free free
kadonotakashi 0:8fdf9a60065b 40 #endif
kadonotakashi 0:8fdf9a60065b 41
kadonotakashi 0:8fdf9a60065b 42 int mbedtls_asn1_write_len( unsigned char **p, unsigned char *start, size_t len )
kadonotakashi 0:8fdf9a60065b 43 {
kadonotakashi 0:8fdf9a60065b 44 if( len < 0x80 )
kadonotakashi 0:8fdf9a60065b 45 {
kadonotakashi 0:8fdf9a60065b 46 if( *p - start < 1 )
kadonotakashi 0:8fdf9a60065b 47 return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
kadonotakashi 0:8fdf9a60065b 48
kadonotakashi 0:8fdf9a60065b 49 *--(*p) = (unsigned char) len;
kadonotakashi 0:8fdf9a60065b 50 return( 1 );
kadonotakashi 0:8fdf9a60065b 51 }
kadonotakashi 0:8fdf9a60065b 52
kadonotakashi 0:8fdf9a60065b 53 if( len <= 0xFF )
kadonotakashi 0:8fdf9a60065b 54 {
kadonotakashi 0:8fdf9a60065b 55 if( *p - start < 2 )
kadonotakashi 0:8fdf9a60065b 56 return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
kadonotakashi 0:8fdf9a60065b 57
kadonotakashi 0:8fdf9a60065b 58 *--(*p) = (unsigned char) len;
kadonotakashi 0:8fdf9a60065b 59 *--(*p) = 0x81;
kadonotakashi 0:8fdf9a60065b 60 return( 2 );
kadonotakashi 0:8fdf9a60065b 61 }
kadonotakashi 0:8fdf9a60065b 62
kadonotakashi 0:8fdf9a60065b 63 if( len <= 0xFFFF )
kadonotakashi 0:8fdf9a60065b 64 {
kadonotakashi 0:8fdf9a60065b 65 if( *p - start < 3 )
kadonotakashi 0:8fdf9a60065b 66 return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
kadonotakashi 0:8fdf9a60065b 67
kadonotakashi 0:8fdf9a60065b 68 *--(*p) = ( len ) & 0xFF;
kadonotakashi 0:8fdf9a60065b 69 *--(*p) = ( len >> 8 ) & 0xFF;
kadonotakashi 0:8fdf9a60065b 70 *--(*p) = 0x82;
kadonotakashi 0:8fdf9a60065b 71 return( 3 );
kadonotakashi 0:8fdf9a60065b 72 }
kadonotakashi 0:8fdf9a60065b 73
kadonotakashi 0:8fdf9a60065b 74 if( len <= 0xFFFFFF )
kadonotakashi 0:8fdf9a60065b 75 {
kadonotakashi 0:8fdf9a60065b 76 if( *p - start < 4 )
kadonotakashi 0:8fdf9a60065b 77 return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
kadonotakashi 0:8fdf9a60065b 78
kadonotakashi 0:8fdf9a60065b 79 *--(*p) = ( len ) & 0xFF;
kadonotakashi 0:8fdf9a60065b 80 *--(*p) = ( len >> 8 ) & 0xFF;
kadonotakashi 0:8fdf9a60065b 81 *--(*p) = ( len >> 16 ) & 0xFF;
kadonotakashi 0:8fdf9a60065b 82 *--(*p) = 0x83;
kadonotakashi 0:8fdf9a60065b 83 return( 4 );
kadonotakashi 0:8fdf9a60065b 84 }
kadonotakashi 0:8fdf9a60065b 85
kadonotakashi 0:8fdf9a60065b 86 #if SIZE_MAX > 0xFFFFFFFF
kadonotakashi 0:8fdf9a60065b 87 if( len <= 0xFFFFFFFF )
kadonotakashi 0:8fdf9a60065b 88 #endif
kadonotakashi 0:8fdf9a60065b 89 {
kadonotakashi 0:8fdf9a60065b 90 if( *p - start < 5 )
kadonotakashi 0:8fdf9a60065b 91 return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
kadonotakashi 0:8fdf9a60065b 92
kadonotakashi 0:8fdf9a60065b 93 *--(*p) = ( len ) & 0xFF;
kadonotakashi 0:8fdf9a60065b 94 *--(*p) = ( len >> 8 ) & 0xFF;
kadonotakashi 0:8fdf9a60065b 95 *--(*p) = ( len >> 16 ) & 0xFF;
kadonotakashi 0:8fdf9a60065b 96 *--(*p) = ( len >> 24 ) & 0xFF;
kadonotakashi 0:8fdf9a60065b 97 *--(*p) = 0x84;
kadonotakashi 0:8fdf9a60065b 98 return( 5 );
kadonotakashi 0:8fdf9a60065b 99 }
kadonotakashi 0:8fdf9a60065b 100
kadonotakashi 0:8fdf9a60065b 101 #if SIZE_MAX > 0xFFFFFFFF
kadonotakashi 0:8fdf9a60065b 102 return( MBEDTLS_ERR_ASN1_INVALID_LENGTH );
kadonotakashi 0:8fdf9a60065b 103 #endif
kadonotakashi 0:8fdf9a60065b 104 }
kadonotakashi 0:8fdf9a60065b 105
kadonotakashi 0:8fdf9a60065b 106 int mbedtls_asn1_write_tag( unsigned char **p, unsigned char *start, unsigned char tag )
kadonotakashi 0:8fdf9a60065b 107 {
kadonotakashi 0:8fdf9a60065b 108 if( *p - start < 1 )
kadonotakashi 0:8fdf9a60065b 109 return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
kadonotakashi 0:8fdf9a60065b 110
kadonotakashi 0:8fdf9a60065b 111 *--(*p) = tag;
kadonotakashi 0:8fdf9a60065b 112
kadonotakashi 0:8fdf9a60065b 113 return( 1 );
kadonotakashi 0:8fdf9a60065b 114 }
kadonotakashi 0:8fdf9a60065b 115
kadonotakashi 0:8fdf9a60065b 116 int mbedtls_asn1_write_raw_buffer( unsigned char **p, unsigned char *start,
kadonotakashi 0:8fdf9a60065b 117 const unsigned char *buf, size_t size )
kadonotakashi 0:8fdf9a60065b 118 {
kadonotakashi 0:8fdf9a60065b 119 size_t len = 0;
kadonotakashi 0:8fdf9a60065b 120
kadonotakashi 0:8fdf9a60065b 121 if( *p < start || (size_t)( *p - start ) < size )
kadonotakashi 0:8fdf9a60065b 122 return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
kadonotakashi 0:8fdf9a60065b 123
kadonotakashi 0:8fdf9a60065b 124 len = size;
kadonotakashi 0:8fdf9a60065b 125 (*p) -= len;
kadonotakashi 0:8fdf9a60065b 126 memcpy( *p, buf, len );
kadonotakashi 0:8fdf9a60065b 127
kadonotakashi 0:8fdf9a60065b 128 return( (int) len );
kadonotakashi 0:8fdf9a60065b 129 }
kadonotakashi 0:8fdf9a60065b 130
kadonotakashi 0:8fdf9a60065b 131 #if defined(MBEDTLS_BIGNUM_C)
kadonotakashi 0:8fdf9a60065b 132 int mbedtls_asn1_write_mpi( unsigned char **p, unsigned char *start, const mbedtls_mpi *X )
kadonotakashi 0:8fdf9a60065b 133 {
kadonotakashi 0:8fdf9a60065b 134 int ret;
kadonotakashi 0:8fdf9a60065b 135 size_t len = 0;
kadonotakashi 0:8fdf9a60065b 136
kadonotakashi 0:8fdf9a60065b 137 // Write the MPI
kadonotakashi 0:8fdf9a60065b 138 //
kadonotakashi 0:8fdf9a60065b 139 len = mbedtls_mpi_size( X );
kadonotakashi 0:8fdf9a60065b 140
kadonotakashi 0:8fdf9a60065b 141 if( *p < start || (size_t)( *p - start ) < len )
kadonotakashi 0:8fdf9a60065b 142 return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
kadonotakashi 0:8fdf9a60065b 143
kadonotakashi 0:8fdf9a60065b 144 (*p) -= len;
kadonotakashi 0:8fdf9a60065b 145 MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( X, *p, len ) );
kadonotakashi 0:8fdf9a60065b 146
kadonotakashi 0:8fdf9a60065b 147 // DER format assumes 2s complement for numbers, so the leftmost bit
kadonotakashi 0:8fdf9a60065b 148 // should be 0 for positive numbers and 1 for negative numbers.
kadonotakashi 0:8fdf9a60065b 149 //
kadonotakashi 0:8fdf9a60065b 150 if( X->s ==1 && **p & 0x80 )
kadonotakashi 0:8fdf9a60065b 151 {
kadonotakashi 0:8fdf9a60065b 152 if( *p - start < 1 )
kadonotakashi 0:8fdf9a60065b 153 return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
kadonotakashi 0:8fdf9a60065b 154
kadonotakashi 0:8fdf9a60065b 155 *--(*p) = 0x00;
kadonotakashi 0:8fdf9a60065b 156 len += 1;
kadonotakashi 0:8fdf9a60065b 157 }
kadonotakashi 0:8fdf9a60065b 158
kadonotakashi 0:8fdf9a60065b 159 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
kadonotakashi 0:8fdf9a60065b 160 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_INTEGER ) );
kadonotakashi 0:8fdf9a60065b 161
kadonotakashi 0:8fdf9a60065b 162 ret = (int) len;
kadonotakashi 0:8fdf9a60065b 163
kadonotakashi 0:8fdf9a60065b 164 cleanup:
kadonotakashi 0:8fdf9a60065b 165 return( ret );
kadonotakashi 0:8fdf9a60065b 166 }
kadonotakashi 0:8fdf9a60065b 167 #endif /* MBEDTLS_BIGNUM_C */
kadonotakashi 0:8fdf9a60065b 168
kadonotakashi 0:8fdf9a60065b 169 int mbedtls_asn1_write_null( unsigned char **p, unsigned char *start )
kadonotakashi 0:8fdf9a60065b 170 {
kadonotakashi 0:8fdf9a60065b 171 int ret;
kadonotakashi 0:8fdf9a60065b 172 size_t len = 0;
kadonotakashi 0:8fdf9a60065b 173
kadonotakashi 0:8fdf9a60065b 174 // Write NULL
kadonotakashi 0:8fdf9a60065b 175 //
kadonotakashi 0:8fdf9a60065b 176 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, 0) );
kadonotakashi 0:8fdf9a60065b 177 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_NULL ) );
kadonotakashi 0:8fdf9a60065b 178
kadonotakashi 0:8fdf9a60065b 179 return( (int) len );
kadonotakashi 0:8fdf9a60065b 180 }
kadonotakashi 0:8fdf9a60065b 181
kadonotakashi 0:8fdf9a60065b 182 int mbedtls_asn1_write_oid( unsigned char **p, unsigned char *start,
kadonotakashi 0:8fdf9a60065b 183 const char *oid, size_t oid_len )
kadonotakashi 0:8fdf9a60065b 184 {
kadonotakashi 0:8fdf9a60065b 185 int ret;
kadonotakashi 0:8fdf9a60065b 186 size_t len = 0;
kadonotakashi 0:8fdf9a60065b 187
kadonotakashi 0:8fdf9a60065b 188 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start,
kadonotakashi 0:8fdf9a60065b 189 (const unsigned char *) oid, oid_len ) );
kadonotakashi 0:8fdf9a60065b 190 MBEDTLS_ASN1_CHK_ADD( len , mbedtls_asn1_write_len( p, start, len ) );
kadonotakashi 0:8fdf9a60065b 191 MBEDTLS_ASN1_CHK_ADD( len , mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_OID ) );
kadonotakashi 0:8fdf9a60065b 192
kadonotakashi 0:8fdf9a60065b 193 return( (int) len );
kadonotakashi 0:8fdf9a60065b 194 }
kadonotakashi 0:8fdf9a60065b 195
kadonotakashi 0:8fdf9a60065b 196 int mbedtls_asn1_write_algorithm_identifier( unsigned char **p, unsigned char *start,
kadonotakashi 0:8fdf9a60065b 197 const char *oid, size_t oid_len,
kadonotakashi 0:8fdf9a60065b 198 size_t par_len )
kadonotakashi 0:8fdf9a60065b 199 {
kadonotakashi 0:8fdf9a60065b 200 int ret;
kadonotakashi 0:8fdf9a60065b 201 size_t len = 0;
kadonotakashi 0:8fdf9a60065b 202
kadonotakashi 0:8fdf9a60065b 203 if( par_len == 0 )
kadonotakashi 0:8fdf9a60065b 204 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_null( p, start ) );
kadonotakashi 0:8fdf9a60065b 205 else
kadonotakashi 0:8fdf9a60065b 206 len += par_len;
kadonotakashi 0:8fdf9a60065b 207
kadonotakashi 0:8fdf9a60065b 208 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_oid( p, start, oid, oid_len ) );
kadonotakashi 0:8fdf9a60065b 209
kadonotakashi 0:8fdf9a60065b 210 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
kadonotakashi 0:8fdf9a60065b 211 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start,
kadonotakashi 0:8fdf9a60065b 212 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) );
kadonotakashi 0:8fdf9a60065b 213
kadonotakashi 0:8fdf9a60065b 214 return( (int) len );
kadonotakashi 0:8fdf9a60065b 215 }
kadonotakashi 0:8fdf9a60065b 216
kadonotakashi 0:8fdf9a60065b 217 int mbedtls_asn1_write_bool( unsigned char **p, unsigned char *start, int boolean )
kadonotakashi 0:8fdf9a60065b 218 {
kadonotakashi 0:8fdf9a60065b 219 int ret;
kadonotakashi 0:8fdf9a60065b 220 size_t len = 0;
kadonotakashi 0:8fdf9a60065b 221
kadonotakashi 0:8fdf9a60065b 222 if( *p - start < 1 )
kadonotakashi 0:8fdf9a60065b 223 return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
kadonotakashi 0:8fdf9a60065b 224
kadonotakashi 0:8fdf9a60065b 225 *--(*p) = (boolean) ? 255 : 0;
kadonotakashi 0:8fdf9a60065b 226 len++;
kadonotakashi 0:8fdf9a60065b 227
kadonotakashi 0:8fdf9a60065b 228 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
kadonotakashi 0:8fdf9a60065b 229 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_BOOLEAN ) );
kadonotakashi 0:8fdf9a60065b 230
kadonotakashi 0:8fdf9a60065b 231 return( (int) len );
kadonotakashi 0:8fdf9a60065b 232 }
kadonotakashi 0:8fdf9a60065b 233
kadonotakashi 0:8fdf9a60065b 234 int mbedtls_asn1_write_int( unsigned char **p, unsigned char *start, int val )
kadonotakashi 0:8fdf9a60065b 235 {
kadonotakashi 0:8fdf9a60065b 236 int ret;
kadonotakashi 0:8fdf9a60065b 237 size_t len = 0;
kadonotakashi 0:8fdf9a60065b 238
kadonotakashi 0:8fdf9a60065b 239 if( *p - start < 1 )
kadonotakashi 0:8fdf9a60065b 240 return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
kadonotakashi 0:8fdf9a60065b 241
kadonotakashi 0:8fdf9a60065b 242 len += 1;
kadonotakashi 0:8fdf9a60065b 243 *--(*p) = val;
kadonotakashi 0:8fdf9a60065b 244
kadonotakashi 0:8fdf9a60065b 245 if( val > 0 && **p & 0x80 )
kadonotakashi 0:8fdf9a60065b 246 {
kadonotakashi 0:8fdf9a60065b 247 if( *p - start < 1 )
kadonotakashi 0:8fdf9a60065b 248 return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
kadonotakashi 0:8fdf9a60065b 249
kadonotakashi 0:8fdf9a60065b 250 *--(*p) = 0x00;
kadonotakashi 0:8fdf9a60065b 251 len += 1;
kadonotakashi 0:8fdf9a60065b 252 }
kadonotakashi 0:8fdf9a60065b 253
kadonotakashi 0:8fdf9a60065b 254 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
kadonotakashi 0:8fdf9a60065b 255 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_INTEGER ) );
kadonotakashi 0:8fdf9a60065b 256
kadonotakashi 0:8fdf9a60065b 257 return( (int) len );
kadonotakashi 0:8fdf9a60065b 258 }
kadonotakashi 0:8fdf9a60065b 259
kadonotakashi 0:8fdf9a60065b 260 int mbedtls_asn1_write_printable_string( unsigned char **p, unsigned char *start,
kadonotakashi 0:8fdf9a60065b 261 const char *text, size_t text_len )
kadonotakashi 0:8fdf9a60065b 262 {
kadonotakashi 0:8fdf9a60065b 263 int ret;
kadonotakashi 0:8fdf9a60065b 264 size_t len = 0;
kadonotakashi 0:8fdf9a60065b 265
kadonotakashi 0:8fdf9a60065b 266 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start,
kadonotakashi 0:8fdf9a60065b 267 (const unsigned char *) text, text_len ) );
kadonotakashi 0:8fdf9a60065b 268
kadonotakashi 0:8fdf9a60065b 269 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
kadonotakashi 0:8fdf9a60065b 270 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_PRINTABLE_STRING ) );
kadonotakashi 0:8fdf9a60065b 271
kadonotakashi 0:8fdf9a60065b 272 return( (int) len );
kadonotakashi 0:8fdf9a60065b 273 }
kadonotakashi 0:8fdf9a60065b 274
kadonotakashi 0:8fdf9a60065b 275 int mbedtls_asn1_write_ia5_string( unsigned char **p, unsigned char *start,
kadonotakashi 0:8fdf9a60065b 276 const char *text, size_t text_len )
kadonotakashi 0:8fdf9a60065b 277 {
kadonotakashi 0:8fdf9a60065b 278 int ret;
kadonotakashi 0:8fdf9a60065b 279 size_t len = 0;
kadonotakashi 0:8fdf9a60065b 280
kadonotakashi 0:8fdf9a60065b 281 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start,
kadonotakashi 0:8fdf9a60065b 282 (const unsigned char *) text, text_len ) );
kadonotakashi 0:8fdf9a60065b 283
kadonotakashi 0:8fdf9a60065b 284 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
kadonotakashi 0:8fdf9a60065b 285 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_IA5_STRING ) );
kadonotakashi 0:8fdf9a60065b 286
kadonotakashi 0:8fdf9a60065b 287 return( (int) len );
kadonotakashi 0:8fdf9a60065b 288 }
kadonotakashi 0:8fdf9a60065b 289
kadonotakashi 0:8fdf9a60065b 290 int mbedtls_asn1_write_bitstring( unsigned char **p, unsigned char *start,
kadonotakashi 0:8fdf9a60065b 291 const unsigned char *buf, size_t bits )
kadonotakashi 0:8fdf9a60065b 292 {
kadonotakashi 0:8fdf9a60065b 293 int ret;
kadonotakashi 0:8fdf9a60065b 294 size_t len = 0, size;
kadonotakashi 0:8fdf9a60065b 295
kadonotakashi 0:8fdf9a60065b 296 size = ( bits / 8 ) + ( ( bits % 8 ) ? 1 : 0 );
kadonotakashi 0:8fdf9a60065b 297
kadonotakashi 0:8fdf9a60065b 298 // Calculate byte length
kadonotakashi 0:8fdf9a60065b 299 //
kadonotakashi 0:8fdf9a60065b 300 if( *p < start || (size_t)( *p - start ) < size + 1 )
kadonotakashi 0:8fdf9a60065b 301 return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
kadonotakashi 0:8fdf9a60065b 302
kadonotakashi 0:8fdf9a60065b 303 len = size + 1;
kadonotakashi 0:8fdf9a60065b 304 (*p) -= size;
kadonotakashi 0:8fdf9a60065b 305 memcpy( *p, buf, size );
kadonotakashi 0:8fdf9a60065b 306
kadonotakashi 0:8fdf9a60065b 307 // Write unused bits
kadonotakashi 0:8fdf9a60065b 308 //
kadonotakashi 0:8fdf9a60065b 309 *--(*p) = (unsigned char) (size * 8 - bits);
kadonotakashi 0:8fdf9a60065b 310
kadonotakashi 0:8fdf9a60065b 311 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
kadonotakashi 0:8fdf9a60065b 312 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_BIT_STRING ) );
kadonotakashi 0:8fdf9a60065b 313
kadonotakashi 0:8fdf9a60065b 314 return( (int) len );
kadonotakashi 0:8fdf9a60065b 315 }
kadonotakashi 0:8fdf9a60065b 316
kadonotakashi 0:8fdf9a60065b 317 int mbedtls_asn1_write_octet_string( unsigned char **p, unsigned char *start,
kadonotakashi 0:8fdf9a60065b 318 const unsigned char *buf, size_t size )
kadonotakashi 0:8fdf9a60065b 319 {
kadonotakashi 0:8fdf9a60065b 320 int ret;
kadonotakashi 0:8fdf9a60065b 321 size_t len = 0;
kadonotakashi 0:8fdf9a60065b 322
kadonotakashi 0:8fdf9a60065b 323 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start, buf, size ) );
kadonotakashi 0:8fdf9a60065b 324
kadonotakashi 0:8fdf9a60065b 325 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
kadonotakashi 0:8fdf9a60065b 326 MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_OCTET_STRING ) );
kadonotakashi 0:8fdf9a60065b 327
kadonotakashi 0:8fdf9a60065b 328 return( (int) len );
kadonotakashi 0:8fdf9a60065b 329 }
kadonotakashi 0:8fdf9a60065b 330
kadonotakashi 0:8fdf9a60065b 331 mbedtls_asn1_named_data *mbedtls_asn1_store_named_data( mbedtls_asn1_named_data **head,
kadonotakashi 0:8fdf9a60065b 332 const char *oid, size_t oid_len,
kadonotakashi 0:8fdf9a60065b 333 const unsigned char *val,
kadonotakashi 0:8fdf9a60065b 334 size_t val_len )
kadonotakashi 0:8fdf9a60065b 335 {
kadonotakashi 0:8fdf9a60065b 336 mbedtls_asn1_named_data *cur;
kadonotakashi 0:8fdf9a60065b 337
kadonotakashi 0:8fdf9a60065b 338 if( ( cur = mbedtls_asn1_find_named_data( *head, oid, oid_len ) ) == NULL )
kadonotakashi 0:8fdf9a60065b 339 {
kadonotakashi 0:8fdf9a60065b 340 // Add new entry if not present yet based on OID
kadonotakashi 0:8fdf9a60065b 341 //
kadonotakashi 0:8fdf9a60065b 342 cur = (mbedtls_asn1_named_data*)mbedtls_calloc( 1,
kadonotakashi 0:8fdf9a60065b 343 sizeof(mbedtls_asn1_named_data) );
kadonotakashi 0:8fdf9a60065b 344 if( cur == NULL )
kadonotakashi 0:8fdf9a60065b 345 return( NULL );
kadonotakashi 0:8fdf9a60065b 346
kadonotakashi 0:8fdf9a60065b 347 cur->oid.len = oid_len;
kadonotakashi 0:8fdf9a60065b 348 cur->oid.p = mbedtls_calloc( 1, oid_len );
kadonotakashi 0:8fdf9a60065b 349 if( cur->oid.p == NULL )
kadonotakashi 0:8fdf9a60065b 350 {
kadonotakashi 0:8fdf9a60065b 351 mbedtls_free( cur );
kadonotakashi 0:8fdf9a60065b 352 return( NULL );
kadonotakashi 0:8fdf9a60065b 353 }
kadonotakashi 0:8fdf9a60065b 354
kadonotakashi 0:8fdf9a60065b 355 memcpy( cur->oid.p, oid, oid_len );
kadonotakashi 0:8fdf9a60065b 356
kadonotakashi 0:8fdf9a60065b 357 cur->val.len = val_len;
kadonotakashi 0:8fdf9a60065b 358 cur->val.p = mbedtls_calloc( 1, val_len );
kadonotakashi 0:8fdf9a60065b 359 if( cur->val.p == NULL )
kadonotakashi 0:8fdf9a60065b 360 {
kadonotakashi 0:8fdf9a60065b 361 mbedtls_free( cur->oid.p );
kadonotakashi 0:8fdf9a60065b 362 mbedtls_free( cur );
kadonotakashi 0:8fdf9a60065b 363 return( NULL );
kadonotakashi 0:8fdf9a60065b 364 }
kadonotakashi 0:8fdf9a60065b 365
kadonotakashi 0:8fdf9a60065b 366 cur->next = *head;
kadonotakashi 0:8fdf9a60065b 367 *head = cur;
kadonotakashi 0:8fdf9a60065b 368 }
kadonotakashi 0:8fdf9a60065b 369 else if( cur->val.len < val_len )
kadonotakashi 0:8fdf9a60065b 370 {
kadonotakashi 0:8fdf9a60065b 371 /*
kadonotakashi 0:8fdf9a60065b 372 * Enlarge existing value buffer if needed
kadonotakashi 0:8fdf9a60065b 373 * Preserve old data until the allocation succeeded, to leave list in
kadonotakashi 0:8fdf9a60065b 374 * a consistent state in case allocation fails.
kadonotakashi 0:8fdf9a60065b 375 */
kadonotakashi 0:8fdf9a60065b 376 void *p = mbedtls_calloc( 1, val_len );
kadonotakashi 0:8fdf9a60065b 377 if( p == NULL )
kadonotakashi 0:8fdf9a60065b 378 return( NULL );
kadonotakashi 0:8fdf9a60065b 379
kadonotakashi 0:8fdf9a60065b 380 mbedtls_free( cur->val.p );
kadonotakashi 0:8fdf9a60065b 381 cur->val.p = p;
kadonotakashi 0:8fdf9a60065b 382 cur->val.len = val_len;
kadonotakashi 0:8fdf9a60065b 383 }
kadonotakashi 0:8fdf9a60065b 384
kadonotakashi 0:8fdf9a60065b 385 if( val != NULL )
kadonotakashi 0:8fdf9a60065b 386 memcpy( cur->val.p, val, val_len );
kadonotakashi 0:8fdf9a60065b 387
kadonotakashi 0:8fdf9a60065b 388 return( cur );
kadonotakashi 0:8fdf9a60065b 389 }
kadonotakashi 0:8fdf9a60065b 390 #endif /* MBEDTLS_ASN1_WRITE_C */