aboutsummaryrefslogtreecommitdiffstats
path: root/deployment/heat/onap-rke/scripts/Crypto.java
blob: a9bad509ac2010884697f4ea21c3f9617864573b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import javax.crypto.Cipher;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.GeneralSecurityException;
import java.security.SecureRandom;
import java.util.Arrays;

public class Crypto {

    private static final String AES = "AES";
    private static final int GCM_TAG_LENGTH = 16;
    private static final int GCM_IV_LENGTH = 12;
    private static final String AES_GCM_NO_PADDING = "AES/GCM/NoPadding";

    public static void main(String[] args) {
    	if(args.length != 2) {
    		System.out.println("Usage: java Crypto value_to_encrypt key");
    		System.out.println("exit(1)");
    		System.exit(1);
    	}

    	String value = args[0];
    	String key = args[1];
    	String encrypted = encryptCloudConfigPassword(value, key);
    	System.out.println(encrypted);
    }

    /**
     * encrypt a value and generate a keyfile
     * if the keyfile is not found then a new one is created
     * 
     * @throws GeneralSecurityException
     */
    public static String encrypt (String value, String keyString) throws GeneralSecurityException {
        SecretKeySpec sks = getSecretKeySpec (keyString);
        Cipher cipher = Cipher.getInstance(AES_GCM_NO_PADDING);
        byte[] initVector = new byte[GCM_IV_LENGTH];
        (new SecureRandom()).nextBytes(initVector);
        GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH * java.lang.Byte.SIZE, initVector);
        cipher.init(Cipher.ENCRYPT_MODE, sks, spec);
        byte[] encoded = value.getBytes(java.nio.charset.StandardCharsets.UTF_8);
        byte[] cipherText = new byte[initVector.length + cipher.getOutputSize(encoded.length)];
        System.arraycopy(initVector, 0, cipherText, 0, initVector.length);
        cipher.doFinal(encoded, 0, encoded.length, cipherText, initVector.length);
        return byteArrayToHexString(cipherText);
    }

    public static String encryptCloudConfigPassword(String message, String key) {
    	try {
	    	return Crypto.encrypt(message, key);
	    } catch (GeneralSecurityException e) {
          return null;
      }
    }

    private static SecretKeySpec getSecretKeySpec (String keyString) {
        byte[] key = hexStringToByteArray (keyString);
        return new SecretKeySpec (key, AES);
    }

    public static String byteArrayToHexString (byte[] b) {
        StringBuilder sb = new StringBuilder(b.length * 2);
        for (byte aB : b) {
            int v = aB & 0xff;
            if (v < 16) {
                sb.append('0');
            }
            sb.append(Integer.toHexString(v));
        }
        return sb.toString ().toUpperCase ();
    }

    private static byte[] hexStringToByteArray (String s) {
        byte[] b = new byte[s.length () / 2];
        for (int i = 0; i < b.length; i++) {
            int index = i * 2;
            int v = Integer.parseInt (s.substring (index, index + 2), 16);
            b[i] = (byte) v;
        }
        return b;
    }
}