Thanks Jacob for your response. Very informative indeed!

Thanks
-Prasad

Sent from my iPhone

> On 09-Sep-2014, at 10:05 pm, Jakob Bohm <jb-open...@wisemo.com> wrote:
> 
>> On 09/09/2014 09:01, Prasad Dabak wrote:
>> Thanks Jacob for an elaborate answer. Somehow I never received your response 
>> to my registered email address, hence delay in responding.
> This time I have CC-ed you in addition to the mail list.
>> I have a few follow-up questions on your response.
>> 
>> 1. So, "encryptedDigest"  has no relation to the stored "messageDigest"? I 
>> thought it's a encrypted version of the messageDigest?
> As far as I recall, there is a chain of 4 digests.  The first digest
> is calculated over the file and is stored in the spcIndirectData. The
> second digest is calculated over the spcIndirectData (the contentInfo
> of the the PKCS#7 structure) and is stored as "messageDigest" in the
> AuthenticatedAttributes of each PKCS#7 signerInfo.  The third hash
> is calculated over the AuthenticatedAttributes and is signed to
> produce the "encryptedDigest" in that same signerInfo.  All 3 need to
> be checked to confirm that the file hash is actually (indirectly)
> signed by the encryptedDigest using the public key in the certificate
> whose name is listed in the signerInfo.
>> 2. I agree that it's better to do cheaper checks first e.g. I am also 
>> matching PE checksum stored in the optional header.
> Indeed, though that is a very weak checksum (file size plus 16 bit TCP/IP
> checksum of file).  Also it is allowed to be 0 to indicate no checksum
> (even if you set the checksum, it might be cleared if an Administrator
> adds his own countersignature to all authorized programs on his
> computers, aka AppLocker).
>> 3. spcPEImageData is probably relevant only for signing that uses page 
>> hashes?
> I never quite figured out where they store the page hashes. However I
> believe the constant semi-empty spcPEImageData with the "<<<obsolete>>>"
> string is the traditional marker to indicate that the signature is for
> a PE file, and not e.g. a document file with the same hashed bytestream.
> 
>> 4. PKCS7_verify is already matching the encryptedDigest, do we still need to 
>> validate it ourselves?
> If it is, I am myself guessing a bit as to what that function does and
> does not check.  But note that it probably doesn't check the full chain
> of 3 message digests, since at least the digest over the file itself is
> inside a blob that the PKCS#7 standard has no opinion about.
>> 5. So, basically are are suggesting to look into the subject string and see 
>> if we can find patterns like /CN=COMPANY-NAME... issuer: 
>> /C=US/O=SIGNER_NAME....? How authoritative it is? I mean can someone else 
>> have same COMPANY-NAME and PATTERN-NAME in their certificate?
> Actually, the subject is a data structure (a hierarchical list of sets
> of tagged strings) and the relevant comparison would be to compare those
> elements that don't change when getting a new certificate from the CA.
> It is the CAs responsibility to make sure the don't issue certificates
> to the wrong people, and if they make a mistake they are expected to
> quickly add the bad certificate to their published CRL, which is why
> you need to check the CRL before trusting the certificate.  An
> additional check is to make sure the CA that issued the intermediary
> certificate that issued the "COMAPNY-NAME" certificate is actually one
> of the (few) CAs that "COMPANY-NAME" is going to buy certificates from.
>  This protects against fake certificates issued by smaller CAs that
> you aren't going to use anyway.
>> 
>> In my case, I am the one who is signing the executable using my certificate 
>> and a "cross certificate" issued by Microsoft and I want to programmatically 
>> ensure following things.
>> 
>> 1. Code is not tampered since it was signed (matching messageDigest with 
>> computed hash)
> Actually matching digest in spcIndirectData with computed hash. Plus
> consistency checks to make sure the signature is actually for a PE file
> and was not otherwise doctored.  For instance there should be no bytes
> in the file after the end of the signature blob.
>> 2. Verifying the digital signature (PKCS7_Verify)
>> 3. Confirming that the executable is signed by my company certificate.
>> 
>> I am stuck on part (3) and don't see a clean way apart from matching strings 
>> in subject field?  If I hard-code the public key in my verification code, I 
>> will need to update it when I switch to a newer public key?
> Yep, that is why careful matching against various Distinguished Name
> fields is needed.
> 
>> 
>>> On Sep 06, 2014, at 09:44 PM, Prasad Dabak <pda...@icloud.com> wrote:
>>> 
>>> Hello,
>>> 
>>> Given a signed Windows portable executable, I want to programmatically 
>>> verify two things using openssl APIs
>>> 
>>> 1. Verify the digital signature.
>>> 2. Confirm that the executable is signed by a specific company using that 
>>> company's public key.
>>> 
>>> It seems that part (1) can be done by parsing the signedData attribute in 
>>> the portable executable, extracting the hashing algorithm and digest stored 
>>> there, re-computing the digest of the executable using the same hashing 
>>> algorithm and match them.
>>> 
>>> I have following questions.
>>> 
>>> 1. The signData contains messageDigest (unencrypted) and encryptedDigest 
>>> (encrypted). Is it enough to match messgaeDigest with the computed digest? 
>>> OR we also need to decrypt the encryptedDigest using the company public key 
>>> and match that as well?
>>> 2. What does PKCS7_Verify exactly do? I looked at 
>>> https://www.openssl.org/docs/crypto/PKCS7_verify.htmland I understand  that 
>>> it verifies certificate chain. However, it's not clear to me as to what 
>>> exactly it does with respect to signature verification?
>>> 3. I am assuming that I require to do both (1) and (2) in order to verify 
>>> the authenticode signature?
>>> 4. What is the best way to verify if the executable is signed by specific 
>>> company using that company's public key?
>>> 
>>> Any inputs will be greatly appreciated!
> 
> 
> Enjoy
> 
> Jakob
> -- 
> Jakob Bohm, CIO, Partner, WiseMo A/S.  http://www.wisemo.com
> Transformervej 29, 2860 Søborg, Denmark.  Direct +45 31 13 16 10
> This public discussion message is non-binding and may contain errors.
> WiseMo - Remote Service Management for PCs, Phones and Embedded
> 
> ______________________________________________________________________
> OpenSSL Project                                 http://www.openssl.org
> User Support Mailing List                    openssl-users@openssl.org
> Automated List Manager                           majord...@openssl.org
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to