1/*
2 * Copyright (c) 1999-2001,2005-2008,2010-2012,2014 Apple Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24/*
25 * sslUtils.c - Misc. OS independant SSL utility functions
26 */
27
28/* THIS FILE CONTAINS KERNEL CODE */
29
30#include "sslUtils.h"
31#include "sslTypes.h"
32#include "sslDebug.h"
33
34#include <AssertMacros.h>
35
36#ifndef NDEBUG
37void SSLDump(const unsigned char *data, unsigned long len)
38{
39    unsigned long i;
40    for(i=0;i<len;i++)
41    {
42        if((i&0xf)==0) printf("%04lx :",i);
43        printf(" %02x", data[i]);
44        if((i&0xf)==0xf) printf("\n");
45    }
46    printf("\n");
47}
48#endif
49
50unsigned int
51SSLDecodeInt(const uint8_t *p, size_t length)
52{
53    unsigned int val = 0;
54    check(length > 0 && length <= 4); //anything else would be an internal error.
55    while (length--)
56        val = (val << 8) | *p++;
57    return val;
58}
59
60uint8_t *
61SSLEncodeInt(uint8_t *p, size_t value, size_t length)
62{
63    unsigned char *retVal = p + length; /* Return pointer to char after int */
64    check(length > 0 && length <= 4);  //anything else would be an internal error.
65    while (length--)                    /* Assemble backwards */
66    {   p[length] = (uint8_t)value;     /* Implicit masking to low byte */
67        value >>= 8;
68    }
69    return retVal;
70}
71
72size_t
73SSLDecodeSize(const uint8_t *p, size_t length)
74{
75    unsigned int val = 0;
76    check(length > 0 && length <= 4); //anything else would be an internal error.
77    while (length--)
78        val = (val << 8) | *p++;
79    return val;
80}
81
82uint8_t *
83SSLEncodeSize(uint8_t *p, size_t value, size_t length)
84{
85    unsigned char *retVal = p + length; /* Return pointer to char after int */
86    check(length > 0 && length <= 4);  //anything else would be an internal error.
87    while (length--)                    /* Assemble backwards */
88    {   p[length] = (uint8_t)value;     /* Implicit masking to low byte */
89        value >>= 8;
90    }
91    return retVal;
92}
93
94
95uint8_t *
96SSLEncodeUInt64(uint8_t *p, uint64_t value)
97{
98    p = SSLEncodeInt(p, (value>>32)&0xffffffff, 4);
99    return SSLEncodeInt(p, value&0xffffffff, 4);
100}
101
102
103void
104IncrementUInt64(sslUint64 *v)
105{
106    (*v)++;
107}
108
109void
110SSLDecodeUInt64(const uint8_t *p, size_t length, uint64_t *v)
111{
112    check(length > 0 && length <= 8);
113    if(length<=4) {
114        *v=SSLDecodeInt(p, length);
115    } else {
116        *v=((uint64_t)SSLDecodeInt(p, length-4))<<32 | SSLDecodeInt(p+length-4, 4);
117    }
118}
119
120
121#if	SSL_DEBUG
122
123const char *protocolVersStr(SSLProtocolVersion prot)
124{
125	switch(prot) {
126        case SSL_Version_Undetermined: return "SSL_Version_Undetermined";
127        case SSL_Version_2_0: return "SSL_Version_2_0";
128        case SSL_Version_3_0: return "SSL_Version_3_0";
129        case TLS_Version_1_0: return "TLS_Version_1_0";
130        case TLS_Version_1_1: return "TLS_Version_1_1";
131        case TLS_Version_1_2: return "TLS_Version_1_2";
132        default: sslErrorLog("protocolVersStr: bad prot\n"); return "BAD PROTOCOL";
133 	}
134 	return NULL;	/* NOT REACHED */
135}
136
137#endif	/* SSL_DEBUG */
138
139
140
141