40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * CDDL HEADER START
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * The contents of this file are subject to the terms of the
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Common Development and Distribution License (the "License").
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * You may not use this file except in compliance with the License.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * or http://www.opensolaris.org/os/licensing.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * See the License for the specific language governing permissions
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * and limitations under the License.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * When distributing Covered Code, include this CDDL HEADER in each
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * If applicable, add the following below this CDDL HEADER, with the
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * fields enclosed by brackets "[]" replaced with your own identifying
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * information: Portions Copyright [yyyy] [name of copyright owner]
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * CDDL HEADER END
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
2c2c41837e330b002c4220a39638150db504fe0evi * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Use is subject to license terms.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#pragma ident "%Z%%M% %I% %E% SMI"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#include <stdio.h>
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#include <stdlib.h>
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#include <string.h>
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#include <fcntl.h>
2c2c41837e330b002c4220a39638150db504fe0evi#include <pthread.h>
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#include <unistd.h>
2c2c41837e330b002c4220a39638150db504fe0evi#include <sip.h>
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#ifdef __linux__
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#include <sasl/sasl.h>
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#include <sasl/saslplug.h>
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#else
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#include <sys/md5.h>
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#endif
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#include "sip_miscdefs.h"
2c2c41837e330b002c4220a39638150db504fe0evi#include "sip_msg.h"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vivoid sip_md5_hash(char *, int, char *, int, char *, int, char *, int,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *, int, char *, int, uchar_t *);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#define SIP_RANDOM_LEN 20
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Wrapper around /dev/urandom
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vistatic int
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_random(char *buf, int buflen)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi static int devrandom = -1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (devrandom == -1 &&
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (devrandom = open("/dev/urandom", O_RDONLY)) == -1) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (-1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (read(devrandom, buf, buflen) == -1)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (-1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Get MD5 hash of call_id, from_tag, to_tag using key
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vivoid
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_md5_hash(char *str1, int lstr1, char *str2, int lstr2, char *str3,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int lstr3, char *str4, int lstr4, char *str5, int lstr5,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *str6, int lstr6, uchar_t *digest)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi MD5_CTX ctx;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#ifdef __linux__
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sasl_MD5Init(&ctx);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sasl_MD5Update(&ctx, (uchar_t *)&sip_hash_salt, sizeof (uint64_t));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (str1 != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sasl_MD5Update(&ctx, (uchar_t *)str1, lstr1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (str2 != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sasl_MD5Update(&ctx, (uchar_t *)str2, lstr2);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (str3 != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sasl_MD5Update(&ctx, (uchar_t *)str3, lstr3);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (str4 != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sasl_MD5Update(&ctx, (uchar_t *)str4, lstr4);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (str5 != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sasl_MD5Update(&ctx, (uchar_t *)str5, lstr5);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (str6 != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sasl_MD5Update(&ctx, (uchar_t *)str6, lstr6);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sasl_MD5Final(digest, &ctx);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#else /* solaris */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi MD5Init(&ctx);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi MD5Update(&ctx, (uchar_t *)&sip_hash_salt, sizeof (uint64_t));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (str1 != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi MD5Update(&ctx, (uchar_t *)str1, lstr1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (str2 != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi MD5Update(&ctx, (uchar_t *)str2, lstr2);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (str3 != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi MD5Update(&ctx, (uchar_t *)str3, lstr3);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (str4 != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi MD5Update(&ctx, (uchar_t *)str4, lstr4);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (str5 != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi MD5Update(&ctx, (uchar_t *)str5, lstr5);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (str6 != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi MD5Update(&ctx, (uchar_t *)str6, lstr6);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi MD5Final(digest, &ctx);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#endif
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * generate a guid (globally unique id)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vichar *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_guid()
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int i;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi uint8_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi uint32_t random;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi uint32_t time;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *guid;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int guidlen;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#ifdef __linux__
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi struct timespec tspec;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#endif
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi guid = (char *)malloc(SIP_RANDOM_LEN + 1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (guid == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Get a 32-bit random #
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_get_random((char *)&random, sizeof (random)) != 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#ifdef __linux__
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (clock_gettime(CLOCK_REALTIME, &tspec) != 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi time = (uint32_t)tspec.tv_nsec;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#else
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Get 32-bits from gethrtime()
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi time = (uint32_t)gethrtime();
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#endif
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) snprintf(guid, SIP_RANDOM_LEN + 1, "%u%u", random, time);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi guidlen = strlen(guid);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * just throw in some alphabets too
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (uint8_t *)malloc(guidlen);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_get_random((char *)r, guidlen) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(guid);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi for (i = 0; i < guidlen; i++) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if ((r[i] >= 65 && r[i] <= 90) ||
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (r[i] >= 97 && r[i] <= 122)) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi guid[i] = r[i];
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (guid);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Generate branchid for a transaction
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vichar *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_branchid(sip_msg_t sip_msg)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *guid;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *branchid;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_header_t *via;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi unsigned char md5_hash[16];
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_header_t *to;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_header_t *from;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_header_t *callid;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg_t *_sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int cseq;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi MD5_CTX ctx;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi size_t len;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int hdrlen;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int i;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vigenerate_bid:
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if ((branchid = (char *)malloc(SIP_BRANCHID_LEN + 1)) == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi guid = sip_guid();
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (guid == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(branchid);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) snprintf(branchid, SIP_BRANCHID_LEN + 1, "z9hG4bK%s",
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi guid);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(guid);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (branchid);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg = (_sip_msg_t *)sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi via = sip_search_for_header(_sip_msg, SIP_VIA, NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (via == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi goto generate_bid;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi to = sip_search_for_header(_sip_msg, SIP_TO, NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi from = sip_search_for_header(_sip_msg, SIP_FROM, NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi callid = sip_search_for_header(_sip_msg, SIP_CALL_ID, NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi cseq = sip_get_callseq_num(_sip_msg, NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (to == NULL || from == NULL || callid == NULL || cseq == -1)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (_sip_msg->sip_msg_req_res == NULL ||
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg->sip_msg_req_res->U.sip_request.sip_request_uri.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_ptr == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi len = 2 * sizeof (md5_hash) + 1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if ((branchid = malloc(len)) == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#ifdef __linux__
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sasl_MD5Init(&ctx);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdrlen = via->sip_hdr_end - via->sip_hdr_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sasl_MD5Update(&ctx, (uchar_t *)via->sip_hdr_start, hdrlen);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdrlen = to->sip_hdr_end - to->sip_hdr_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sasl_MD5Update(&ctx, (uchar_t *)to->sip_hdr_start, hdrlen);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdrlen = from->sip_hdr_end - from->sip_hdr_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sasl_MD5Update(&ctx, (uchar_t *)from->sip_hdr_start, hdrlen);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdrlen = callid->sip_hdr_end - callid->sip_hdr_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sasl_MD5Update(&ctx, (uchar_t *)callid->sip_hdr_start, hdrlen);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sasl_MD5Update(&ctx, (uchar_t *)_sip_msg->sip_msg_req_res->
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi U.sip_request.sip_request_uri.sip_str_ptr,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg->sip_msg_req_res->U.sip_request.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_request_uri.sip_str_len);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sasl_MD5Update(&ctx, (uchar_t *)&cseq, sizeof (int));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sasl_MD5Final(md5_hash, &ctx);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#else /* solaris */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi MD5Init(&ctx);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdrlen = via->sip_hdr_end - via->sip_hdr_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi MD5Update(&ctx, (uchar_t *)via->sip_hdr_start, hdrlen);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdrlen = to->sip_hdr_end - to->sip_hdr_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi MD5Update(&ctx, (uchar_t *)to->sip_hdr_start, hdrlen);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdrlen = from->sip_hdr_end - from->sip_hdr_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi MD5Update(&ctx, (uchar_t *)from->sip_hdr_start, hdrlen);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdrlen = callid->sip_hdr_end - callid->sip_hdr_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi MD5Update(&ctx, (uchar_t *)callid->sip_hdr_start, hdrlen);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi MD5Update(&ctx, (uchar_t *)_sip_msg->sip_msg_req_res->
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi U.sip_request.sip_request_uri.sip_str_ptr,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg->sip_msg_req_res->U.sip_request.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_request_uri.sip_str_len);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi MD5Update(&ctx, (uchar_t *)&cseq, sizeof (int));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi MD5Final(md5_hash, &ctx);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#endif
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi for (i = 0; i < sizeof (md5_hash); i++) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) snprintf(&branchid[2 * i], len - (2 * i), "%02x",
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi md5_hash[i]);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (branchid);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viuint32_t
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_cseq()
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi time_t tval;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tval = time(NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return ((uint32_t)tval);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viuint32_t
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_rseq()
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi time_t tval;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tval = time(NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return ((uint32_t)tval);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}