SOL9 2.0 Class: MessageVerifier

 SOL9 C++ Class Library  SOL9 Samples  SOL9 Tutorial  SOL9 FAQ  SOL9 ClassTree 

Source code

/*
 * MessageVerifier.h 
 * Copyright (c) 2011 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED. 
 */


// SOL9
// 2009/03/13

#pragma once

#include <sol/Object.h>
#include <wincrypt.h>

#include <sol/Bytes.h>

namespace SOL {

class MessageVerifier :public Object {

private:
    CRYPT_VERIFY_MESSAGE_PARA params;
private:
    DWORD encodingType;

public:
    MessageVerifier(DWORD encType = (X509_ASN_ENCODING|PKCS_7_ASN_ENCODING))
        :encodingType(encType) 
    {
        memset(&params, 0, sizeof(params));
        params.cbSize = sizeof(params);

        //
        params.dwMsgAndCertEncodingType = encodingType;        // Default: X509_ASN_ENCODING|PKCS_7_ASN_ENCODING;
    }

public:
    ~MessageVerifier() 
    {

    }


public:
    int verify(__in Bytes& signedBytes, __out Bytes& decodedBytes)
    {
        int rc =NO_ERROR;

        unsigned char* buffer = NULL;
        unsigned int   size = 0;
        if ((rc = verify(signedBytes.getData(), signedBytes.getSize(), &buffer,  &size)) == NO_ERROR) {
            decodedBytes.shallowCopy(buffer, size);
        }
        return rc;
    }


public:
    int verify(__in const BYTE *signedBytes,
                __in unsigned int signedBytesSize,
                __out BYTE **decodedBytes,
                __out unsigned int *decodedBytesSize,
                __in  PCCERT_CONTEXT *ppSignerCert =NULL) 
    {    
        int rc = NO_ERROR;
        DWORD signerIndex = 0;
        DWORD decSize = 0;

        if (CryptVerifyMessageSignature(
                &params,
                signerIndex,
                signedBytes,
                signedBytesSize,
                NULL,
                 &decSize,
                ppSignerCert) == TRUE) {
                // OK
        } else {
            //Failed
            return GetLastError();
        }

        unsigned char* decoded = new unsigned char[decSize];

        if (CryptVerifyMessageSignature(
                &params,
                signerIndex,
                signedBytes,
                signedBytesSize,    
                decoded,
                &decSize,
                ppSignerCert) == TRUE) {
            //OK
            *decodedBytes = decoded;
            *decodedBytesSize = decSize;

        } else {
            delete [] decoded;
            rc = GetLastError();
        }
        return rc;
    }
};

}

Last modified: 1 Feb 2012

Copyright (c) 2009-2012 Antillia.com ALL RIGHTS RESERVED.