http://msdn.microsoft.com/en-us/windows/hardware/gg463180.aspx is the spec for the Authenticode PE signature format.
http://msdn.microsoft.com/en-us/gg463119 is the Microsoft PE and COFF Specification. Better download them now before they disappear, they appear to be deprecated in favor of Windows 8 format packages (of which I have no information). On September 9, 2014 10:18:18 AM PST, Prasad Dabak <pda...@icloud.com> wrote: >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 -- Sent from my Android device with K-9 Mail. Please excuse my brevity.