/*
 * Set Identity header
 * param trans Transaction handle
 * return 0 success, -1 failure
 */
static int ospSetIdentity(
    OSPTTRANHANDLE trans)
{
    char encoded[OSP_SIGNBUF_SIZE];
    unsigned encodedsize = sizeof(encoded);
    unsigned char sign[OSP_SIGNBUF_SIZE];
    unsigned signsize = sizeof(sign);
    char alg[OSP_ALGBUF_SIZE];
    char info[OSP_STRBUF_SIZE];
    char type[OSP_STRBUF_SIZE];
    unsigned char canon[OSP_STRBUF_SIZE];
    unsigned canonsize = sizeof(canon);
    str value;
    int result = -1;

    if (OSPPTransactionGetIdentity(trans, &signsize, sign, sizeof(alg), alg, sizeof(info), info, sizeof(type), type, &canonsize, canon) == OSPC_ERR_NO_ERROR) {
        if (signsize != 0) {
            if (OSPPBase64Encode(sign, signsize, (unsigned char*)encoded, &encodedsize) == OSPC_ERR_NO_ERROR) {
                value.s = encoded;
                value.len = encodedsize;
                add_avp(_osp_idsign_avptype | AVP_VAL_STR, _osp_idsign_avpid, (int_str)value);
            }
        }

        if (alg[0] != '\0') {
            value.s = alg;
            value.len = strlen(alg);
            add_avp(_osp_idalg_avptype | AVP_VAL_STR, _osp_idalg_avpid, (int_str)value);
        }

        if (info[0] != '\0') {
            value.s = info;
            value.len = strlen(info);
            add_avp(_osp_idinfo_avptype | AVP_VAL_STR, _osp_idinfo_avpid, (int_str)value);
        }

        if (type[0] != '\0') {
            value.s = type;
            value.len = strlen(type);
            add_avp(_osp_idtype_avptype | AVP_VAL_STR, _osp_idtype_avpid, (int_str)value);
        }

        if (canonsize != 0) {
            if (OSPPBase64Encode(canon, canonsize, (unsigned char*)encoded, &encodedsize) == OSPC_ERR_NO_ERROR) {
                value.s = encoded;
                value.len = encodedsize;
                add_avp(_osp_idcanon_avptype | AVP_VAL_STR, _osp_idcanon_avpid, (int_str)value);
            }
        }

        result = 0;
    } 

    return result;
}
int addOspHeader(struct sip_msg* msg, char* token, int sizeoftoken) {

	char headerBuffer[3500];
	char encodedToken[3000];
	int  sizeofencodedToken = sizeof(encodedToken);
	str  headerVal;
	int  retVal = 1;

	if (OSPPBase64Encode(token, sizeoftoken, encodedToken, &sizeofencodedToken) == 0) {
		snprintf(headerBuffer,
			 sizeof(headerBuffer),
			 "%s%.*s\r\n", 
			 OSP_HEADER,
			 sizeofencodedToken,
			 encodedToken);

		headerVal.s = headerBuffer;
		headerVal.len = strlen(headerBuffer);

		DBG("osp: Setting osp token header field - (%s)\n", headerBuffer);

		if (append_hf(msg,(char *)&headerVal,NULL) > 0) {
			retVal = 0;
		} else {
			LOG(L_ERR, "ERROR: osp: addOspHeader: failed to append osp header to the message\n");
		}
	} else {
		LOG(L_ERR, "ERROR: osp: addOspHeader: base64 encoding failed\n");
	}

	return retVal;
}
/*
 * Add OSP token header to SIP message
 * param msg SIP message
 * param token OSP authorization token
 * param tokensize Size of OSP authorization token
 * return 0 success, -1 failure
 */
int ospAddOspHeader(
    struct sip_msg* msg,
    unsigned char* token,
    unsigned int tokensize)
{
    str headerval;
    char buffer[OSP_HEADERBUF_SIZE];
    unsigned char encodedtoken[OSP_TOKENBUF_SIZE];
    unsigned int encodedtokensize = sizeof(encodedtoken);
    int errorcode, result = -1;

    if ((token == NULL) || (tokensize == 0)) {
        LM_DBG("destination is not OSP device\n");
        result = 0;
    } else {
        if ((errorcode = OSPPBase64Encode(token, tokensize, encodedtoken, &encodedtokensize)) == OSPC_ERR_NO_ERROR) {
            snprintf(buffer,
                sizeof(buffer),
                "%s: %.*s\r\n",
                OSP_TOKEN_HEADER,
                encodedtokensize,
                encodedtoken);
            buffer[sizeof(buffer) - 1] = '\0';

            headerval.s = buffer;
            headerval.len = strlen(buffer);

            LM_DBG("setting osp token header field '%s'\n", buffer);

            if (ospAppendHeader(msg, &headerval) == 0) {
                result = 0;
            } else {
                LM_ERR("failed to append osp header\n");
            }
        } else {
            LM_ERR("failed to base64 encode token (%d)\n", errorcode);
        }
    }

    return result;
}