001package org.apache.commons.ssl.org.bouncycastle.asn1.pkcs; 002 003import java.math.BigInteger; 004 005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector; 006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Integer; 007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object; 008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1OctetString; 009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive; 010import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence; 011import org.apache.commons.ssl.org.bouncycastle.asn1.DEROctetString; 012import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence; 013import org.apache.commons.ssl.org.bouncycastle.asn1.x509.DigestInfo; 014 015public class MacData 016 extends ASN1Object 017{ 018 private static final BigInteger ONE = BigInteger.valueOf(1); 019 020 DigestInfo digInfo; 021 byte[] salt; 022 BigInteger iterationCount; 023 024 public static MacData getInstance( 025 Object obj) 026 { 027 if (obj instanceof MacData) 028 { 029 return (MacData)obj; 030 } 031 else if (obj != null) 032 { 033 return new MacData(ASN1Sequence.getInstance(obj)); 034 } 035 036 return null; 037 } 038 039 private MacData( 040 ASN1Sequence seq) 041 { 042 this.digInfo = DigestInfo.getInstance(seq.getObjectAt(0)); 043 044 this.salt = ((ASN1OctetString)seq.getObjectAt(1)).getOctets(); 045 046 if (seq.size() == 3) 047 { 048 this.iterationCount = ((ASN1Integer)seq.getObjectAt(2)).getValue(); 049 } 050 else 051 { 052 this.iterationCount = ONE; 053 } 054 } 055 056 public MacData( 057 DigestInfo digInfo, 058 byte[] salt, 059 int iterationCount) 060 { 061 this.digInfo = digInfo; 062 this.salt = salt; 063 this.iterationCount = BigInteger.valueOf(iterationCount); 064 } 065 066 public DigestInfo getMac() 067 { 068 return digInfo; 069 } 070 071 public byte[] getSalt() 072 { 073 return salt; 074 } 075 076 public BigInteger getIterationCount() 077 { 078 return iterationCount; 079 } 080 081 /** 082 * <pre> 083 * MacData ::= SEQUENCE { 084 * mac DigestInfo, 085 * macSalt OCTET STRING, 086 * iterations INTEGER DEFAULT 1 087 * -- Note: The default is for historic reasons and its use is deprecated. A 088 * -- higher value, like 1024 is recommended. 089 * </pre> 090 * @return the basic ASN1Primitive construction. 091 */ 092 public ASN1Primitive toASN1Primitive() 093 { 094 ASN1EncodableVector v = new ASN1EncodableVector(); 095 096 v.add(digInfo); 097 v.add(new DEROctetString(salt)); 098 099 if (!iterationCount.equals(ONE)) 100 { 101 v.add(new ASN1Integer(iterationCount)); 102 } 103 104 return new DERSequence(v); 105 } 106}