content: package local.org.bouncycastle.asn1.pkcs;
  
  import java.math.BigInteger;
  
  import local.org.bouncycastle.asn1.ASN1EncodableVector;
  import local.org.bouncycastle.asn1.ASN1Integer;
  import local.org.bouncycastle.asn1.ASN1Object;
  import local.org.bouncycastle.asn1.ASN1Primitive;
  import local.org.bouncycastle.asn1.ASN1Sequence;
  import local.org.bouncycastle.asn1.ASN1TaggedObject;
  import local.org.bouncycastle.asn1.DERNull;
  import local.org.bouncycastle.asn1.DERSequence;
  import local.org.bouncycastle.asn1.DERTaggedObject;
  import local.org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
  import local.org.bouncycastle.asn1.x509.AlgorithmIdentifier;
  
  
  public class RSASSAPSSparams
      extends ASN1Object
  {
      private AlgorithmIdentifier hashAlgorithm;
      private AlgorithmIdentifier maskGenAlgorithm;
      private ASN1Integer          saltLength;
      private ASN1Integer          trailerField;
      
      public final static AlgorithmIdentifier DEFAULT_HASH_ALGORITHM = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, DERNull.INSTANCE);
      public final static AlgorithmIdentifier DEFAULT_MASK_GEN_FUNCTION = new AlgorithmIdentifier(PKCSObjectIdentifiers.id_mgf1, DEFAULT_HASH_ALGORITHM);
      public final static ASN1Integer          DEFAULT_SALT_LENGTH = new ASN1Integer(20);
      public final static ASN1Integer          DEFAULT_TRAILER_FIELD = new ASN1Integer(1);
      
      public static RSASSAPSSparams getInstance(
          Object  obj)
      {
          if (obj instanceof RSASSAPSSparams)
          {
              return (RSASSAPSSparams)obj;
          }
          else if (obj != null)
          {
              return new RSASSAPSSparams(ASN1Sequence.getInstance(obj));
          }
  
          return null;
      }
      
      /**
       * The default version
       */
      public RSASSAPSSparams()
      {
          hashAlgorithm = DEFAULT_HASH_ALGORITHM;
          maskGenAlgorithm = DEFAULT_MASK_GEN_FUNCTION;
          saltLength = DEFAULT_SALT_LENGTH;
          trailerField = DEFAULT_TRAILER_FIELD;
      }
      
      public RSASSAPSSparams(
          AlgorithmIdentifier hashAlgorithm,
          AlgorithmIdentifier maskGenAlgorithm,
          ASN1Integer          saltLength,
          ASN1Integer          trailerField)
      {
          this.hashAlgorithm = hashAlgorithm;
          this.maskGenAlgorithm = maskGenAlgorithm;
          this.saltLength = saltLength;
          this.trailerField = trailerField;
      }
      
      private RSASSAPSSparams(
          ASN1Sequence seq)
      {
          hashAlgorithm = DEFAULT_HASH_ALGORITHM;
          maskGenAlgorithm = DEFAULT_MASK_GEN_FUNCTION;
          saltLength = DEFAULT_SALT_LENGTH;
          trailerField = DEFAULT_TRAILER_FIELD;
          
          for (int i = 0; i != seq.size(); i++)
          {
              ASN1TaggedObject    o = (ASN1TaggedObject)seq.getObjectAt(i);
              
              switch (o.getTagNo())
              {
              case 0:
                  hashAlgorithm = AlgorithmIdentifier.getInstance(o, true);
                  break;
              case 1:
                  maskGenAlgorithm = AlgorithmIdentifier.getInstance(o, true);
                  break;
              case 2:
                  saltLength = ASN1Integer.getInstance(o, true);
                  break;
              case 3:
                  trailerField = ASN1Integer.getInstance(o, true);
                  break;
              default:
                  throw new IllegalArgumentException("unknown tag");
              }
          }
      }
      
      public AlgorithmIdentifier getHashAlgorithm()
      {
          return hashAlgorithm;
      }
      
      public AlgorithmIdentifier getMaskGenAlgorithm()
      {
          return maskGenAlgorithm;
      }
      
      public BigInteger getSaltLength()
      {
          return saltLength.getValue();
      }
      
      public BigInteger getTrailerField()
      {
          return trailerField.getValue();
      }
      
      /**
       * <pre>
       * RSASSA-PSS-params ::= SEQUENCE {
       *   hashAlgorithm      [0] OAEP-PSSDigestAlgorithms  DEFAULT sha1,
       *    maskGenAlgorithm   [1] PKCS1MGFAlgorithms  DEFAULT mgf1SHA1,
       *    saltLength         [2] INTEGER  DEFAULT 20,
       *    trailerField       [3] TrailerField  DEFAULT trailerFieldBC
       *  }
       *
       * OAEP-PSSDigestAlgorithms    ALGORITHM-IDENTIFIER ::= {
       *    { OID id-sha1 PARAMETERS NULL   }|
       *    { OID id-sha256 PARAMETERS NULL }|
       *    { OID id-sha384 PARAMETERS NULL }|
       *    { OID id-sha512 PARAMETERS NULL },
       *    ...  -- Allows for future expansion --
       * }
       *
       * PKCS1MGFAlgorithms    ALGORITHM-IDENTIFIER ::= {
       *   { OID id-mgf1 PARAMETERS OAEP-PSSDigestAlgorithms },
       *    ...  -- Allows for future expansion --
       * }
       * 
       * TrailerField ::= INTEGER { trailerFieldBC(1) }
       * </pre>
       * @return the asn1 primitive representing the parameters.
       */
      public ASN1Primitive toASN1Primitive()
      {
          ASN1EncodableVector v = new ASN1EncodableVector();
          
          if (!hashAlgorithm.equals(DEFAULT_HASH_ALGORITHM))
          {
              v.add(new DERTaggedObject(true, 0, hashAlgorithm));
          }
          
          if (!maskGenAlgorithm.equals(DEFAULT_MASK_GEN_FUNCTION))
          {
              v.add(new DERTaggedObject(true, 1, maskGenAlgorithm));
          }
          
          if (!saltLength.equals(DEFAULT_SALT_LENGTH))
          {
              v.add(new DERTaggedObject(true, 2, saltLength));
          }
          
          if (!trailerField.equals(DEFAULT_TRAILER_FIELD))
          {
              v.add(new DERTaggedObject(true, 3, trailerField));
          }
          
          return new DERSequence(v);
      }
  }
  