001: /*
002: *
003: *
004: * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026: package com.sun.satsa.util.pkcs15;
027:
028: import com.sun.satsa.util.*;
029: import java.util.Vector;
030: import java.io.IOException;
031:
032: /**
033: * This class represents PKCS15 file abstraction
034: */
035: public class PKCS15File {
036: /** ODF path. */
037: protected static final short ODFPath = 0x5031;
038: /** EF(TokenInfo) path. */
039: protected static final short TokenInfoPath = 0x5032;
040: /** EF(UnusedSpace) path. */
041: protected static final short UnusedSpace = 0x5033;
042:
043: /** This vector contains objects loaded from directory file. */
044: protected Vector loaderObjects;
045: /** This vector contains locations of loaded objects. */
046: protected Vector loaderLocations;
047: /**
048: * This vector contains locations of free space in directory
049: * files. */
050: protected Vector loaderFreeBlocks;
051: /** Location */
052: protected Location location;
053: /** File system object. */
054: protected FileSystemAbstract files;
055:
056: /**
057: * Create the object for the pointed file system and location
058: * @param location Location required location
059: * @param files FileSystemAbstract required file system
060: */
061: protected PKCS15File(Location location, FileSystemAbstract files) {
062: this .location = location;
063: this .files = files;
064: }
065:
066: /**
067: * Create the object for the pointed file system
068: * @param files FileSystemAbstract required file system
069: */
070: protected PKCS15File(FileSystemAbstract files) {
071: this .files = files;
072: }
073:
074: /**
075: * Initialises object loader.
076: * @param objects vector for loaded objects or null
077: * @param locations vector for object locations or null
078: * @param freeBlocks vector for unused block locations or null
079: */
080: protected void resetLoader(Vector objects, Vector locations,
081: Vector freeBlocks) {
082: loaderObjects = objects;
083: loaderLocations = locations;
084: loaderFreeBlocks = freeBlocks;
085: }
086:
087: /**
088: * Parses directory file. Places results into vectors specified
089: * <code>resetLoader</code> method.
090: * @param path path to directory file
091: * @throws TLVException if parsing error occurs
092: * @throws IOException if I/O error occurs
093: */
094: protected void parseDF(short[] path) throws TLVException,
095: IOException {
096: if (path.length > 1) {
097: files.select(path);
098: } else {
099: files.select(path[0]);
100: }
101: doParseDF(files.readFile(), path, loaderObjects,
102: loaderLocations, loaderFreeBlocks);
103: }
104:
105: /**
106: * Parses EF(DF).
107: * @param data data to be parsed
108: * @param path file path
109: * @param objects method places objects from file into this vector.
110: * Can be null. Contains values of TLV type
111: * @param locations method places location of objects into this
112: * vector. Can be null. Contains values of type Location.
113: * @param freeBlocks method places locations of free memory in
114: * EF(DF) into this vector. Can be null. Contains values of
115: * type Location.
116: * @throws TLVException if parsing error occurs
117: */
118: protected static void doParseDF(byte[] data, short[] path,
119: Vector objects, Vector locations, Vector freeBlocks)
120: throws TLVException {
121: int start = 0;
122: int current = 0;
123: while (current < data.length) {
124: // free space - skip
125: if (data[current] == (byte) 0xff) {
126: current++;
127: continue;
128: }
129: // TLV object
130: TLV t = new TLV(data, current);
131: // empty one - skip
132: if (t.type == 0) {
133: current = t.valueOffset + t.length;
134: continue;
135: }
136: // real object
137: if (objects != null) {
138: objects.addElement(t);
139: }
140: if (locations != null) {
141: locations.addElement(new Location(path, current,
142: t.valueOffset + t.length - current));
143: }
144: if (freeBlocks != null && start < current) {
145: freeBlocks.addElement(new Location(path, start, current
146: - start));
147: }
148: current = t.valueOffset + t.length;
149: start = current;
150: }
151: if (start < current && freeBlocks != null) {
152: freeBlocks.addElement(new Location(path, start, current
153: - start));
154: }
155: }
156:
157: }
|