// Pkcs11Attr.cpp -- Implementation of PKCS #11 Attributes class for // interoperability with Netscape and Entrust using the SLB PKCS#11 // package. // (c) Copyright Schlumberger Technology Corp., unpublished work, created // 1999. This computer program includes Confidential, Proprietary // Information and is a Trade Secret of Schlumberger Technology Corp. All // use, disclosure, and/or reproduction is prohibited unless authorized // in writing. All Rights Reserved. #include "NoWarning.h" #include "ForceLib.h" // Don't allow the min & max methods in to be superceded by // the min/max macros in #define NOMINMAX #include #include #include #include #include #include #include // for _alloca #include #include #include "Pkcs11Attr.h" #include "AuxHash.h" using namespace std; using namespace pki; /////////////////////////// HELPER ///////////////////////////////// namespace { class JoinWith : public binary_function { public: explicit JoinWith(second_argument_type const &rGlue) : m_Glue(rGlue) {} result_type operator()(string const &rFirst, string const &rSecond) const { return rFirst + m_Glue + rSecond; } private: second_argument_type const m_Glue; }; string Combine(vector const &rvsNames) { static string::value_type const cBlank = ' '; static string const sBlank(1, cBlank); return accumulate(rvsNames.begin() + 1, rvsNames.end(), *rvsNames.begin(), JoinWith(sBlank)); } } // namespace /////////////////////////// PUBLIC ///////////////////////////////// // Types // C'tors/D'tors Pkcs11Attributes::Pkcs11Attributes(Blob const &rCertificate, HCRYPTPROV hprovContext) : m_x509cert(AsString(rCertificate)), m_hprovContext(hprovContext) { } // Operators // Operations // Access Blob Pkcs11Attributes::ContainerId() { AuxHash ah(AuxContext(m_hprovContext), CALG_MD5); return ah.Value(AsBlob(Subject())); } Blob Pkcs11Attributes::EndDate() const { return Blob(3, 0); // TO DO: Set date } Blob Pkcs11Attributes::Issuer() { return AsBlob(m_x509cert.Issuer()); } string Pkcs11Attributes::Label() { string sFullName(Combine(m_x509cert.SubjectCommonName())); string sLabel(sFullName); static string const sNameSuffix = "'s "; sLabel.append(sNameSuffix); string sOrganizationName(Combine(m_x509cert.IssuerOrg())); sLabel.append(sOrganizationName); static string const sLabelSuffix = " ID"; sLabel.append(sLabelSuffix); return sLabel; } Blob Pkcs11Attributes::Modulus() { return AsBlob(m_x509cert.Modulus()); } Blob Pkcs11Attributes::RawModulus() { return AsBlob(m_x509cert.RawModulus()); } Blob Pkcs11Attributes::SerialNumber() { return AsBlob(m_x509cert.SerialNumber()); } Blob Pkcs11Attributes::StartDate() const { return Blob(3, 0); // TO DO: Set date } string Pkcs11Attributes::Subject() { return m_x509cert.Subject(); } // Predicates // Static Variables /////////////////////////// PROTECTED ///////////////////////////////// // Types // C'tors/D'tors // Operators // Operations // Access // Predicates // Static Variables /////////////////////////// PRIVATE ///////////////////////////////// // Types // C'tors/D'tors // Operators // Operations // Access // Predicates // Static Variables