/* * 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; }