/* Free private key and cert and zero memory allocated by matrixSslReadKeys. */ void matrixRsaFreeKeys(sslKeys_t *keys) { sslLocalCert_t *current, *next; int32 i = 0; if (keys) { current = &keys->cert; while (current) { if (current->certBin) { memset(current->certBin, 0x0, current->certLen); psFree(current->certBin); } if (current->privKey) { matrixRsaFreeKey(current->privKey); } next = current->next; if (i++ > 0) { psFree(current); } current = next; } #ifdef USE_CLIENT_SIDE_SSL if (keys->caCerts) { matrixX509FreeCert(keys->caCerts); } #endif /* USE_CLIENT_SIDE_SSL */ psFree(keys); } }
/* Binary to struct helper for RSA public keys. */ int32 matrixRsaParsePubKey(psPool_t *pool, unsigned char *keyBuf, int32 keyBufLen, sslRsaKey_t **key) { unsigned char *p, *end; int32 len; p = keyBuf; end = p + keyBufLen; /* Supporting both the PKCS#1 RSAPublicKey format and the X.509 SubjectPublicKeyInfo format. If encoding doesn't start with the SEQUENCE identifier for the SubjectPublicKeyInfo format, jump down to the RSAPublicKey subset parser and try that */ if (getSequence(&p, (int32)(end - p), &len) == 0) { if (getAlgorithmIdentifier(&p, (int32)(end - p), &len, 1) < 0) { return -1; } } /* Now have the DER stream to extract from in asnp */ *key = psMalloc(pool, sizeof(sslRsaKey_t)); if (*key == NULL) { return -8; /* SSL_MEM_ERROR */ } memset(*key, 0x0, sizeof(sslRsaKey_t)); if (getPubKey(pool, &p, (int32)(end - p), *key) < 0) { matrixRsaFreeKey(*key); *key = NULL; matrixStrDebugMsg("Unable to ASN parse public key\n", NULL); return -1; } return 0; }
/* Binary to struct helper for RSA public keys */ int32 matrixRsaParsePubKey(psPool_t *pool, unsigned char *keyBuf, int32 keyBufLen, sslRsaKey_t **key) { /* Now have the DER stream to extract from in asnp */ *key = psMalloc(pool, sizeof(sslRsaKey_t)); if (*key == NULL) { return -8; /* SSL_MEM_ERROR */ } memset(*key, 0x0, sizeof(sslRsaKey_t)); if (getPubKey(pool, &keyBuf, keyBufLen, *key) < 0) { matrixRsaFreeKey(*key); *key = NULL; matrixStrDebugMsg("Unable to ASN parse public key\n", NULL); return -1; } return 0; }