Imported Upstream version 6.6.0.89

Former-commit-id: b39a328747c2f3414dc52e009fb6f0aa80ca2492
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2019-09-24 08:53:40 +00:00
parent cf815e07e0
commit 95fdb59ea6
2556 changed files with 138145 additions and 47453 deletions

View File

@@ -115,7 +115,7 @@ namespace Mono.Security.Authenticode {
public const string spcIndirectDataContext = "1.3.6.1.4.1.311.2.1.4";
private byte[] fileblock;
private FileStream fs;
private Stream fs;
private int blockNo;
private int blockLength;
private int peOffset;
@@ -171,6 +171,14 @@ namespace Mono.Security.Authenticode {
blockNo = 0;
}
internal void Open (byte[] rawdata)
{
if (fs != null)
Close ();
fs = new MemoryStream (rawdata, false);
blockNo = 0;
}
internal void Close ()
{
if (fs != null) {

View File

@@ -49,6 +49,7 @@ namespace Mono.Security.Authenticode {
class AuthenticodeDeformatter : AuthenticodeBase {
private string filename;
private byte[] rawdata;
private byte[] hash;
private X509CertificateCollection coll;
private ASN1 signedHash;
@@ -74,17 +75,36 @@ namespace Mono.Security.Authenticode {
FileName = fileName;
}
public AuthenticodeDeformatter (byte[] rawData) : this ()
{
RawData = rawData;
}
public string FileName {
get { return filename; }
set {
Reset ();
filename = value;
try {
CheckSignature (value);
}
catch (SecurityException) {
CheckSignature ();
} catch (SecurityException) {
throw;
} catch {
reason = 1;
}
catch (Exception) {
}
}
public byte[] RawData {
get { return rawdata; }
set {
Reset ();
rawdata = value;
try {
CheckSignature ();
} catch (SecurityException) {
throw;
} catch {
reason = 1;
}
}
@@ -166,10 +186,13 @@ namespace Mono.Security.Authenticode {
get { return signingCertificate; }
}
private bool CheckSignature (string fileName)
private bool CheckSignature ()
{
filename = fileName;
Open (filename);
if (filename != null) {
Open (filename);
} else {
Open (rawdata);
}
entry = GetSecurityEntry ();
if (entry == null) {
// no signature is present
@@ -462,6 +485,7 @@ namespace Mono.Security.Authenticode {
private void Reset ()
{
filename = null;
rawdata = null;
entry = null;
hash = null;
signedHash = null;

View File

@@ -720,5 +720,34 @@ namespace MonoTests.Mono.Security.Authenticode {
Assert.IsNull (ad.Certificates, "Certificates");
Assert.IsNull (ad.SigningCertificate, "SigningCertificate");
}
[Test]
public void VerifySignedAssemblyInMemory ()
{
AuthenticodeDeformatter ad = new AuthenticodeDeformatter (helloworld_signed);
// note: it's a valid signed PE file - but it doesn't
// mean it's root is trusted on the current system
Assert.IsTrue (((ad.Reason == 0) || (ad.Reason == 6)), "Reason");
Assert.AreEqual ("35-A5-21-3B-FC-FE-FA-40-97-AA-BB-DE-3B-52-15-6F", BitConverter.ToString (ad.Hash), "Hash");
Assert.AreEqual (632011370700000000, ad.Timestamp.ToUniversalTime ().Ticks, "Timestamp");
Assert.AreEqual (4, ad.Certificates.Count, "#Certificates");
Assert.AreEqual ("C=ZA, S=Western Cape, L=Cape Town, O=Thawte Consulting cc, OU=Certification Services Division, CN=Thawte Server CA, E=server-certs@thawte.com", ad.SigningCertificate.IssuerName, "IssuerName");
Assert.AreEqual ("C=CA, S=Quebec, L=Quebec, O=Motus Technologies Inc., OU=Secure Application Development, CN=Motus Technologies Inc.", ad.SigningCertificate.SubjectName, "SubjectName");
}
[Test]
public void VerifyUnsignedAssemblyInMemory ()
{
string filename = Assembly.GetExecutingAssembly ().Location;
byte[] data = File.ReadAllBytes (filename);
AuthenticodeDeformatter ad = new AuthenticodeDeformatter (data);
// no digital signature
Assert.AreEqual (1, ad.Reason, "Reason");
Assert.IsNull (ad.Hash, "Hash");
Assert.AreEqual (DateTime.MinValue, ad.Timestamp, "Timestamp");
Assert.IsNull (ad.Certificates, "Certificates");
Assert.IsNull (ad.SigningCertificate, "SigningCertificate");
}
}
}