/* XmlRsaKey.c */
#include "diCrPKI.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
// Compiler-specific explicit link to library in current directory
// This works in MSVC and Borland - you may need to do otherwise
#pragma comment(lib, ".\\diCrPKI.lib")
// Alternatively, link explicitly to Object/Library Module "diCrPKI.lib"
void ReadInXmlKey(void)
/* Read in a private key from an XML file that we have created ourselves "by hand" */
{
long res, len;
const char *xmlfile = "userkey.xml";
const char *outfile = "userencprivkey.bin";
char *lpszPrivateKey, *lpszXML;
FILE *fp;
// Read in the XML file to a string
fp = fopen(xmlfile, "rb");
assert(fp);
// Get its length
fseek(fp, 0, SEEK_END);
len = ftell(fp);
assert(len > 0);
rewind(fp);
// Read into memory - note extra byte for null
lpszXML = calloc(len+1, 1);
assert(lpszXML);
fread(lpszXML, 1, len, fp);
fclose(fp);
printf("XML (as read)=\n%s\n", lpszXML);
// Now convert from XML to crPKI internal format
len = RSA_FromXMLString(NULL, 0, lpszXML, 0);
if (len < 0) printf("Error code %ld\n", len);
assert(len > 0);
lpszPrivateKey = malloc(len+1);
res = RSA_FromXMLString(lpszPrivateKey, len, lpszXML, 0);
assert(res > 0);
// Display in internal base64 format
printf("Private key (internal format)=\n%s\n", lpszPrivateKey);
// Verify that we have a valid RSA key
res = RSA_CheckKey(lpszPrivateKey, 0);
printf("%s\n", (res == 0 ? "Key is a valid RSA private key" : "Key is INVALID!"));
len = RSA_KeyBits(lpszPrivateKey);
printf("Key is %ld bits long\n", len);
// You can now use lpszPrivate key to carry out signing/decryption
//...
// We can also save this as an encrypted PKCS-8 file
res = RSA_SaveEncPrivateKey(outfile, lpszPrivateKey, 1024, "password", 0);
if (res == 0)
printf("Saved encrypted private key as '%s'.\n", outfile);
else
printf("Failed to save encrypted private key: error code %ld\n", res);
// Free allocated memory
free(lpszPrivateKey);
free(lpszXML);
}
void ReadInXmlPublicKey(char *xmlfile)
/* Read in a public key from an XML file that we have created ourselves "by hand" */
{
long res, len;
char *lpszPublicKey, *lpszXML;
const char *outfile = "userpubkey.bin";
FILE *fp;
/* We can do this two ways depending what data we have:
1) from the public/private key pair data using the PKI_XML_EXCLPRIVATE option
2) from an XML file that just contains the public key components
*/
// Read in the XML file to a string
fp = fopen(xmlfile, "rb");
assert(fp);
// Get its length
fseek(fp, 0, SEEK_END);
len = ftell(fp);
assert(len > 0);
rewind(fp);
// Read into memory - note extra byte for null
lpszXML = calloc(len+1, 1);
assert(lpszXML);
fread(lpszXML, 1, len, fp);
fclose(fp);
printf("XML (as read)=\n%s\n", lpszXML);
// Now convert from XML to crPKI internal format
len = RSA_FromXMLString(NULL, 0, lpszXML, PKI_XML_EXCLPRIVATE);
if (len < 0) printf("Error code %ld\n", len);
assert(len > 0);
lpszPublicKey = malloc(len+1);
res = RSA_FromXMLString(lpszPublicKey, len, lpszXML, PKI_XML_EXCLPRIVATE);
assert(res > 0);
// Display in internal base64 format
printf("Public key (internal format)\n=%s\n", lpszPublicKey);
// Verify that we have an RSA public key (you can't validate it)
res = RSA_CheckKey(lpszPublicKey, 0);
printf("%s\n", (res == 1 ? "Key is an RSA public key" : "Key is INVALID!"));
len = RSA_KeyBits(lpszPublicKey);
printf("Key is %ld bits long\n", len);
// We can also save this as a PKCS-1 RSAPublicKey file
res = RSA_SavePublicKey(outfile, lpszPublicKey, 0);
if (res == 0)
printf("Saved public key as '%s'.\n", outfile);
else
printf("Failed to save public key: error code %ld\n", res);
// Free allocated memory
free(lpszPublicKey);
free(lpszXML);
}
int main()
{
ReadInXmlKey();
ReadInXmlPublicKey("userkey.xml");
ReadInXmlPublicKey("userpublickey.xml");
return 0;
}