From e9297cfa6b7b86ffdfa1d10609295771c9b00e18 Mon Sep 17 00:00:00 2001
From: rsanchez <rsanchez@curisit.net>
Date: Mon, 01 Dec 2014 15:00:01 +0000
Subject: [PATCH] #396 fix - Added automated license code generation

---
 src/main/java/net/curisit/securis/utils/LicUtils.java |  125 ++++++++++++++++++++++++++++-------------
 1 files changed, 86 insertions(+), 39 deletions(-)

diff --git a/src/main/java/net/curisit/securis/utils/LicUtils.java b/src/main/java/net/curisit/securis/utils/LicUtils.java
index 964cca8..234b14c 100644
--- a/src/main/java/net/curisit/securis/utils/LicUtils.java
+++ b/src/main/java/net/curisit/securis/utils/LicUtils.java
@@ -1,56 +1,103 @@
 package net.curisit.securis.utils;
 
 import java.math.BigInteger;
+import java.nio.charset.Charset;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
+import java.util.zip.CRC32;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
 public class LicUtils {
 
-	private static final Logger LOG = LogManager.getLogger(LicUtils.class);
+    private static final Logger LOG = LogManager.getLogger(LicUtils.class);
 
-	public static String md5(String str) {
-		try {
-			MessageDigest mDigest = MessageDigest.getInstance("MD5");
-			mDigest.update(str.getBytes(), 0, str.length());
-			BigInteger i = new BigInteger(1, mDigest.digest());
-			return String.format("%1$032x", i);
-		} catch (NoSuchAlgorithmException e) {
-			LOG.error("Error generating MD5 for string: " + str, e);
-		}
-		return null;
-	}
+    public static String md5(String str) {
+        try {
+            MessageDigest mDigest = MessageDigest.getInstance("MD5");
+            mDigest.update(str.getBytes(DEFAULT_CHARSET), 0, str.length());
+            BigInteger i = new BigInteger(1, mDigest.digest());
+            return String.format("%1$032x", i);
+        } catch (NoSuchAlgorithmException e) {
+            LOG.error("Error generating MD5 for string: " + str, e);
+        }
+        return null;
+    }
 
-	public static String sha256(String str) {
-		return sha256(str.getBytes());
-	}
+    public static String sha256(String str) {
+        return sha256(str.getBytes(DEFAULT_CHARSET));
+    }
 
-	public static String sha256(byte[] bytes) {
-		try {
-			MessageDigest mDigest = MessageDigest.getInstance("SHA-256");
-			mDigest.update(bytes, 0, bytes.length);
-			BigInteger i = new BigInteger(1, mDigest.digest());
-			return String.format("%1$064x", i);
-		} catch (NoSuchAlgorithmException e) {
-			LOG.error("Error generating SHA-256 for bytes: " + bytes, e);
-		}
-		return null;
-	}
+    public static String sha256(byte[] bytes) {
+        try {
+            MessageDigest mDigest = MessageDigest.getInstance("SHA-256");
+            mDigest.update(bytes, 0, bytes.length);
+            BigInteger i = new BigInteger(1, mDigest.digest());
+            return String.format("%1$064x", i);
+        } catch (NoSuchAlgorithmException e) {
+            LOG.error("Error generating SHA-256 for bytes: " + bytes, e);
+        }
+        return null;
+    }
 
-	public static String sha256(byte[]... bytes) {
-		try {
-			MessageDigest mDigest = MessageDigest.getInstance("SHA-256");
-			for (byte[] bs : bytes) {
-				mDigest.update(bs, 0, bs.length);
-			}
-			BigInteger i = new BigInteger(1, mDigest.digest());
-			return String.format("%1$064x", i);
-		} catch (NoSuchAlgorithmException e) {
-			LOG.error("Error generating SHA-256 for bytes: " + bytes, e);
-		}
-		return null;
-	}
+    public static String sha256(byte[]... bytes) {
+        try {
+            MessageDigest mDigest = MessageDigest.getInstance("SHA-256");
+            for (byte[] bs : bytes) {
+                mDigest.update(bs, 0, bs.length);
+            }
+            BigInteger i = new BigInteger(1, mDigest.digest());
+            return String.format("%1$064x", i);
+        } catch (NoSuchAlgorithmException e) {
+            LOG.error("Error generating SHA-256 for bytes: " + bytes, e);
+        }
+        return null;
+    }
 
+    private final static Charset DEFAULT_CHARSET = Charset.forName("utf-8");
+
+    public static String getLicenseCrc(String packCode, String licSufixCode) {
+        CRC32 crc = new CRC32();
+        crc.update(packCode.getBytes(DEFAULT_CHARSET));
+        crc.update(licSufixCode.getBytes(DEFAULT_CHARSET));
+        return String.format("%03d", crc.getValue() % 1000);
+    }
+
+    public static String getLicenseCrc(String packCode, Integer licSufixCode) {
+        return getLicenseCrc(packCode, licSufixCode.toString());
+    }
+
+    public static Integer getLicenseCodeSuffix(String licCode) {
+        String[] parts = licCode.split("-");
+
+        return new Integer(parts[2]);
+    }
+
+    public static String getLicenseCode(String packCode, Integer licSufixCode) {
+        String crc = getLicenseCrc(packCode, licSufixCode);
+        return String.format("%s-%s-%s", packCode, crc, licSufixCode);
+    }
+
+    /**
+     * Check if the license code is valid according to the format, the CRC is
+     * validated
+     * 
+     * @param licCode
+     * @return true if license code format and its CRC are valid
+     */
+    public static boolean checkValidLicenseCodeCrc(String licCode) {
+        String[] parts = licCode.split("-");
+        if (parts.length != 3) {
+            return false;
+        }
+        String crc = getLicenseCrc(parts[0], parts[2]);
+        return crc.equals(parts[1]);
+    }
+
+    public static void main(String[] args) {
+        String code = getLicenseCode("PCK01", 5);
+        System.out.println(code);
+        System.out.println("Is valid ? " + checkValidLicenseCodeCrc("PCK01-512-"));
+    }
 }

--
Gitblit v1.3.2