9d8719a82d1cbdba9b69799c0b329b161a4d1851
[aaf/cadi.git] / core / src / main / java / org / onap / aaf / cadi / Hash.java
1 /*******************************************************************************\r
2  * ============LICENSE_START====================================================\r
3  * * org.onap.aaf\r
4  * * ===========================================================================\r
5  * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.\r
6  * * ===========================================================================\r
7  * * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * * you may not use this file except in compliance with the License.\r
9  * * You may obtain a copy of the License at\r
10  * * \r
11  *  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  * * \r
13  *  * Unless required by applicable law or agreed to in writing, software\r
14  * * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * * See the License for the specific language governing permissions and\r
17  * * limitations under the License.\r
18  * * ============LICENSE_END====================================================\r
19  * *\r
20  * * ECOMP is a trademark and service mark of AT&T Intellectual Property.\r
21  * *\r
22  ******************************************************************************/\r
23 package org.onap.aaf.cadi;\r
24 \r
25 import java.nio.ByteBuffer;\r
26 import java.security.MessageDigest;\r
27 import java.security.NoSuchAlgorithmException;\r
28 \r
29 public class Hash {\r
30         private static char hexDigit[] = "0123456789abcdef".toCharArray();\r
31         \r
32 /////////////////////////////////\r
33 // MD5\r
34 /////////////////////////////////\r
35         /**\r
36          * Encrypt MD5 from Byte Array to Byte Array\r
37          * @param input\r
38          * @return\r
39          * @throws NoSuchAlgorithmException\r
40          */\r
41         public static byte[] encryptMD5 (byte[] input) throws NoSuchAlgorithmException {\r
42                 MessageDigest md = MessageDigest.getInstance("MD5");\r
43                 md.update(input); \r
44                 return md.digest();\r
45         }\r
46 \r
47         /**\r
48          * Encrypt MD5 from Byte Array to Byte Array\r
49          * @param input\r
50          * @return\r
51          * @throws NoSuchAlgorithmException\r
52          */\r
53         public static byte[] encryptMD5 (byte[] input, int offset, int length) throws NoSuchAlgorithmException {\r
54                 MessageDigest md = MessageDigest.getInstance("MD5");\r
55                 md.update(input,offset,length); \r
56                 return md.digest();\r
57         }\r
58 \r
59 \r
60 \r
61         /**\r
62          * Convenience Function: Encrypt MD5 from String to String Hex representation \r
63          * \r
64          * @param input\r
65          * @return\r
66          * @throws NoSuchAlgorithmException\r
67          */\r
68         public static String encryptMD5asStringHex(String input) throws NoSuchAlgorithmException {\r
69                 byte[] output = encryptMD5(input.getBytes());\r
70                 StringBuilder sb = new StringBuilder("0x");\r
71                  for (byte b : output) {\r
72                     sb.append(hexDigit[(b >> 4) & 0x0f]);\r
73                     sb.append(hexDigit[b & 0x0f]);\r
74                  }\r
75                  return sb.toString();\r
76         }\r
77 \r
78 /////////////////////////////////\r
79 // SHA256\r
80 /////////////////////////////////\r
81         /**\r
82          * SHA256 Hashing\r
83          */\r
84         public static byte[] hashSHA256(byte[] input) throws NoSuchAlgorithmException {\r
85                 MessageDigest md = MessageDigest.getInstance("SHA-256");\r
86                 md.update(input); \r
87                 return md.digest();\r
88         }\r
89 \r
90         /**\r
91          * SHA256 Hashing\r
92          */\r
93         public static byte[] hashSHA256(byte[] input, int offset, int length) throws NoSuchAlgorithmException {\r
94                 MessageDigest md = MessageDigest.getInstance("SHA-256");\r
95                 md.update(input,offset,length); \r
96                 return md.digest();\r
97         }\r
98         \r
99         /**\r
100          * Convenience Function: Hash from String to String Hex representation\r
101          * \r
102          * @param input\r
103          * @return\r
104          * @throws NoSuchAlgorithmException\r
105          */\r
106         public static String hashSHA256asStringHex(String input) throws NoSuchAlgorithmException {\r
107                 byte[] output = hashSHA256(input.getBytes());\r
108                 StringBuilder sb = new StringBuilder("0x");\r
109                  for (byte b : output) {\r
110                     sb.append(hexDigit[(b >> 4) & 0x0f]);\r
111                     sb.append(hexDigit[b & 0x0f]);\r
112                  }\r
113                  return sb.toString();\r
114         }\r
115 \r
116         /**\r
117          * Convenience Function: Hash from String to String Hex representation\r
118          * \r
119          * @param input\r
120          * @return\r
121          * @throws NoSuchAlgorithmException\r
122          */\r
123         public static String hashSHA256asStringHex(String input, int salt) throws NoSuchAlgorithmException {\r
124                 byte[] in = input.getBytes();\r
125                 ByteBuffer bb = ByteBuffer.allocate(Integer.SIZE + in.length);\r
126                 bb.putInt(salt);\r
127                 bb.put(input.getBytes());\r
128                 byte[] output = Hash.hashSHA256(bb.array());\r
129                 StringBuilder sb = new StringBuilder("0x");\r
130                  for (byte b : output) {\r
131                     sb.append(hexDigit[(b >> 4) & 0x0f]);\r
132                     sb.append(hexDigit[b & 0x0f]);\r
133                  }\r
134                  return sb.toString();\r
135         }\r
136         \r
137         /**\r
138          * Compare two byte arrays for equivalency\r
139          * @param ba1\r
140          * @param ba2\r
141          * @return\r
142          */\r
143         public static boolean isEqual(byte ba1[], byte ba2[]) {\r
144                 if(ba1.length!=ba2.length)return false;\r
145                 for(int i = 0;i<ba1.length; ++i) {\r
146                         if(ba1[i]!=ba2[i])return false;\r
147                 }\r
148                 return true;\r
149         }\r
150 \r
151         public static int compareTo(byte[] a, byte[] b) {\r
152                 int end = Math.min(a.length, b.length);\r
153                 int compare = 0;\r
154                 for(int i=0;compare == 0 && i<end;++i) {\r
155                         compare = a[i]-b[i];\r
156                 }\r
157                 if(compare==0)compare=a.length-b.length;\r
158                 return compare;\r
159         }\r
160         \r
161         public static String toHex(byte[] ba) {\r
162                 StringBuilder sb = new StringBuilder("0x");\r
163                  for (byte b : ba) {\r
164                     sb.append(hexDigit[(b >> 4) & 0x0f]);\r
165                     sb.append(hexDigit[b & 0x0f]);\r
166                  }\r
167                  return sb.toString();\r
168         }\r
169         \r
170         public static byte[] fromHex(String s)  throws CadiException{\r
171                 if(!s.startsWith("0x")) {\r
172                         throw new CadiException("HexString must start with \"0x\"");\r
173                 }\r
174                 boolean high = true;\r
175                 int c;\r
176                 byte b;\r
177                 byte[] ba = new byte[(s.length()-2)/2];\r
178                 int idx;\r
179                 for(int i=2;i<s.length();++i) {\r
180                         c = s.charAt(i);\r
181                         if(c>=0x30 && c<=0x39) {\r
182                                 b=(byte)(c-0x30);\r
183                         } else if(c>=0x61 && c<=0x66) {\r
184                                 b=(byte)(c-0x57);  // account for "A"\r
185                         } else if(c>=0x41 && c<=0x46) {\r
186                                 b=(byte)(c-0x37);\r
187                         } else {\r
188                                 throw new CadiException("Invalid char '" + c + "' in HexString");\r
189                         }\r
190                         idx = (i-2)/2;\r
191                         if(high) {\r
192                                 ba[idx]=(byte)(b<<4);\r
193                                 high = false;\r
194                         } else {\r
195                                 ba[idx]|=b;\r
196                                 high = true;\r
197                         }\r
198                 }\r
199                 return ba;\r
200         }\r
201 \r
202 }\r