Index: openssl/crypto/asn1/p8_pkey.c |
=================================================================== |
--- openssl/crypto/asn1/p8_pkey.c (revision 105093) |
+++ openssl/crypto/asn1/p8_pkey.c (working copy) |
@@ -3,7 +3,7 @@ |
* project 1999. |
*/ |
/* ==================================================================== |
- * Copyright (c) 1999 The OpenSSL Project. All rights reserved. |
+ * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
@@ -62,7 +62,8 @@ |
#include <openssl/x509.h> |
/* Minor tweak to operation: zero private key data */ |
-static int pkey_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it) |
+static int pkey_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, |
+ void *exarg) |
{ |
/* Since the structure must still be valid use ASN1_OP_FREE_PRE */ |
if(operation == ASN1_OP_FREE_PRE) { |
@@ -82,3 +83,73 @@ |
} ASN1_SEQUENCE_END_cb(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO) |
IMPLEMENT_ASN1_FUNCTIONS(PKCS8_PRIV_KEY_INFO) |
+ |
+int PKCS8_pkey_set0(PKCS8_PRIV_KEY_INFO *priv, ASN1_OBJECT *aobj, |
+ int version, |
+ int ptype, void *pval, |
+ unsigned char *penc, int penclen) |
+ { |
+ unsigned char **ppenc = NULL; |
+ if (version >= 0) |
+ { |
+ if (!ASN1_INTEGER_set(priv->version, version)) |
+ return 0; |
+ } |
+ if (penc) |
+ { |
+ int pmtype; |
+ ASN1_OCTET_STRING *oct; |
+ oct = ASN1_OCTET_STRING_new(); |
+ if (!oct) |
+ return 0; |
+ oct->data = penc; |
+ ppenc = &oct->data; |
+ oct->length = penclen; |
+ if (priv->broken == PKCS8_NO_OCTET) |
+ pmtype = V_ASN1_SEQUENCE; |
+ else |
+ pmtype = V_ASN1_OCTET_STRING; |
+ ASN1_TYPE_set(priv->pkey, pmtype, oct); |
+ } |
+ if (!X509_ALGOR_set0(priv->pkeyalg, aobj, ptype, pval)) |
+ { |
+ /* If call fails do not swallow 'enc' */ |
+ if (ppenc) |
+ *ppenc = NULL; |
+ return 0; |
+ } |
+ return 1; |
+ } |
+ |
+int PKCS8_pkey_get0(ASN1_OBJECT **ppkalg, |
+ const unsigned char **pk, int *ppklen, |
+ X509_ALGOR **pa, |
+ PKCS8_PRIV_KEY_INFO *p8) |
+ { |
+ if (ppkalg) |
+ *ppkalg = p8->pkeyalg->algorithm; |
+ if(p8->pkey->type == V_ASN1_OCTET_STRING) |
+ { |
+ p8->broken = PKCS8_OK; |
+ if (pk) |
+ { |
+ *pk = p8->pkey->value.octet_string->data; |
+ *ppklen = p8->pkey->value.octet_string->length; |
+ } |
+ } |
+ else if (p8->pkey->type == V_ASN1_SEQUENCE) |
+ { |
+ p8->broken = PKCS8_NO_OCTET; |
+ if (pk) |
+ { |
+ *pk = p8->pkey->value.sequence->data; |
+ *ppklen = p8->pkey->value.sequence->length; |
+ } |
+ } |
+ else |
+ return 0; |
+ if (pa) |
+ *pa = p8->pkeyalg; |
+ return 1; |
+ } |
+ |