/* * Copyright 2008 Federal Chancellery Austria and * Graz University of Technology * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package at.gv.egiz.smcc; import java.util.Locale; import java.util.MissingResourceException; import java.util.ResourceBundle; /** * * @author mcentner */ public class PINSpec { /** * The minimum PIN length. */ protected int minLength = 0; /** * The maximum PIN length or -1 if not specified. */ protected int maxLength = -1; /** * The recommended PIN length or -1 if not specified. */ protected int recLength = -1; /** * The regular expression pattern of a single PIN digit or character. */ protected String rexepPattern; /** * The name of the corresponding resource bundle. */ protected String resourceBundleName; /** * The key of the PIN name in the resource bundle. */ protected String nameKey; /** * The name of the PIN. */ protected String name; /** * The key id to be used in VERIFY or CHANGE REFERENCE DATA APDUs. */ protected byte kid; /** * The context AID of the key id. */ protected byte[] context_aid; /** * Creates a new instance of this PINSpec with the given lengths, regular * expression pattern, the ResourceBundle name and key to lookup the PIN name * and the KID and AID. * * @param minLenght the minimum length of the PIN * @param maxLength the maximum length of the PIN, or -1 if there is no maximum length * @param rexepPattern the regular expression pattern of a single PIN digit or character * @param resourceBundleName the name of a ResourceBundle for this PIN * @param resourceKey the key to look up the (localized) name of this PIN * @param kid the key id of the PIN * @param contextAID the AID the KID is valid in */ public PINSpec(int minLenght, int maxLength, String rexepPattern, String resourceBundleName, String resourceKey, byte kid, byte[] contextAID) { this.minLength = minLenght; this.maxLength = maxLength; this.rexepPattern = rexepPattern; this.resourceBundleName = resourceBundleName; this.nameKey = resourceKey + ".name"; this.kid = kid; this.context_aid = contextAID; } /** * Creates a new instance of this PINSpec with the given lengths, regular * expression pattern, the name of the PIN and the KID and AID. * * @param minLenght the minimum length of the PIN * @param maxLength the maximum length of the PIN, or -1 if there is no maximum length * @param rexepPattern the regular expression pattern of a single PIN digit or character * @param name the name of the PIN * @param kid the key id of the PIN * @param contextAID the AID the KID is valid in */ public PINSpec(int minLenght, int maxLength, String rexepPattern, String name, byte kid, byte[] contextAID) { this.minLength = minLenght; this.maxLength = maxLength; this.rexepPattern = rexepPattern; this.name = name; this.kid = kid; this.context_aid = contextAID; } /** * This method sets the recommended PIN length. * * @param recLength the recommended PIN length */ public void setRecLength(int recLength) { this.recLength = recLength; } /** * @return the localized (using the default locale) name of the PIN, or the * name set by * {@link #PINSpec(int, int, String, String, byte, byte[])}. */ public String getLocalizedName() { if (name != null) { return name; } else if (resourceBundleName != null){ try { return ResourceBundle.getBundle(resourceBundleName).getString(nameKey); } catch (MissingResourceException e) { } } return nameKey; } /** * @param locale the locale for which the name should be returned * @return the localized name of the PIN, or the name set by * {@link #PINSpec(int, int, String, String, byte, byte[])} */ public String getLocalizedName(Locale locale) { if (name != null) { return name; } else if (resourceBundleName != null) { try { return ResourceBundle.getBundle(resourceBundleName, locale).getString(nameKey); } catch (MissingResourceException e) { } } return nameKey; } /** * @return the recommended PIN length if specified and * recommended is true, or * minLength-maxLength */ public String getLocalizedLength() { if (recLength > 0) { return "" + recLength; } else if (maxLength == minLength) { return "" + minLength; } else if (maxLength > minLength) { return minLength + "-" + maxLength; } else { return minLength + "+"; } } /** * @return the minimum length of the PIN */ public int getMinLength() { return minLength; } /** * @return the maximum length of the PIN, or -1 if not specified. */ public int getMaxLength() { return maxLength; } /** * @return the minimum length of the PIN */ public int getRecMinLength() { return (recLength >= minLength) ? recLength : minLength; } /** * @return the maximum length of the PIN */ public int getRecMaxLength() { return (recLength >= minLength) ? recLength : maxLength; } /** * @return the recommended length of the PIN, or -1 if not specified */ public int getRecLength() { return recLength; } /** * @return the regular expression pattern of one single digit or character */ public String getRexepPattern() { return rexepPattern; } /** * @return the key id of the PIN */ public byte getKID() { return kid; } /** * @return the AID the KID is valid in, or null if KID is global */ public byte[] getContextAID() { return context_aid; } }