/* SignerInfo.java -- a SignerInfo object, from PKCS #7
   Copyright (C) 2004, 2005  Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath 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
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */

package gnu.java.security.pkcs;

import gnu.java.security.OID;
import gnu.java.security.ber.BER;
import gnu.java.security.ber.BEREncodingException;
import gnu.java.security.ber.BERReader;
import gnu.java.security.ber.BERValue;
import gnu.java.security.der.DERValue;

import java.io.IOException;

import java.math.BigInteger;

import javax.security.auth.x500.X500Principal;

public class SignerInfo
{
  private final BigInteger version;
  private final BigInteger serialNumber;
  private final X500Principal issuer;
  private final OID digestAlgorithmId;
  private final byte[] digestAlgorithmParams;
  private final byte[] authenticatedAttributes;
  private final OID digestEncryptionAlgorithmId;
  private final byte[] digestEncryptionAlgorithmParams;
  private final byte[] encryptedDigest;
  private final byte[] unauthenticatedAttributes;

  private static final boolean DEBUG = false;
  private static void debug(String msg)
  {
    System.err.print("SignerInfo >> ");
    System.err.println(msg);
  }

  /**
   * Parse a SignerInfo object.
   */
  public SignerInfo(BERReader ber) throws IOException
  {
    DERValue val = ber.read();
    if (DEBUG)
      debug("SignerInfo: " + val);
    if (!val.isConstructed())
      throw new BEREncodingException("malformed SignerInfo");

    val = ber.read();
    if (val.getTag() != BER.INTEGER)
      throw new BEREncodingException("malformed Version");
    version = (BigInteger) val.getValue();

    if (DEBUG)
      debug("  Version: " + version);

    val = ber.read();
    if (!val.isConstructed())
      throw new BEREncodingException("malformed IssuerAndSerialNumber");

    if (DEBUG)
      debug("  IssuerAndSerialNumber: " + val);

    val = ber.read();
    if (!val.isConstructed())
      throw new BEREncodingException("malformed Issuer");
    issuer = new X500Principal(val.getEncoded());
    ber.skip(val.getLength());
    if (DEBUG)
      debug("    Issuer: " + issuer);

    val = ber.read();
    if (val.getTag() != BER.INTEGER)
      throw new BEREncodingException("malformed SerialNumber");
    serialNumber = (BigInteger) val.getValue();
    if (DEBUG)
      debug("    SerialNumber: " + serialNumber);

    val = ber.read();
    if (!val.isConstructed())
      throw new BEREncodingException("malformed DigestAlgorithmIdentifier");
    if (DEBUG)
      debug("  DigestAlgorithmIdentifier: " + val);

    int count = 0;
    DERValue val2 = ber.read();
    if (val2.getTag() != BER.OBJECT_IDENTIFIER)
      throw new BEREncodingException("malformed AlgorithmIdentifier");
    digestAlgorithmId = (OID) val2.getValue();
    if (DEBUG)
      debug("    OID: " + digestAlgorithmId);

    if (BERValue.isIndefinite(val))
      {
        val2 = ber.read();
        if (val2 != BER.END_OF_SEQUENCE)
          {
            digestAlgorithmParams = val2.getEncoded();
            val2 = ber.read();
            if (val2 != BER.END_OF_SEQUENCE)
              throw new BEREncodingException("expecting BER end-of-sequence");
          }
        else
          digestAlgorithmParams = null;
      }
    else if (val2.getEncodedLength() < val.getLength())
      {
        val2 = ber.read();
        digestAlgorithmParams = val2.getEncoded();
        if (val2.isConstructed())
          ber.skip(val2.getLength());
      }
    else
      digestAlgorithmParams = null;
    if(DEBUG)
      debug("    params: " + (digestAlgorithmParams == null ? null
                              : new BigInteger(digestAlgorithmParams).toString(16)));

    val = ber.read();
    if (val.getTag() == 0)
      {
        authenticatedAttributes = val.getEncoded();
        val = ber.read();
        if (val.isConstructed())
          ber.skip(val.getLength());
        if (DEBUG)
          debug("  AuthenticatedAttributes: " + val);
        val = ber.read();
      }
    else
      authenticatedAttributes = null;

    if (!val.isConstructed())
      throw new BEREncodingException("malformed DigestEncryptionAlgorithmIdentifier");
    if (DEBUG)
      debug("  DigestEncryptionAlgorithmIdentifier: " + val);
    count = 0;
    val2 = ber.read();
    if (val2.getTag() != BER.OBJECT_IDENTIFIER)
      throw new BEREncodingException("malformed AlgorithmIdentifier");
    digestEncryptionAlgorithmId = (OID) val2.getValue();
    if (DEBUG)
      debug("    OID: " + digestEncryptionAlgorithmId);

    if (BERValue.isIndefinite(val))
      {
        val2 = ber.read();
        if (val2 != BER.END_OF_SEQUENCE)
          {
            digestEncryptionAlgorithmParams = val2.getEncoded();
            val2 = ber.read();
            if (val2 != BER.END_OF_SEQUENCE)
              throw new BEREncodingException("expecting BER end-of-sequence");
          }
        else
          digestEncryptionAlgorithmParams = null;
      }
    else if (val2.getEncodedLength() < val.getLength())
      {
        val2 = ber.read();
        digestEncryptionAlgorithmParams = val2.getEncoded();
        if (val2.isConstructed())
          ber.skip(val2.getLength());
      }
    else
      digestEncryptionAlgorithmParams = null;
    if(DEBUG)
      debug("    params: " + (digestEncryptionAlgorithmParams == null ? null
                              : new BigInteger(digestEncryptionAlgorithmParams).toString(16)));

    val = ber.read();
    if (val.getTag() != BER.OCTET_STRING)
      throw new BEREncodingException("malformed EncryptedDigest");
    encryptedDigest = (byte[]) val.getValue();
    if (DEBUG)
      debug("  EncryptedDigest: " + new BigInteger(1, encryptedDigest).toString(16));

    if (ber.peek() == 1)
      unauthenticatedAttributes = ber.read().getEncoded();
    else
      unauthenticatedAttributes = null;

    if (ber.peek() == 0)
      ber.read();
  }

  public BigInteger getVersion()
  {
    return version;
  }

  public BigInteger getSerialNumber()
  {
    return serialNumber;
  }

  public X500Principal getIssuer()
  {
    return issuer;
  }

  public OID getDigestAlgorithmId()
  {
    return digestAlgorithmId;
  }

  public byte[] getDigestAlgorithmParams()
  {
    return (digestAlgorithmParams != null
            ? (byte[]) digestAlgorithmParams.clone()
            : null);
  }

  public byte[] getAuthenticatedAttributes()
  {
    return (authenticatedAttributes != null
            ? (byte[]) authenticatedAttributes.clone()
            : null);
  }

  public OID getDigestEncryptionAlgorithmId()
  {
    return digestEncryptionAlgorithmId;
  }

  public byte[] getDigestEncryptionAlgorithmParams()
  {
    return (digestEncryptionAlgorithmParams != null
            ? (byte[]) digestEncryptionAlgorithmParams.clone()
            : null);
  }

  public byte[] getEncryptedDigest()
  {
    return (encryptedDigest != null ? (byte[]) encryptedDigest.clone() : null);
  }

  public byte[] getUnauthenticatedAttributes()
  {
    return (unauthenticatedAttributes != null
            ? (byte[]) unauthenticatedAttributes.clone()
            : null);
  }
}
