2016-12-15 6 views
6

मैं X509 संरचना को डीईआर बाइट्स में एन्कोड करना चाहता हूं। openssl से स्रोत कोड उदाहरण के बाद (संस्करण> 0.9.7) man page मैं (अगर मैं i2d_X509 अपने आप ही स्मृति को आबंटित करने हैं) क्या करने की जरूरत:openssl :: i2d_X509 पर कॉल करने के बाद आउटपुट बफर को मुक्त करने का सही तरीका क्या है?

int len; 
unsigned char *buf; 

buf = NULL; 

len = i2d_X509(x, &buf); 

if (len < 0) 
    /* error */ 

हालांकि, यह पूरी तरह से स्पष्ट नहीं है (लेकिन मुझे लगता है buf के साथ किए जाने के बाद मेमोरी मुक्त करने का सही तरीका क्या है, दस्तावेज से OPENSSL_free पर कॉल करने की आवश्यकता है)।

buf मुक्त करने का सही तरीका क्या है?

+0

आपका दावा मेरे लिए सही दिखता है। –

+0

@ माइकल वाल्ज़, आशा है कि। लेकिन व्यवहार परिभाषित नहीं किया गया है, उदा। ऐसा हो सकता है कि त्रुटि होने पर भी बफ को मुक्त करने की आवश्यकता होगी। – tysonite

उत्तर

1

संक्षिप्त उत्तर: OPENSSL_freebuf मुक्त करने के लिए उपयोग किया जाना चाहिए।

लांग जवाब: IMPLEMENT_ASN1_FUNCTIONS मैक्रो i2d_X509 समारोह की परिभाषा का विस्तार किया गया है। उदाहरण के नीचे यह दर्शाता है कि, में निम्नलिखित स्रोत कोड डाल एक source.c:

#include <openssl/asn1t.h> 
IMPLEMENT_ASN1_FUNCTIONS(X509) 

gcc -E source.c के निष्पादन के बाद मैक्रो के लिए विस्तार किया गया है:

X509 *d2i_X509(X509 **a, const unsigned char **in, long len) { return (X509 *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, (&(X509_it))); } 
int i2d_X509(X509 *a, unsigned char **out) { return ASN1_item_i2d((ASN1_VALUE *)a, out, (&(X509_it))); } 
X509 *X509_new(void) { return (X509 *)ASN1_item_new((&(X509_it))); } 
void X509_free(X509 *a) { ASN1_item_free((ASN1_VALUE *)a, (&(X509_it))); } 

रुचि का विषय बारी में, i2d_X509 की परिभाषा है कि फ़ंक्शन कॉल ASN1_item_i2d

static int asn1_item_flags_i2d(ASN1_VALUE *val, unsigned char **out, 
           const ASN1_ITEM *it, int flags) 
{ 
    if (out && !*out) { 
     unsigned char *p, *buf; 
     int len; 
     len = ASN1_item_ex_i2d(&val, NULL, it, -1, flags); 
     if (len <= 0) 
      return len; 
     buf = OPENSSL_malloc(len); 
     if (buf == NULL) 
      return -1; 
     p = buf; 
     ASN1_item_ex_i2d(&val, &p, it, -1, flags); 
     *out = buf; 
     return len; 
    } 

    return ASN1_item_ex_i2d(&val, out, it, -1, flags); 
} 

शाखा if (out && !*out) एक मामले मूल प्रश्न में वर्णित में प्रयोग किया जाता है (bufNULL है): openssl के स्रोत कोड के अनुसार, ASN1_item_i2d एक समारोह tasn_enc.c फाइल में परिभाषित है। तो, आंतरिक रूप से, openssl buf के लिए OPENSSL_malloc का उपयोग करके स्मृति आवंटित करता है, और परिणामस्वरूप OPENSSL_free स्मृति को हटाने के लिए उपयोग किया जाना चाहिए।

नोट: मैंने वर्तमान समय में जीएच पर openssl के स्रोत कोड को देखा।

संबंधित मुद्दे