OID(Object Identifier) denotes an object.
Examples:
------------------------------------------------------------------
OID object
------------------------------------------------------------------
1.3.14.3.2.26 SHA-1
2.16.840.1.101.3.4.2.1 SHA-256
1.2.840.113549.1.7.2 PKCS-7 signedData
------------------------------------------------------------------
In OpenSSL no functions are directly provided to compute the OID ASN.1 encode. At lease two methods can be taken into account.
1. Create a temporary object by invoking function OBJ_create(), then encode it by invoking function i2d_ASN1_OBJECT().
Implementation (Not recommended)
/************************************************** * Author: HAN Wei * Author's blog: http://blog.csdn.net/henter/ * Date: Oct 11th, 2014 * Description: implement the OID ASN.1 encode function **************************************************/ #include <stdio.h> #include <openssl/objects.h> #include <openssl/asn1.h> int Asn1EncodeOid(char *oid, unsigned char *encode, int *encode_len) { int new_nid, byte_len; ASN1_OBJECT *obj; unsigned char *tmp_pointer; new_nid = OBJ_create(oid, "oid example", "Object Identifier Example"); obj = OBJ_nid2obj(new_nid); if (!encode) { byte_len = i2d_ASN1_OBJECT(obj, NULL); if (byte_len <= 0) { #ifdef _DEBUG printf("get ASN.1 encode byte length failed at %s, line %d! ", __FILE__, __LINE__); #endif OBJ_cleanup(); return (-1); } else { *encode_len = byte_len; OBJ_cleanup(); return 0; } } else { tmp_pointer = encode; byte_len = i2d_ASN1_OBJECT(obj, &tmp_pointer); if (byte_len <= 0) { #ifdef _DEBUG printf("ASN.1 encode OID failed at %s, line %d! ", __FILE__, __LINE__); #endif OBJ_cleanup(); return (-1); } else { *encode_len = byte_len; OBJ_cleanup(); return 0; } } }
This is not a good implementation. OBJ_cleanup() will free all dynamically created object, so this function must be used carefully. Especially when multiple threads are running, the fact that one thread invokes OBJ_cleanup() may run the risk of cleaning object
created by other threads. The consequence is unpredictable.
2. Compute OID payload part ASN.1 encode by invoking function a2d_ASN1_OBJECT() firstly, compute the OID encode by invoking function i2d_ASN1_OBJECT() next.
A complete Implementation (recommended)
Header file:
/************************************************** * File name: oid_encode.h * Author: HAN Wei * Author's blog: http://blog.csdn.net/henter/ * Date: Oct 11th, 2014 * Description: declare the OID ASN.1 encode function **************************************************/ #ifndef HEADER_OID_ASN1_ENCODE_H #define HEADER_OID_ASN1_ENCODE_H #ifdef __cplusplus extern "C" { #endif /************************************************** * Name: Asn1EncodeOid * Function: compute ASN.1 encode for a specific OID * Parameters: oid [in] OID string terminated with '