Home | History | Annotate | Download | only in pkcs
      1 package org.bouncycastle.asn1.pkcs;
      2 
      3 import java.math.BigInteger;
      4 
      5 import org.bouncycastle.asn1.ASN1EncodableVector;
      6 import org.bouncycastle.asn1.ASN1Integer;
      7 import org.bouncycastle.asn1.ASN1Object;
      8 import org.bouncycastle.asn1.ASN1Primitive;
      9 import org.bouncycastle.asn1.ASN1Sequence;
     10 import org.bouncycastle.asn1.ASN1TaggedObject;
     11 import org.bouncycastle.asn1.DERNull;
     12 import org.bouncycastle.asn1.DERSequence;
     13 import org.bouncycastle.asn1.DERTaggedObject;
     14 import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
     15 import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
     16 
     17 public class RSASSAPSSparams
     18     extends ASN1Object
     19 {
     20     private AlgorithmIdentifier hashAlgorithm;
     21     private AlgorithmIdentifier maskGenAlgorithm;
     22     private ASN1Integer          saltLength;
     23     private ASN1Integer          trailerField;
     24 
     25     public final static AlgorithmIdentifier DEFAULT_HASH_ALGORITHM = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, DERNull.INSTANCE);
     26     public final static AlgorithmIdentifier DEFAULT_MASK_GEN_FUNCTION = new AlgorithmIdentifier(PKCSObjectIdentifiers.id_mgf1, DEFAULT_HASH_ALGORITHM);
     27     public final static ASN1Integer          DEFAULT_SALT_LENGTH = new ASN1Integer(20);
     28     public final static ASN1Integer          DEFAULT_TRAILER_FIELD = new ASN1Integer(1);
     29 
     30     public static RSASSAPSSparams getInstance(
     31         Object  obj)
     32     {
     33         if (obj instanceof RSASSAPSSparams)
     34         {
     35             return (RSASSAPSSparams)obj;
     36         }
     37         else if (obj != null)
     38         {
     39             return new RSASSAPSSparams(ASN1Sequence.getInstance(obj));
     40         }
     41 
     42         return null;
     43     }
     44 
     45     /**
     46      * The default version
     47      */
     48     public RSASSAPSSparams()
     49     {
     50         hashAlgorithm = DEFAULT_HASH_ALGORITHM;
     51         maskGenAlgorithm = DEFAULT_MASK_GEN_FUNCTION;
     52         saltLength = DEFAULT_SALT_LENGTH;
     53         trailerField = DEFAULT_TRAILER_FIELD;
     54     }
     55 
     56     public RSASSAPSSparams(
     57         AlgorithmIdentifier hashAlgorithm,
     58         AlgorithmIdentifier maskGenAlgorithm,
     59         ASN1Integer          saltLength,
     60         ASN1Integer          trailerField)
     61     {
     62         this.hashAlgorithm = hashAlgorithm;
     63         this.maskGenAlgorithm = maskGenAlgorithm;
     64         this.saltLength = saltLength;
     65         this.trailerField = trailerField;
     66     }
     67 
     68     private RSASSAPSSparams(
     69         ASN1Sequence seq)
     70     {
     71         hashAlgorithm = DEFAULT_HASH_ALGORITHM;
     72         maskGenAlgorithm = DEFAULT_MASK_GEN_FUNCTION;
     73         saltLength = DEFAULT_SALT_LENGTH;
     74         trailerField = DEFAULT_TRAILER_FIELD;
     75 
     76         for (int i = 0; i != seq.size(); i++)
     77         {
     78             ASN1TaggedObject    o = (ASN1TaggedObject)seq.getObjectAt(i);
     79 
     80             switch (o.getTagNo())
     81             {
     82             case 0:
     83                 hashAlgorithm = AlgorithmIdentifier.getInstance(o, true);
     84                 break;
     85             case 1:
     86                 maskGenAlgorithm = AlgorithmIdentifier.getInstance(o, true);
     87                 break;
     88             case 2:
     89                 saltLength = ASN1Integer.getInstance(o, true);
     90                 break;
     91             case 3:
     92                 trailerField = ASN1Integer.getInstance(o, true);
     93                 break;
     94             default:
     95                 throw new IllegalArgumentException("unknown tag");
     96             }
     97         }
     98     }
     99 
    100     public AlgorithmIdentifier getHashAlgorithm()
    101     {
    102         return hashAlgorithm;
    103     }
    104 
    105     public AlgorithmIdentifier getMaskGenAlgorithm()
    106     {
    107         return maskGenAlgorithm;
    108     }
    109 
    110     public BigInteger getSaltLength()
    111     {
    112         return saltLength.getValue();
    113     }
    114 
    115     public BigInteger getTrailerField()
    116     {
    117         return trailerField.getValue();
    118     }
    119 
    120     /**
    121      * <pre>
    122      * RSASSA-PSS-params ::= SEQUENCE {
    123      *   hashAlgorithm      [0] OAEP-PSSDigestAlgorithms  DEFAULT sha1,
    124      *    maskGenAlgorithm   [1] PKCS1MGFAlgorithms  DEFAULT mgf1SHA1,
    125      *    saltLength         [2] INTEGER  DEFAULT 20,
    126      *    trailerField       [3] TrailerField  DEFAULT trailerFieldBC
    127      *  }
    128      *
    129      * OAEP-PSSDigestAlgorithms    ALGORITHM-IDENTIFIER ::= {
    130      *    { OID id-sha1 PARAMETERS NULL   }|
    131      *    { OID id-sha256 PARAMETERS NULL }|
    132      *    { OID id-sha384 PARAMETERS NULL }|
    133      *    { OID id-sha512 PARAMETERS NULL },
    134      *    ...  -- Allows for future expansion --
    135      * }
    136      *
    137      * PKCS1MGFAlgorithms    ALGORITHM-IDENTIFIER ::= {
    138      *   { OID id-mgf1 PARAMETERS OAEP-PSSDigestAlgorithms },
    139      *    ...  -- Allows for future expansion --
    140      * }
    141      *
    142      * TrailerField ::= INTEGER { trailerFieldBC(1) }
    143      * </pre>
    144      * @return the asn1 primitive representing the parameters.
    145      */
    146     public ASN1Primitive toASN1Primitive()
    147     {
    148         ASN1EncodableVector v = new ASN1EncodableVector();
    149 
    150         if (!hashAlgorithm.equals(DEFAULT_HASH_ALGORITHM))
    151         {
    152             v.add(new DERTaggedObject(true, 0, hashAlgorithm));
    153         }
    154 
    155         if (!maskGenAlgorithm.equals(DEFAULT_MASK_GEN_FUNCTION))
    156         {
    157             v.add(new DERTaggedObject(true, 1, maskGenAlgorithm));
    158         }
    159 
    160         if (!saltLength.equals(DEFAULT_SALT_LENGTH))
    161         {
    162             v.add(new DERTaggedObject(true, 2, saltLength));
    163         }
    164 
    165         if (!trailerField.equals(DEFAULT_TRAILER_FIELD))
    166         {
    167             v.add(new DERTaggedObject(true, 3, trailerField));
    168         }
    169 
    170         return new DERSequence(v);
    171     }
    172 }
    173