You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.4 KiB
81 lines
2.4 KiB
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR) |
|
#pragma warning disable |
|
using System; |
|
using System.IO; |
|
|
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1; |
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Pkcs; |
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509; |
|
|
|
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Pkcs |
|
{ |
|
/** |
|
* Utility class for reencoding PKCS#12 files to definite length. |
|
*/ |
|
public class Pkcs12Utilities |
|
{ |
|
/** |
|
* Just re-encode the outer layer of the PKCS#12 file to definite length encoding. |
|
* |
|
* @param berPKCS12File - original PKCS#12 file |
|
* @return a byte array representing the DER encoding of the PFX structure |
|
* @throws IOException |
|
*/ |
|
public static byte[] ConvertToDefiniteLength( |
|
byte[] berPkcs12File) |
|
{ |
|
Pfx pfx = Pfx.GetInstance(berPkcs12File); |
|
|
|
return pfx.GetEncoded(Asn1Encodable.Der); |
|
} |
|
|
|
/** |
|
* Re-encode the PKCS#12 structure to definite length encoding at the inner layer |
|
* as well, recomputing the MAC accordingly. |
|
* |
|
* @param berPKCS12File - original PKCS12 file. |
|
* @param provider - provider to use for MAC calculation. |
|
* @return a byte array representing the DER encoding of the PFX structure. |
|
* @throws IOException on parsing, encoding errors. |
|
*/ |
|
public static byte[] ConvertToDefiniteLength( |
|
byte[] berPkcs12File, |
|
char[] passwd) |
|
{ |
|
Pfx pfx = Pfx.GetInstance(berPkcs12File); |
|
|
|
ContentInfo info = pfx.AuthSafe; |
|
|
|
Asn1OctetString content = Asn1OctetString.GetInstance(info.Content); |
|
Asn1Object obj = Asn1Object.FromByteArray(content.GetOctets()); |
|
|
|
info = new ContentInfo(info.ContentType, new DerOctetString(obj.GetEncoded(Asn1Encodable.Der))); |
|
|
|
MacData mData = pfx.MacData; |
|
|
|
try |
|
{ |
|
int itCount = mData.IterationCount.IntValue; |
|
byte[] data = Asn1OctetString.GetInstance(info.Content).GetOctets(); |
|
byte[] res = Pkcs12Store.CalculatePbeMac( |
|
mData.Mac.AlgorithmID.Algorithm, mData.GetSalt(), itCount, passwd, false, data); |
|
|
|
AlgorithmIdentifier algId = new AlgorithmIdentifier( |
|
mData.Mac.AlgorithmID.Algorithm, DerNull.Instance); |
|
DigestInfo dInfo = new DigestInfo(algId, res); |
|
|
|
mData = new MacData(dInfo, mData.GetSalt(), itCount); |
|
} |
|
catch (Exception e) |
|
{ |
|
throw new IOException("error constructing MAC: " + e.ToString()); |
|
} |
|
|
|
pfx = new Pfx(info, mData); |
|
|
|
return pfx.GetEncoded(Asn1Encodable.Der); |
|
} |
|
} |
|
} |
|
#pragma warning restore |
|
#endif
|
|
|