Merge "Fix JDK8 compatibility"
[aaa.git] / aaa-authn-api / src / main / java / org / opendaylight / aaa / api / SHA256Calculator.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.aaa.api;
9
10 import java.security.MessageDigest;
11 import java.util.concurrent.locks.ReentrantReadWriteLock;
12 import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
13
14 /*
15  * @Author - Sharon Aicler (saichler@cisco.com)
16  */
17 public class SHA256Calculator {
18
19     private static MessageDigest md = null;
20     private static ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
21     private static WriteLock writeLock = lock.writeLock();
22
23     public static String generateSALT() {
24         StringBuffer salt = new StringBuffer();
25         for (int i = 0; i < 12; i++) {
26             int random = (int) (Math.random() * 24 + 1);
27             salt.append((char) (65 + random));
28         }
29         return salt.toString();
30     }
31
32     public static String getSHA256(byte data[], String salt) {
33         byte SALT[] = salt.getBytes();
34         byte temp[] = new byte[data.length + SALT.length];
35         System.arraycopy(data, 0, temp, 0, data.length);
36         System.arraycopy(SALT, 0, temp, data.length, SALT.length);
37
38         if (md == null) {
39             try {
40                 writeLock.lock();
41                 if (md == null) {
42                     try {
43                         md = MessageDigest.getInstance("SHA-256");
44                     } catch (Exception err) {
45                         err.printStackTrace();
46                     }
47                 }
48             } finally {
49                 writeLock.unlock();
50             }
51         }
52
53         byte by[] = null;
54
55         try {
56             writeLock.lock();
57             md.update(temp);
58             by = md.digest();
59         } finally {
60             writeLock.unlock();
61         }
62         return removeSpecialCharacters(new String(by));
63     }
64
65     public static String getSHA256(String password, String salt) {
66         return getSHA256(password.getBytes(), salt);
67     }
68
69     public static String removeSpecialCharacters(String str) {
70         StringBuilder buff = new StringBuilder();
71         for (int i = 0; i < str.length(); i++) {
72             if (str.charAt(i) != '\'' && str.charAt(i)!=0) {
73                 buff.append(str.charAt(i));
74             }
75         }
76         return buff.toString();
77     }
78 }