OLD | NEW |
1 /* p8_pkey.c */ | 1 /* p8_pkey.c */ |
2 /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 * project 1999. | 3 * project 1999. |
4 */ | 4 */ |
5 /* ==================================================================== | 5 /* ==================================================================== |
6 * Copyright (c) 1999 The OpenSSL Project. All rights reserved. | 6 * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. |
7 * | 7 * |
8 * Redistribution and use in source and binary forms, with or without | 8 * Redistribution and use in source and binary forms, with or without |
9 * modification, are permitted provided that the following conditions | 9 * modification, are permitted provided that the following conditions |
10 * are met: | 10 * are met: |
11 * | 11 * |
12 * 1. Redistributions of source code must retain the above copyright | 12 * 1. Redistributions of source code must retain the above copyright |
13 * notice, this list of conditions and the following disclaimer. | 13 * notice, this list of conditions and the following disclaimer. |
14 * | 14 * |
15 * 2. Redistributions in binary form must reproduce the above copyright | 15 * 2. Redistributions in binary form must reproduce the above copyright |
16 * notice, this list of conditions and the following disclaimer in | 16 * notice, this list of conditions and the following disclaimer in |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 * Hudson (tjh@cryptsoft.com). | 55 * Hudson (tjh@cryptsoft.com). |
56 * | 56 * |
57 */ | 57 */ |
58 | 58 |
59 #include <stdio.h> | 59 #include <stdio.h> |
60 #include "cryptlib.h" | 60 #include "cryptlib.h" |
61 #include <openssl/asn1t.h> | 61 #include <openssl/asn1t.h> |
62 #include <openssl/x509.h> | 62 #include <openssl/x509.h> |
63 | 63 |
64 /* Minor tweak to operation: zero private key data */ | 64 /* Minor tweak to operation: zero private key data */ |
65 static int pkey_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it) | 65 static int pkey_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, |
| 66 » » » » » » » void *exarg) |
66 { | 67 { |
67 /* Since the structure must still be valid use ASN1_OP_FREE_PRE */ | 68 /* Since the structure must still be valid use ASN1_OP_FREE_PRE */ |
68 if(operation == ASN1_OP_FREE_PRE) { | 69 if(operation == ASN1_OP_FREE_PRE) { |
69 PKCS8_PRIV_KEY_INFO *key = (PKCS8_PRIV_KEY_INFO *)*pval; | 70 PKCS8_PRIV_KEY_INFO *key = (PKCS8_PRIV_KEY_INFO *)*pval; |
70 if (key->pkey->value.octet_string) | 71 if (key->pkey->value.octet_string) |
71 OPENSSL_cleanse(key->pkey->value.octet_string->data, | 72 OPENSSL_cleanse(key->pkey->value.octet_string->data, |
72 key->pkey->value.octet_string->length); | 73 key->pkey->value.octet_string->length); |
73 } | 74 } |
74 return 1; | 75 return 1; |
75 } | 76 } |
76 | 77 |
77 ASN1_SEQUENCE_cb(PKCS8_PRIV_KEY_INFO, pkey_cb) = { | 78 ASN1_SEQUENCE_cb(PKCS8_PRIV_KEY_INFO, pkey_cb) = { |
78 ASN1_SIMPLE(PKCS8_PRIV_KEY_INFO, version, ASN1_INTEGER), | 79 ASN1_SIMPLE(PKCS8_PRIV_KEY_INFO, version, ASN1_INTEGER), |
79 ASN1_SIMPLE(PKCS8_PRIV_KEY_INFO, pkeyalg, X509_ALGOR), | 80 ASN1_SIMPLE(PKCS8_PRIV_KEY_INFO, pkeyalg, X509_ALGOR), |
80 ASN1_SIMPLE(PKCS8_PRIV_KEY_INFO, pkey, ASN1_ANY), | 81 ASN1_SIMPLE(PKCS8_PRIV_KEY_INFO, pkey, ASN1_ANY), |
81 ASN1_IMP_SET_OF_OPT(PKCS8_PRIV_KEY_INFO, attributes, X509_ATTRIBUTE, 0) | 82 ASN1_IMP_SET_OF_OPT(PKCS8_PRIV_KEY_INFO, attributes, X509_ATTRIBUTE, 0) |
82 } ASN1_SEQUENCE_END_cb(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO) | 83 } ASN1_SEQUENCE_END_cb(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO) |
83 | 84 |
84 IMPLEMENT_ASN1_FUNCTIONS(PKCS8_PRIV_KEY_INFO) | 85 IMPLEMENT_ASN1_FUNCTIONS(PKCS8_PRIV_KEY_INFO) |
| 86 |
| 87 int PKCS8_pkey_set0(PKCS8_PRIV_KEY_INFO *priv, ASN1_OBJECT *aobj, |
| 88 int version, |
| 89 int ptype, void *pval, |
| 90 unsigned char *penc, int penclen) |
| 91 { |
| 92 unsigned char **ppenc = NULL; |
| 93 if (version >= 0) |
| 94 { |
| 95 if (!ASN1_INTEGER_set(priv->version, version)) |
| 96 return 0; |
| 97 } |
| 98 if (penc) |
| 99 { |
| 100 int pmtype; |
| 101 ASN1_OCTET_STRING *oct; |
| 102 oct = ASN1_OCTET_STRING_new(); |
| 103 if (!oct) |
| 104 return 0; |
| 105 oct->data = penc; |
| 106 ppenc = &oct->data; |
| 107 oct->length = penclen; |
| 108 if (priv->broken == PKCS8_NO_OCTET) |
| 109 pmtype = V_ASN1_SEQUENCE; |
| 110 else |
| 111 pmtype = V_ASN1_OCTET_STRING; |
| 112 ASN1_TYPE_set(priv->pkey, pmtype, oct); |
| 113 } |
| 114 if (!X509_ALGOR_set0(priv->pkeyalg, aobj, ptype, pval)) |
| 115 { |
| 116 /* If call fails do not swallow 'enc' */ |
| 117 if (ppenc) |
| 118 *ppenc = NULL; |
| 119 return 0; |
| 120 } |
| 121 return 1; |
| 122 } |
| 123 |
| 124 int PKCS8_pkey_get0(ASN1_OBJECT **ppkalg, |
| 125 const unsigned char **pk, int *ppklen, |
| 126 X509_ALGOR **pa, |
| 127 PKCS8_PRIV_KEY_INFO *p8) |
| 128 { |
| 129 if (ppkalg) |
| 130 *ppkalg = p8->pkeyalg->algorithm; |
| 131 if(p8->pkey->type == V_ASN1_OCTET_STRING) |
| 132 { |
| 133 p8->broken = PKCS8_OK; |
| 134 if (pk) |
| 135 { |
| 136 *pk = p8->pkey->value.octet_string->data; |
| 137 *ppklen = p8->pkey->value.octet_string->length; |
| 138 } |
| 139 } |
| 140 else if (p8->pkey->type == V_ASN1_SEQUENCE) |
| 141 { |
| 142 p8->broken = PKCS8_NO_OCTET; |
| 143 if (pk) |
| 144 { |
| 145 *pk = p8->pkey->value.sequence->data; |
| 146 *ppklen = p8->pkey->value.sequence->length; |
| 147 } |
| 148 } |
| 149 else |
| 150 return 0; |
| 151 if (pa) |
| 152 *pa = p8->pkeyalg; |
| 153 return 1; |
| 154 } |
| 155 |
OLD | NEW |