FileDocCategorySizeDatePackage
PINAttributes.javaAPI DocphoneME MR2 API (J2ME)9212Wed May 02 18:00:38 BST 2007com.sun.satsa.acl

PINAttributes

public class PINAttributes extends Object
This class represents PKCS#15 PIN attributes.

Fields Summary
private static final int
TYPE_BCD
BCD PIN type constant.
private static final int
TYPE_ASCII
ASCII PIN type constant.
private static final int
TYPE_UTF
UTF PIN type constant.
private static final int
TYPE_HN
HN PIN type constant.
private static final int
TYPE_ISO
ISO PIN type constant.
public static final int
FLAG_CASE_SENSITIVE
CASE_SENSITIVE PIN flag constant.
public static final int
FLAG_LOCAL
LOCAL PIN flag constant.
public static final int
FLAG_CHANGE_DISABLED
CHANGE_DISABLED PIN flag constant.
public static final int
FLAG_UNBLOCK_DISABLED
UNBLOCK_DISABLED PIN flag constant.
public static final int
FLAG_INITIALIZED
INITIALIZED PIN flag constant.
public static final int
FLAG_NEEDS_PADDING
NEEDS_PADDING PIN flag constant.
public static final int
FLAG_UNBLOCKING_PIN
UNBLOCKING_PIN PIN flag constant.
public static final int
FLAG_SOPIN
SOPIN PIN flag constant.
public static final int
FLAG_DISABLE_ALLOWED
DISABLE_ALLOWED PIN flag constant.
public static final int
FLAG_INTEGRITY_PROTECTED
INTEGRITY_PROTECTED PIN flag constant.
public static final int
FLAG_CONFIDENTIALITY_PROTECTED
CONFIDENTIALITY_PROTECTED PIN flag constant.
public static final int
FLAG_EXCHANGEREFDATA
EXCHANGEREFDATA PIN flag constant.
public String
label
PIN label.
public int
id
PIN identifier.
public int
pinType
pinType PIN attribute.
public int
minLength
minLength PIN attribute.
public int
storedLength
storedLength PIN attribute.
public int
maxLength
maxLength PIN attribute.
public int
pinReference
pinReference PIN attribute.
public int
padChar
padChar PIN attribute.
public int
pinFlags
pinFlags PIN attribute.
public short[]
path
Path PIN attribute.
private Vector
PIN
This vector contains parsed objects from PIN file.
private TLV
root
This TLV contains root TLV
Constructors Summary
public PINAttributes()
Constructs PINAttributes.


           
      
public PINAttributes(TLV root)
Constructs PINAttributes object from the pointed TLV.

param
root TLV
throws
TLVException if TLV error occurs

        if (root.type != TLV.SEQUENCE_TYPE) {      // not a PIN object
            throw new TLVException("Bad PIN record");
        }
        this.root = root;
        readPINs();
    
Methods Summary
public booleancheck(int action)
Verifies if the specified operation can be performed on this PIN.

param
action operation identifier.
return
true if the specified operation can be performed on this PIN.


        if (action == ACLPermissions.CMD_CHANGE) {
            return (pinFlags & FLAG_CHANGE_DISABLED) == 0;
        }

        if (action == ACLPermissions.CMD_DISABLE) {
            return (pinFlags & FLAG_DISABLE_ALLOWED) != 0;
        }

        if (action == ACLPermissions.CMD_UNBLOCK) {
            return (pinFlags & FLAG_UNBLOCK_DISABLED) == 0;
        }

        return true;
    
public intgetMaxLength()
Returns maximum PIN length in characters.

return
maximum PIN length in characters.


        if ((pinFlags & FLAG_NEEDS_PADDING) == 0) {
            return maxLength;
        }

        if (pinType == TYPE_BCD) {
            return storedLength * 2;
        }

        // UTF symbol may occupy 1 or 2 bytes, additional check is necessary

        return storedLength;
    
public booleanisNumeric()
Returns true if this PIN is a number.

return
true if this PIN is a number.

        return (pinType != TYPE_UTF);
    
public booleanisUnblockingPIN()
Verifies if this PIN can be used to unblock other PINs.

return
true if this PIN can be used to unblock other PINs.

        return (pinFlags & FLAG_UNBLOCKING_PIN) != 0;
    
private voidreadPINs()
Read PIN information.

throws
TLVException if parsing error occurs


        TLV t = root.child;        // commonObjectAttributes
        label = t.child.getUTF8().trim();
        t = t.next;         // CommonAuthenticationObjectAttributes
        id = t.child.getId();

        t = t.next;
        if (t.type != ACEntry.CONTEXT_CONSTRUCTED_1) {
            throw new TLVException("Incomplete PIN record");
        }
        t = t.child.child;   // PinAttributes.pinFlags
        byte[] buf = t.getValue();
        int mask = 0;
        for (int i = 0; i < buf[0]; i++) {
            mask = mask | (1 << i);
        }
        mask = ~mask;
        pinFlags = Utils.getShort(buf, 1) & mask;

        t = t.next;
        pinType = t.getEnumerated();

        t = t.next;
        minLength = t.getInteger();

        t = t.next;
        storedLength = t.getInteger();

        t = t.next;
        if (t.type == TLV.INTEGER_TYPE) {
            maxLength = t.getInteger();
            t = t.next;
        } else {
            maxLength = storedLength;
        }

        // this entry is optional, default value is 0
        if (t.type == 0x80) {
            pinReference = t.getInteger();
            t = t.next;
        }

        padChar = t.getId();
    
public byte[]transform(java.lang.String s)
Transforms string entered by user according to PIN attributes.

param
s the value enterd by user.
return
converted and padded PIN value.


        if (s.length() < minLength) {
            return null;
        }

        byte[] data = null;

        if (pinType == TYPE_UTF) {

            if ((pinFlags & FLAG_CASE_SENSITIVE) == 0) {
                s = s.toUpperCase();  // locale?
            }

            data = Utils.stringToBytes(s);

            if (data.length > getMaxLength()) {
                return null;
            }

        } else {

            byte[] tmp = new byte[s.length()];
            for (int i = 0; i < tmp.length; i++) {
                tmp[i] = (byte) (s.charAt(i));
            }

            if (pinType == TYPE_ASCII || pinType == TYPE_ISO) {
                data = tmp;
            } else {
                if (pinType == TYPE_HN) {
                    data = tmp;
                    for (int i = 0; i < data.length; i++) {
                        data[i] = (byte) (0xf0 | (data[i] - 0x30));
                    }
                } else {   // type == TYPE_BCD

                    data = new byte[(tmp.length + 1) / 2];

                    for (int i = 0; i < data.length; i++) {

                        int l = i * 2;
                        int b1 = tmp[l] - 0x30;
                        int b2;
                        if (l + 1 == tmp.length) {
                            b2 = padChar;
                        } else {
                            b2 = tmp[l + 1] - 0x30;
                        }
                        data[i] = (byte) ((b1 << 4) | (b2 & 0xf));
                    }

                }
            }
        }

        if (((pinFlags & FLAG_NEEDS_PADDING) == 0) ||
             (data.length == storedLength)) {
            return data;
        }

        byte[] r = new byte[storedLength];
        System.arraycopy(data, 0, r, 0, data.length);
        for (int i = data.length; i < storedLength; i++) {
            r[i] = (byte) padChar;
        }

        return r;