os/ossrv/ssl/libcrypto/src/crypto/x509v3/v3_skey.c
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
/* v3_skey.c */
sl@0
     2
/* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL
sl@0
     3
 * project 1999.
sl@0
     4
 */
sl@0
     5
/* ====================================================================
sl@0
     6
 * Copyright (c) 1999 The OpenSSL Project.  All rights reserved.
sl@0
     7
 *
sl@0
     8
 * Redistribution and use in source and binary forms, with or without
sl@0
     9
 * modification, are permitted provided that the following conditions
sl@0
    10
 * are met:
sl@0
    11
 *
sl@0
    12
 * 1. Redistributions of source code must retain the above copyright
sl@0
    13
 *    notice, this list of conditions and the following disclaimer. 
sl@0
    14
 *
sl@0
    15
 * 2. Redistributions in binary form must reproduce the above copyright
sl@0
    16
 *    notice, this list of conditions and the following disclaimer in
sl@0
    17
 *    the documentation and/or other materials provided with the
sl@0
    18
 *    distribution.
sl@0
    19
 *
sl@0
    20
 * 3. All advertising materials mentioning features or use of this
sl@0
    21
 *    software must display the following acknowledgment:
sl@0
    22
 *    "This product includes software developed by the OpenSSL Project
sl@0
    23
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
sl@0
    24
 *
sl@0
    25
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
sl@0
    26
 *    endorse or promote products derived from this software without
sl@0
    27
 *    prior written permission. For written permission, please contact
sl@0
    28
 *    licensing@OpenSSL.org.
sl@0
    29
 *
sl@0
    30
 * 5. Products derived from this software may not be called "OpenSSL"
sl@0
    31
 *    nor may "OpenSSL" appear in their names without prior written
sl@0
    32
 *    permission of the OpenSSL Project.
sl@0
    33
 *
sl@0
    34
 * 6. Redistributions of any form whatsoever must retain the following
sl@0
    35
 *    acknowledgment:
sl@0
    36
 *    "This product includes software developed by the OpenSSL Project
sl@0
    37
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
sl@0
    38
 *
sl@0
    39
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
sl@0
    40
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
sl@0
    41
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
sl@0
    42
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
sl@0
    43
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
sl@0
    44
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
sl@0
    45
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
sl@0
    46
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
sl@0
    47
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
sl@0
    48
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
sl@0
    49
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
sl@0
    50
 * OF THE POSSIBILITY OF SUCH DAMAGE.
sl@0
    51
 * ====================================================================
sl@0
    52
 *
sl@0
    53
 * This product includes cryptographic software written by Eric Young
sl@0
    54
 * (eay@cryptsoft.com).  This product includes software written by Tim
sl@0
    55
 * Hudson (tjh@cryptsoft.com).
sl@0
    56
 *
sl@0
    57
 */
sl@0
    58
 /*
sl@0
    59
 © Portions copyright (c) 2006 Nokia Corporation.  All rights reserved.
sl@0
    60
 */
sl@0
    61
sl@0
    62
sl@0
    63
#include <stdio.h>
sl@0
    64
#include "cryptlib.h"
sl@0
    65
#include <openssl/x509v3.h>
sl@0
    66
#if (defined(SYMBIAN) && (defined(__WINSCW__) || defined(__WINS__)))
sl@0
    67
#include "libcrypto_wsd_macros.h"
sl@0
    68
#include "libcrypto_wsd.h"
sl@0
    69
#endif
sl@0
    70
sl@0
    71
sl@0
    72
static ASN1_OCTET_STRING *s2i_skey_id(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, char *str);
sl@0
    73
#ifndef EMULATOR
sl@0
    74
X509V3_EXT_METHOD v3_skey_id = { 
sl@0
    75
NID_subject_key_identifier, 0, ASN1_ITEM_ref(ASN1_OCTET_STRING),
sl@0
    76
0,0,0,0,
sl@0
    77
(X509V3_EXT_I2S)i2s_ASN1_OCTET_STRING,
sl@0
    78
(X509V3_EXT_S2I)s2i_skey_id,
sl@0
    79
0,0,0,0,
sl@0
    80
NULL};
sl@0
    81
#else
sl@0
    82
const X509V3_EXT_METHOD v3_skey_id = { 
sl@0
    83
NID_subject_key_identifier, 0, ASN1_ITEM_ref(ASN1_OCTET_STRING),
sl@0
    84
0,0,0,0,
sl@0
    85
(X509V3_EXT_I2S)i2s_ASN1_OCTET_STRING,
sl@0
    86
(X509V3_EXT_S2I)s2i_skey_id,
sl@0
    87
0,0,0,0,
sl@0
    88
NULL};
sl@0
    89
sl@0
    90
#endif
sl@0
    91
EXPORT_C char *i2s_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method,
sl@0
    92
	     ASN1_OCTET_STRING *oct)
sl@0
    93
{
sl@0
    94
	return hex_to_string(oct->data, oct->length);
sl@0
    95
}
sl@0
    96
sl@0
    97
EXPORT_C ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method,
sl@0
    98
	     X509V3_CTX *ctx, char *str)
sl@0
    99
{
sl@0
   100
	ASN1_OCTET_STRING *oct;
sl@0
   101
	long length;
sl@0
   102
sl@0
   103
	if(!(oct = M_ASN1_OCTET_STRING_new())) {
sl@0
   104
		X509V3err(X509V3_F_S2I_ASN1_OCTET_STRING,ERR_R_MALLOC_FAILURE);
sl@0
   105
		return NULL;
sl@0
   106
	}
sl@0
   107
sl@0
   108
	if(!(oct->data = string_to_hex(str, &length))) {
sl@0
   109
		M_ASN1_OCTET_STRING_free(oct);
sl@0
   110
		return NULL;
sl@0
   111
	}
sl@0
   112
sl@0
   113
	oct->length = length;
sl@0
   114
sl@0
   115
	return oct;
sl@0
   116
sl@0
   117
}
sl@0
   118
sl@0
   119
static ASN1_OCTET_STRING *s2i_skey_id(X509V3_EXT_METHOD *method,
sl@0
   120
	     X509V3_CTX *ctx, char *str)
sl@0
   121
{
sl@0
   122
	ASN1_OCTET_STRING *oct;
sl@0
   123
	ASN1_BIT_STRING *pk;
sl@0
   124
	unsigned char pkey_dig[EVP_MAX_MD_SIZE];
sl@0
   125
	unsigned int diglen;
sl@0
   126
sl@0
   127
	if(strcmp(str, "hash")) return s2i_ASN1_OCTET_STRING(method, ctx, str);
sl@0
   128
sl@0
   129
	if(!(oct = M_ASN1_OCTET_STRING_new())) {
sl@0
   130
		X509V3err(X509V3_F_S2I_SKEY_ID,ERR_R_MALLOC_FAILURE);
sl@0
   131
		return NULL;
sl@0
   132
	}
sl@0
   133
sl@0
   134
	if(ctx && (ctx->flags == CTX_TEST)) return oct;
sl@0
   135
sl@0
   136
	if(!ctx || (!ctx->subject_req && !ctx->subject_cert)) {
sl@0
   137
		X509V3err(X509V3_F_S2I_SKEY_ID,X509V3_R_NO_PUBLIC_KEY);
sl@0
   138
		goto err;
sl@0
   139
	}
sl@0
   140
sl@0
   141
	if(ctx->subject_req) 
sl@0
   142
		pk = ctx->subject_req->req_info->pubkey->public_key;
sl@0
   143
	else pk = ctx->subject_cert->cert_info->key->public_key;
sl@0
   144
sl@0
   145
	if(!pk) {
sl@0
   146
		X509V3err(X509V3_F_S2I_SKEY_ID,X509V3_R_NO_PUBLIC_KEY);
sl@0
   147
		goto err;
sl@0
   148
	}
sl@0
   149
sl@0
   150
	EVP_Digest(pk->data, pk->length, pkey_dig, &diglen, EVP_sha1(), NULL);
sl@0
   151
sl@0
   152
	if(!M_ASN1_OCTET_STRING_set(oct, pkey_dig, diglen)) {
sl@0
   153
		X509V3err(X509V3_F_S2I_SKEY_ID,ERR_R_MALLOC_FAILURE);
sl@0
   154
		goto err;
sl@0
   155
	}
sl@0
   156
sl@0
   157
	return oct;
sl@0
   158
	
sl@0
   159
	err:
sl@0
   160
	M_ASN1_OCTET_STRING_free(oct);
sl@0
   161
	return NULL;
sl@0
   162
}