From 216d64aab6a4522d35361d9bccae4a079e9bde83 Mon Sep 17 00:00:00 2001 From: bartland Date: Fri, 10 Apr 2015 16:48:26 +1000 Subject: Support (low-level) for non-default PRFs for PKCS5v2 --- crypto/src/asn1/pkcs/PBKDF2Params.cs | 72 +++++++++++++++++++++++++++++------- 1 file changed, 59 insertions(+), 13 deletions(-) (limited to 'crypto/src/asn1') diff --git a/crypto/src/asn1/pkcs/PBKDF2Params.cs b/crypto/src/asn1/pkcs/PBKDF2Params.cs index 1351b94cf..f629848d8 100644 --- a/crypto/src/asn1/pkcs/PBKDF2Params.cs +++ b/crypto/src/asn1/pkcs/PBKDF2Params.cs @@ -1,5 +1,5 @@ using System; - +using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Math; namespace Org.BouncyCastle.Asn1.Pkcs @@ -7,9 +7,11 @@ namespace Org.BouncyCastle.Asn1.Pkcs public class Pbkdf2Params : Asn1Encodable { + private static AlgorithmIdentifier algid_hmacWithSHA1 = new AlgorithmIdentifier(PkcsObjectIdentifiers.IdHmacWithSha1, DerNull.Instance); private readonly Asn1OctetString octStr; private readonly DerInteger iterationCount; private readonly DerInteger keyLength; + private readonly AlgorithmIdentifier prf; public static Pbkdf2Params GetInstance( object obj) @@ -26,16 +28,27 @@ namespace Org.BouncyCastle.Asn1.Pkcs public Pbkdf2Params( Asn1Sequence seq) { - if (seq.Count < 2 || seq.Count > 3) + if (seq.Count < 2 || seq.Count > 4) throw new ArgumentException("Wrong number of elements in sequence", "seq"); octStr = (Asn1OctetString)seq[0]; iterationCount = (DerInteger)seq[1]; - if (seq.Count > 2) + Asn1Encodable kl = null, d = null; + if (seq.Count > 3) { - keyLength = (DerInteger)seq[2]; - } + kl = seq[2]; + d = seq[3]; + } + else if (seq.Count > 2) + { + if (seq[2] is DerInteger) + kl = seq[2]; + else + d = seq[2]; + } + if (kl != null) keyLength = (DerInteger)kl; + if (d != null) prf = AlgorithmIdentifier.GetInstance(d); } public Pbkdf2Params( @@ -55,10 +68,29 @@ namespace Org.BouncyCastle.Asn1.Pkcs this.keyLength = new DerInteger(keyLength); } - public byte[] GetSalt() - { - return octStr.GetOctets(); - } + public Pbkdf2Params( + byte[] salt, + int iterationCount, + int keyLength, + AlgorithmIdentifier prf) + : this(salt, iterationCount, keyLength) + { + this.prf = prf; + } + + public Pbkdf2Params( + byte[] salt, + int iterationCount, + AlgorithmIdentifier prf) + : this(salt, iterationCount) + { + this.prf = prf; + } + + public byte[] GetSalt() + { + return octStr.GetOctets(); + } public BigInteger IterationCount { @@ -70,15 +102,29 @@ namespace Org.BouncyCastle.Asn1.Pkcs get { return keyLength == null ? null : keyLength.Value; } } - public override Asn1Object ToAsn1Object() - { - Asn1EncodableVector v = new Asn1EncodableVector( - octStr, iterationCount); + public bool IsDefaultPrf() + { + return prf == null || prf.Equals(algid_hmacWithSHA1); + } + + public AlgorithmIdentifier Prf + { + get { return prf ?? algid_hmacWithSHA1; } + } + + public override Asn1Object ToAsn1Object() + { + Asn1EncodableVector v = new Asn1EncodableVector( + octStr, iterationCount); if (keyLength != null) { v.Add(keyLength); } + if (!IsDefaultPrf()) + { + v.Add(prf); + } return new DerSequence(v); } -- cgit 1.4.1 From 208363f896b38a36563750bddedd3b9b51418335 Mon Sep 17 00:00:00 2001 From: Peter Dettman Date: Wed, 27 May 2015 12:45:42 +0700 Subject: Code cleanup --- crypto/src/asn1/pkcs/PBKDF2Params.cs | 128 +++++++++++++++++++---------------- 1 file changed, 69 insertions(+), 59 deletions(-) (limited to 'crypto/src/asn1') diff --git a/crypto/src/asn1/pkcs/PBKDF2Params.cs b/crypto/src/asn1/pkcs/PBKDF2Params.cs index f629848d8..5d1e9854f 100644 --- a/crypto/src/asn1/pkcs/PBKDF2Params.cs +++ b/crypto/src/asn1/pkcs/PBKDF2Params.cs @@ -4,60 +4,70 @@ using Org.BouncyCastle.Math; namespace Org.BouncyCastle.Asn1.Pkcs { - public class Pbkdf2Params - : Asn1Encodable - { + public class Pbkdf2Params + : Asn1Encodable + { private static AlgorithmIdentifier algid_hmacWithSHA1 = new AlgorithmIdentifier(PkcsObjectIdentifiers.IdHmacWithSha1, DerNull.Instance); - private readonly Asn1OctetString octStr; - private readonly DerInteger iterationCount; - private readonly DerInteger keyLength; + + private readonly Asn1OctetString octStr; + private readonly DerInteger iterationCount, keyLength; private readonly AlgorithmIdentifier prf; - public static Pbkdf2Params GetInstance( - object obj) - { - if (obj == null || obj is Pbkdf2Params) - return (Pbkdf2Params)obj; + public static Pbkdf2Params GetInstance( + object obj) + { + if (obj == null || obj is Pbkdf2Params) + return (Pbkdf2Params)obj; - if (obj is Asn1Sequence) - return new Pbkdf2Params((Asn1Sequence)obj); + if (obj is Asn1Sequence) + return new Pbkdf2Params((Asn1Sequence)obj); - throw new ArgumentException("Unknown object in factory: " + obj.GetType().FullName, "obj"); - } + throw new ArgumentException("Unknown object in factory: " + obj.GetType().FullName, "obj"); + } - public Pbkdf2Params( - Asn1Sequence seq) - { + public Pbkdf2Params( + Asn1Sequence seq) + { if (seq.Count < 2 || seq.Count > 4) - throw new ArgumentException("Wrong number of elements in sequence", "seq"); + throw new ArgumentException("Wrong number of elements in sequence", "seq"); - octStr = (Asn1OctetString)seq[0]; - iterationCount = (DerInteger)seq[1]; + this.octStr = (Asn1OctetString)seq[0]; + this.iterationCount = (DerInteger)seq[1]; Asn1Encodable kl = null, d = null; - if (seq.Count > 3) - { + if (seq.Count > 3) + { kl = seq[2]; d = seq[3]; } else if (seq.Count > 2) { if (seq[2] is DerInteger) + { kl = seq[2]; - else + } + else + { d = seq[2]; + } + } + if (kl != null) + { + keyLength = (DerInteger)kl; + } + if (d != null) + { + prf = AlgorithmIdentifier.GetInstance(d); } - if (kl != null) keyLength = (DerInteger)kl; - if (d != null) prf = AlgorithmIdentifier.GetInstance(d); - } - - public Pbkdf2Params( - byte[] salt, - int iterationCount) - { - this.octStr = new DerOctetString(salt); - this.iterationCount = new DerInteger(iterationCount); - } + } + + public Pbkdf2Params( + byte[] salt, + int iterationCount) + { + this.octStr = new DerOctetString(salt); + this.iterationCount = new DerInteger(iterationCount); + } public Pbkdf2Params( byte[] salt, @@ -68,15 +78,15 @@ namespace Org.BouncyCastle.Asn1.Pkcs this.keyLength = new DerInteger(keyLength); } - public Pbkdf2Params( - byte[] salt, - int iterationCount, + public Pbkdf2Params( + byte[] salt, + int iterationCount, int keyLength, AlgorithmIdentifier prf) : this(salt, iterationCount, keyLength) { this.prf = prf; - } + } public Pbkdf2Params( byte[] salt, @@ -92,24 +102,24 @@ namespace Org.BouncyCastle.Asn1.Pkcs return octStr.GetOctets(); } - public BigInteger IterationCount - { - get { return iterationCount.Value; } - } + public BigInteger IterationCount + { + get { return iterationCount.Value; } + } - public BigInteger KeyLength - { - get { return keyLength == null ? null : keyLength.Value; } - } + public BigInteger KeyLength + { + get { return keyLength == null ? null : keyLength.Value; } + } - public bool IsDefaultPrf() + public bool IsDefaultPrf { - return prf == null || prf.Equals(algid_hmacWithSHA1); - } + get { return prf == null || prf.Equals(algid_hmacWithSHA1); } + } public AlgorithmIdentifier Prf { - get { return prf ?? algid_hmacWithSHA1; } + get { return prf != null ? prf : algid_hmacWithSHA1; } } public override Asn1Object ToAsn1Object() @@ -117,16 +127,16 @@ namespace Org.BouncyCastle.Asn1.Pkcs Asn1EncodableVector v = new Asn1EncodableVector( octStr, iterationCount); - if (keyLength != null) - { - v.Add(keyLength); - } - if (!IsDefaultPrf()) + if (keyLength != null) + { + v.Add(keyLength); + } + if (!IsDefaultPrf) { v.Add(prf); } - return new DerSequence(v); - } - } + return new DerSequence(v); + } + } } -- cgit 1.4.1 From 792bde87f249328fcefb8e468cda50f418797e86 Mon Sep 17 00:00:00 2001 From: Peter Dettman Date: Fri, 26 Jun 2015 15:48:35 +1000 Subject: Move lazy initialization under lock --- crypto/src/asn1/x9/X9ECParametersHolder.cs | 35 ++++++++++++++++-------------- 1 file changed, 19 insertions(+), 16 deletions(-) (limited to 'crypto/src/asn1') diff --git a/crypto/src/asn1/x9/X9ECParametersHolder.cs b/crypto/src/asn1/x9/X9ECParametersHolder.cs index b3455709c..dd59e9f56 100644 --- a/crypto/src/asn1/x9/X9ECParametersHolder.cs +++ b/crypto/src/asn1/x9/X9ECParametersHolder.cs @@ -1,22 +1,25 @@ namespace Org.BouncyCastle.Asn1.X9 { - public abstract class X9ECParametersHolder - { - private X9ECParameters parameters; + public abstract class X9ECParametersHolder + { + private X9ECParameters parameters; - public X9ECParameters Parameters - { - get - { - if (parameters == null) - { - parameters = CreateParameters(); - } + public X9ECParameters Parameters + { + get + { + lock (this) + { + if (parameters == null) + { + parameters = CreateParameters(); + } - return parameters; - } - } + return parameters; + } + } + } - protected abstract X9ECParameters CreateParameters(); - } + protected abstract X9ECParameters CreateParameters(); + } } -- cgit 1.4.1