1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24  */
25 
26 #ifndef WIN32
27 #include <ctype.h>
28 
29   #ifndef METAWARE
30     #include <wctype.h>
31   #endif
32 
33 #endif
34 
35 #ifndef METAWARE
36   #include <sys/timeb.h>
37 #endif
38 
39 #include "KMSAgentStringUtilities.h"
40 
41 #ifdef WIN32
42 #include <stdlib.h>
43 #include <time.h>
44 #define gmtime_r(clock,result) ( *(result) = *gmtime(clock), result )
45 #endif
46 
47 // Find header in KMSAgentStringUtilities.h
UTF8ToInt64(const char * i_sNumber)48 int64 UTF8ToInt64( const char* i_sNumber )
49 {
50     FATAL_ASSERT( i_sNumber );
51 
52 #ifdef WIN32
53     return _atoi64( i_sNumber );
54 #else
55     return atoll( i_sNumber );
56 #endif
57 }
58 
Int64ToUTF8(char * const o_psUTF8,int64 i_iNumber,int i_bPad,int i_bHex)59 void Int64ToUTF8(char* const o_psUTF8,
60                  int64 i_iNumber,
61                  int i_bPad,
62                  int i_bHex )
63 {
64     //string sFormat;
65     char sFormat[10];
66 
67     if ( i_bPad && i_bHex )
68     {
69 #ifdef WIN32
70         strcpy(sFormat,"%016I64X");
71 #else
72         strcpy(sFormat,"%016llX");
73 #endif
74     }
75     else if ( i_bPad && !i_bHex )
76     {
77 #ifdef WIN32
78         strcpy(sFormat, "%019I64d");
79 #else
80         strcpy(sFormat, "%019lld");
81 #endif
82     }
83     else if ( !i_bPad && i_bHex )
84     {
85 #ifdef WIN32
86         strcpy(sFormat, "%I64X");
87 #else
88         strcpy(sFormat, "%llX");
89 #endif
90     }
91     else //( !i_bPad && !i_bHex )
92     {
93 #ifdef WIN32
94         strcpy(sFormat, "%I64d");
95 #else
96         strcpy(sFormat, "%lld");
97 #endif
98     }
99 
100 #ifndef METAWARE
101     int iReturn = sprintf( o_psUTF8, sFormat, i_iNumber);
102 
103     //int iReturn = K_snprintf(o_psUTF8, iBufferSize, sFormat, i_iNumber);
104 #else
105     int iReturn = sprintf( o_psUTF8, sFormat, i_iNumber);
106 #endif
107     if ( iReturn < 0 )
108     {
109         // Our buffer wasn't big enough. Shouldn't happen.
110         FATAL_ASSERT(0);
111     }
112 
113     return;
114 
115 }
116 
117 // Find header in KMSAgentStringUtilities.h
ConvertUTF8HexStringToBinary(const char * i_sHexString,unsigned char * o_pBinaryBuffer)118 int ConvertUTF8HexStringToBinary(
119             const char* i_sHexString,
120             unsigned char* o_pBinaryBuffer)
121 {
122     int iHexLen = i_sHexString ? strlen(i_sHexString) : 0;
123     FATAL_ASSERT( (iHexLen % 2) == 0 ); // to be valid, the hex string must have an even number of characters
124 
125     if ( !o_pBinaryBuffer )
126     {
127        return ( iHexLen / 2 );
128     }
129 
130     if ( iHexLen <= 0 )
131     {
132         return 0;
133     }
134 
135     int iDigitValue = 0;
136 
137     for ( int i = 0; i < iHexLen; i++)
138     {
139         if (i_sHexString[i] >= '0' && i_sHexString[i] <= '9')
140         {
141             iDigitValue = i_sHexString[i] - '0';
142         }
143         else if (i_sHexString[i] >= 'A' && i_sHexString[i] <= 'F')
144         {
145             iDigitValue = i_sHexString[i] - 'A' + 10;
146         }
147         else if (i_sHexString[i] >= 'a' && i_sHexString[i] <= 'f')
148         {
149             iDigitValue = i_sHexString[i] - 'a' + 10;
150         }
151         else
152         {
153             iDigitValue = 0;
154         }
155 
156         if (i % 2 == 0)
157         {
158             o_pBinaryBuffer[i/2] = (char)(iDigitValue << 4);
159         }
160         else
161         {
162             o_pBinaryBuffer[i/2] |= (char)iDigitValue;
163         }
164     }
165 
166     return ( iHexLen / 2 );
167 }
168 
169 // Find header in KMSAgentStringUtilities.h
ConvertBinaryToUTF8HexString(char * const o_sHexString,const unsigned char * const i_pBinaryBuffer,int i_iBinaryBufferSize)170 void ConvertBinaryToUTF8HexString(
171                              char* const                o_sHexString,
172                              const unsigned char* const i_pBinaryBuffer,
173                              int                        i_iBinaryBufferSize )
174 {
175     const char HEXCHARS[] = "0123456789ABCDEF";
176 
177     FATAL_ASSERT( o_sHexString );
178 
179     if ( (i_pBinaryBuffer == 0) || (i_iBinaryBufferSize == 0) )
180     {
181         strcpy(o_sHexString, "");
182         return;
183     }
184 
185     FATAL_ASSERT( i_pBinaryBuffer );
186 
187     for ( int i = 0; i < (2 * i_iBinaryBufferSize); i++ )
188     {
189         unsigned char ucFourBits = i_pBinaryBuffer[i / 2];
190         if ( (i % 2) == 0 ) // high four bits of the current byte
191             ucFourBits = (ucFourBits >> 4) & 0xF; // shift down and blank out upper bits
192         else                // low four bits of the current byte
193             ucFourBits = ucFourBits & 0xF; // blank out upper bits
194 
195         o_sHexString[i] = HEXCHARS[ucFourBits];
196     }
197 
198     o_sHexString[i_iBinaryBufferSize * 2] = '\0';
199 
200     return;
201 }
202 
203 
204 // Find header in StringUtilities.h
GetCurrentDateTimeISO8601UTC(char * const o_psDateTimeISO8601UTC,int i_iLength)205 void GetCurrentDateTimeISO8601UTC(char* const o_psDateTimeISO8601UTC,
206                                   int i_iLength)
207 {
208 
209 #ifndef METAWARE
210     timeb stTime;
211     ftime(&stTime);
212 
213     FATAL_ASSERT( o_psDateTimeISO8601UTC );
214 
215     struct tm* pstTime = gmtime( &(stTime.time) );
216 
217     K_snprintf(
218         o_psDateTimeISO8601UTC,
219         i_iLength,
220         "%04d-%02d-%02d %02d:%02d:%02d.%03dZ",
221         pstTime->tm_year+1900,
222         pstTime->tm_mon+1,
223         pstTime->tm_mday,
224         pstTime->tm_hour,
225         pstTime->tm_min,
226         pstTime->tm_sec,
227         stTime.millitm);
228 
229 #else
230     // no time functions for the metaware environment
231     strcpy( o_psDateTimeISO8601UTC, "" );
232 #endif
233     return;
234 }
235 
236