Handy code for dealing with keys.
git-svn-id: https://samskivert.googlecode.com/svn/trunk@1609 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
@@ -0,0 +1,104 @@
|
|||||||
|
//
|
||||||
|
// samskivert library - useful routines for java programs
|
||||||
|
// Copyright (C) 2001-2004 Michael Bayne
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or modify it
|
||||||
|
// under the terms of the GNU Lesser General Public License as published
|
||||||
|
// by the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
package com.samskivert.util;
|
||||||
|
|
||||||
|
import java.lang.StringBuffer;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handy functions for dealing with license key creation and general key
|
||||||
|
* issues.
|
||||||
|
*/
|
||||||
|
public class KeyUtil
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Convenient function to make a random key of the specified total
|
||||||
|
* length, containing length - 1 random digits, that is verifiable
|
||||||
|
* using {@link verifyLuhn}.
|
||||||
|
*/
|
||||||
|
public static String makeVerifiableKey (Random rand, int length)
|
||||||
|
{
|
||||||
|
return makeLuhnVerifiable(generateRandomKey(rand, length - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a key of the given length that contains random numbers.
|
||||||
|
*/
|
||||||
|
public static String generateRandomKey (Random rand, int length)
|
||||||
|
{
|
||||||
|
int numKeyChars = KEY_CHARS.length();
|
||||||
|
StringBuffer buf = new StringBuffer();
|
||||||
|
for (int ii = 0; ii < length; ii++) {
|
||||||
|
buf.append(KEY_CHARS.charAt(rand.nextInt(numKeyChars)));
|
||||||
|
}
|
||||||
|
return buf.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify the key with the Luhn check. If the key is all zeros,
|
||||||
|
* then the luhn check is true, but that is almost never what you want
|
||||||
|
* so explicitly check for zero and return false if it is.
|
||||||
|
*/
|
||||||
|
public static boolean verifyLuhn (String key)
|
||||||
|
{
|
||||||
|
// If there is a non digit, or it is all zeros.
|
||||||
|
if (key.matches("\\D") || key.matches("^[0]+$")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (getLuhnRemainder(key) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Takes a random string of digits and adds the appropriate check
|
||||||
|
* digit in order to make the whole string verifyable using {@link
|
||||||
|
* verifyLuhn}.
|
||||||
|
*/
|
||||||
|
public static String makeLuhnVerifiable (String key)
|
||||||
|
{
|
||||||
|
String prekey = key + '0';
|
||||||
|
int rem = getLuhnRemainder(prekey);
|
||||||
|
|
||||||
|
return (rem == 0 ? prekey : key + (10 - rem));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the luhn remainder for the given key.
|
||||||
|
*
|
||||||
|
* {@see http://www.beachnet.com/~hstiles/cardtype.html }
|
||||||
|
* {@see http://www.google.com/search?q=luhn%20credit%20card }
|
||||||
|
*/
|
||||||
|
public static int getLuhnRemainder (String key)
|
||||||
|
{
|
||||||
|
int len = key.length();
|
||||||
|
int sum = 0;
|
||||||
|
for (int multSeq = len % 2, ii=0; ii < len; ii++) {
|
||||||
|
int c = key.charAt(ii) - '0';
|
||||||
|
if (ii % 2 == multSeq) {
|
||||||
|
c *= 2;
|
||||||
|
}
|
||||||
|
sum += (c / 10) + (c % 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
return sum % 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Characters used in creating key strings. */
|
||||||
|
protected static String KEY_CHARS = "0123456789";
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user