Added lasso_get_public_key_from_pem_cert_file()

and lasso_get_pem_file_type() functions
This commit is contained in:
Valery Febvre 2004-09-20 13:33:22 +00:00
parent f0e838f219
commit 1af6414dc1
2 changed files with 131 additions and 24 deletions

View File

@ -33,7 +33,6 @@
#include <xmlsec/base64.h>
#include <xmlsec/xmldsig.h>
#include <xmlsec/templates.h>
#include <xmlsec/crypto.h>
#include <lasso/xml/tools.h>
@ -164,6 +163,102 @@ lasso_get_current_time()
return ret;
}
/**
* lasso_get_pubkey_from_pem_certificate:
* @pem_cert_file: an X509 pem certificate file
*
* Gets the public key in an X509 pem certificate file.
*
* Return value: a public key or NULL if an error occurs.
**/
xmlSecKeyPtr
lasso_get_public_key_from_pem_cert_file(const gchar *pem_cert_file)
{
FILE *fd;
X509 *pem_cert;
xmlSecKeyDataPtr data;
xmlSecKeyPtr key = NULL;
/* load pem certificate from file */
fd = fopen(pem_cert_file, "r");
if (fd == NULL) {
message(G_LOG_LEVEL_CRITICAL, "Failed to open %s pem certificate file\n",
pem_cert_file);
return NULL;
}
/* read the pem X509 certificate */
pem_cert = PEM_read_X509(fd, NULL, NULL, NULL);
fclose(fd);
if (pem_cert == NULL) {
message(G_LOG_LEVEL_CRITICAL, "Failed to read X509 certificate\n");
return NULL;
}
/* get public key value in certificate */
data = xmlSecOpenSSLX509CertGetKey(pem_cert);
if (data != NULL) {
/* create key and set key value */
key = xmlSecKeyCreate();
xmlSecKeySetValue(key, data);
}
else {
message(G_LOG_LEVEL_CRITICAL,
"Failed to get the public key in the X509 certificate\n");
}
X509_free(pem_cert);
return key;
}
/**
* lasso_get_pem_file_type:
* @pem_file: a pem file
*
* Gets the type of the pem file.
*
* Return value: the pem file type
**/
lassoPemFileType
lasso_get_pem_file_type(const gchar *pem_file)
{
BIO* bio;
EVP_PKEY *pkey;
X509 *cert;
guint type = lassoPemFileTypeUnknown;
bio = BIO_new_file(pem_file, "rb");
if (bio == NULL) {
message(G_LOG_LEVEL_CRITICAL, "Failed to open %s pem file\n",
pem_file);
return -1;
}
pkey = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL);
if (pkey != NULL) {
type = lassoPemFileTypePubKey;
EVP_PKEY_free(pkey);
}
else {
BIO_reset(bio);
pkey = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL);
if (pkey != NULL) {
type = lassoPemFileTypePrivateKey;
EVP_PKEY_free(pkey);
}
else {
BIO_reset(bio);
cert = PEM_read_bio_X509(bio, NULL, NULL, NULL);
if (cert != NULL) {
type = lassoPemFileTypeCert;
X509_free(cert);
}
}
}
BIO_free(bio);
return type;
}
/**
* lasso_query_get_value:
* @query: a query (an url-encoded node)
@ -305,8 +400,8 @@ lasso_query_verify_signature(const gchar *query,
lassoSignatureMethodRsaSha1,
recipient_private_key_file);
sigValNode = xmlSecFindNode(xmlDocGetRootElement(doc),
xmlSecNodeSignatureValue,
xmlSecDSigNs);
xmlSecNodeSignatureValue,
xmlSecDSigNs);
/* set SignatureValue content */
str_unescaped = lasso_str_unescape(str_split[1]);
xmlNodeSetContent(sigValNode, str_unescaped);
@ -336,9 +431,9 @@ lasso_query_verify_signature(const gchar *query,
goto done;
}
/* Verify signature */
/* verify signature */
if(xmlSecDSigCtxVerify(dsigCtx, sigNode) < 0) {
message(G_LOG_LEVEL_CRITICAL, "Signature verify failed\n");
message(G_LOG_LEVEL_CRITICAL, "Failed to verify signature\n");
ret = 0;
goto done;
}

View File

@ -33,6 +33,7 @@ extern "C" {
#include <glib-object.h>
#include <libxml/tree.h>
#include <xmlsec/crypto.h>
#include <lasso/export.h>
#include <lasso/xml/debug.h>
@ -42,36 +43,47 @@ typedef enum {
lassoSignatureMethodDsaSha1
} lassoSignatureMethod;
LASSO_EXPORT xmlChar* lasso_build_random_sequence (guint8 size);
typedef enum {
lassoPemFileTypeUnknown = 0,
lassoPemFileTypePubKey,
lassoPemFileTypePrivateKey,
lassoPemFileTypeCert
} lassoPemFileType;
LASSO_EXPORT xmlChar* lasso_build_unique_id (guint8 size);
LASSO_EXPORT xmlChar* lasso_build_random_sequence (guint8 size);
LASSO_EXPORT xmlChar* lasso_doc_get_node_content (xmlDocPtr doc,
const xmlChar *name);
LASSO_EXPORT xmlChar* lasso_build_unique_id (guint8 size);
LASSO_EXPORT xmlChar* lasso_g_ptr_array_index (GPtrArray *a,
guint i);
LASSO_EXPORT xmlChar* lasso_doc_get_node_content (xmlDocPtr doc,
const xmlChar *name);
LASSO_EXPORT gchar* lasso_get_current_time (void);
LASSO_EXPORT xmlChar* lasso_g_ptr_array_index (GPtrArray *a,
guint i);
LASSO_EXPORT GPtrArray* lasso_query_get_value (const gchar *query,
const xmlChar *param);
LASSO_EXPORT gchar* lasso_get_current_time (void);
LASSO_EXPORT GData* lasso_query_to_dict (const gchar *query);
LASSO_EXPORT GPtrArray* lasso_query_get_value (const gchar *query,
const xmlChar *param);
LASSO_EXPORT int lasso_query_verify_signature (const gchar *query,
const xmlChar *sender_public_key_file,
const xmlChar *recipient_private_key_file);
LASSO_EXPORT xmlSecKeyPtr lasso_get_public_key_from_pem_cert_file (const gchar *pem_cert_file);
LASSO_EXPORT xmlChar* lasso_sha1 (xmlChar *str);
LASSO_EXPORT lassoPemFileType lasso_get_pem_file_type (const gchar *pem_file);
LASSO_EXPORT xmlChar* lasso_str_escape (xmlChar *str);
LASSO_EXPORT GData* lasso_query_to_dict (const gchar *query);
LASSO_EXPORT xmlDocPtr lasso_str_sign (xmlChar *str,
lassoSignatureMethod sign_method,
const char *private_key_file);
LASSO_EXPORT int lasso_query_verify_signature (const gchar *query,
const xmlChar *sender_public_key_file,
const xmlChar *recipient_private_key_file);
LASSO_EXPORT xmlChar* lasso_str_unescape (xmlChar *str);
LASSO_EXPORT xmlChar* lasso_sha1 (xmlChar *str);
LASSO_EXPORT xmlChar* lasso_str_escape (xmlChar *str);
LASSO_EXPORT xmlDocPtr lasso_str_sign (xmlChar *str,
lassoSignatureMethod sign_method,
const char *private_key_file);
LASSO_EXPORT xmlChar* lasso_str_unescape (xmlChar *str);
#ifdef __cplusplus
}