Crypt-MatrixSSL
view release on metacpan or search on metacpan
matrixssl-1-8-6-open/src/pki/rsaPki.c view on Meta::CPAN
#define ATTRIB_COUNTRY_NAME 6
#define ATTRIB_LOCALITY 7
#define ATTRIB_ORGANIZATION 10
#define ATTRIB_ORG_UNIT 11
#define ATTRIB_DN_QUALIFIER 46
#define ATTRIB_STATE_PROVINCE 8
#define ATTRIB_COMMON_NAME 3
#ifdef USE_3DES
static const char encryptHeader[] = "DEK-Info: DES-EDE3-CBC,";
static int32 hexToBinary(unsigned char *hex, unsigned char *bin, int32 binlen);
#endif
static int32 psAsnParsePrivateKey(psPool_t *pool, unsigned char **pp,
int32 size, sslRsaKey_t *key);
#endif /* USE_RSA */
/******************************************************************************/
/*
Open and close the PKI module. These routines are called once in the
lifetime of the application and initialize and clean up the library
respectively.
*/
int32 matrixPkiOpen(void)
{
if (sslOpenOsdep() < 0) {
matrixStrDebugMsg("Osdep open failure\n", NULL);
return -1;
}
return 0;
}
void matrixPkiClose(void)
{
sslCloseOsdep();
}
#ifdef USE_FILE_SYSTEM
/******************************************************************************/
/*
Return the file contents given a file name in a single allocated buffer.
Not a good routine to use generally with the fixed mem stuff. Not
actually doing a 'binary' file read. Only using the 'r' attribute since
all the cert and key files are text.
*/
int32 psGetFileBin(psPool_t *pool, const char *fileName, unsigned char **bin,
int32 *binLen)
{
FILE *fp;
struct stat fstat;
size_t tmp = 0;
*binLen = 0;
*bin = NULL;
if (fileName == NULL) {
return -1;
}
if ((stat(fileName, &fstat) != 0) || (fp = fopen(fileName, "r")) == NULL) {
return -7; /* FILE_NOT_FOUND */
}
*bin = psMalloc(pool, fstat.st_size + 1);
if (*bin == NULL) {
return -8; /* SSL_MEM_ERROR */
}
memset(*bin, 0x0, fstat.st_size + 1);
while (((tmp = fread(*bin + *binLen, sizeof(char), 512, fp)) > 0) &&
(*binLen < fstat.st_size)) {
*binLen += (int32)tmp;
}
fclose(fp);
return 0;
}
/******************************************************************************/
/*
* Public API to return an ASN.1 encoded key stream from a PEM private
* key file
*
* If password is provided, we only deal with 3des cbc encryption
* Function allocates key on success. User must free.
*/
int32 matrixRsaReadPrivKey(psPool_t *pool, const char *fileName,
const char *password, unsigned char **keyMem, int32 *keyMemLen)
{
unsigned char *keyBuf, *DERout, *start, *end;
int32 keyBufLen, rc, DERlen, PEMlen = 0;
#ifdef USE_3DES
sslCipherContext_t ctx;
unsigned char passKey[SSL_DES3_KEY_LEN];
unsigned char cipherIV[SSL_DES3_IV_LEN];
int32 tmp, encrypted = 0;
#endif /* USE_3DES */
if (fileName == NULL) {
return 0;
}
*keyMem = NULL;
if ((rc = psGetFileBin(pool, fileName, &keyBuf, &keyBufLen)) < 0) {
return rc;
}
start = end = NULL;
/*
* Check header and encryption parameters.
*/
if ((start = strstr(keyBuf, "-----BEGIN RSA PRIVATE KEY-----")) == NULL) {
matrixStrDebugMsg("Error parsing private key buffer\n", NULL);
psFree(keyBuf);
return -1;
}
start += strlen("-----BEGIN RSA PRIVATE KEY-----");
while (*start == '\r' || *start == '\n') {
start++;
}
if (strstr(keyBuf, "Proc-Type:") && strstr(keyBuf, "4,ENCRYPTED")) {
#ifdef USE_3DES
( run in 2.567 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )