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