protected final CodSigningInfo signers(final InputStream inputStream,
            final String fileName) {
        // Pre-condition: - inputStream is not null - inputStream is at the
        //                  beginning of the file
        // Post-condition: - inputStream is at the end of the file, but still
        //                   open

        DataInputStream inputFile;
        StringBuffer currentSigner = new StringBuffer(LENGTH_OF_SIGNER_ID);
        CodSigningInfo returnValue = new CodSigningInfo(fileName);

        inputFile = new DataInputStream(inputStream);
        try {
            int dataSize; // stores the sum of data size and code size
            int signLength; // stores the length of the signature

            checkValidity(inputFile, fileName); // Find out if the flashid is
            // correct and verify the ends

            if (getVersion(inputFile) <= MIN_VERSION) {
                logError("File version not above " + MIN_VERSION + ".");
                return null;
            }

            // code size:
            dataSize = readLittleEndianNibble(inputFile);
            // + data size:
            dataSize += readLittleEndianNibble(inputFile);
            // Skip two bytes for the COD flags.
            inputFile.skip(2 + dataSize);

            while (true) { // read until exception
                currentSigner.delete(0, currentSigner.length());
                int temp = readLittleEndianNibble(inputFile);
                if (temp != 1) {
                    logError("Sign_type is not 1.  Sign_type = " + temp);
                    return null;
                }
                signLength = readLittleEndianNibble(inputFile);
                char c;
                for (short i = 0; i < LENGTH_OF_SIGNER_ID; i++) {
                    // read 4 char signer
                    c = (char) inputFile.readByte();
                    if (c != 0) {
                        currentSigner.append(c);
                    }
                }
                // -4 because 4 characters of signer have already been read
                inputFile.skip(signLength - LENGTH_OF_SIGNER_ID);
                returnValue.addSigner(currentSigner.toString());
            }

        } catch (EOFException e) { // EOF- return list of signers
            /* this is expected; we reached the end of the file. */
        } catch (IOException e) {
            log(e, Project.MSG_WARN);
            logError("Failed to read file.");
            return new CodSigningInfo(fileName);
        } catch (BadCodException e) {
            log(e, Project.MSG_WARN);
            logError("Bad COD file.");
            return new CodSigningInfo(fileName);
        }

        return returnValue;
    }