vpnengine/utlpkcs10/inc/pkcs10.h
changeset 0 33413c0669b9
child 10 68dc8923de26
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vpnengine/utlpkcs10/inc/pkcs10.h	Thu Dec 17 09:14:51 2009 +0200
@@ -0,0 +1,192 @@
+/*
+* Copyright (c) 2003 - 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Pkcs10 certificate request.
+*
+*/
+
+
+
+#ifndef _PKCS10_H_
+#define _PKCS10_H_
+#include "pkidefs.h"
+
+////////////////////////////////////////////////////////////////////////////////////////
+//  Definitions
+////////////////////////////////////////////////////////////////////////////////////////
+#define SHA1_HASH_LTH       20
+#define MD5_HASH_LTH        16
+#define ASN1_MAX_LENGTH     0xffff
+#define ASN1_MAX_INTEGER    0xffff
+#define MAX_SIGNATURE_LENGTH 512
+#define ASN1_SHORT_TAG_HDR_LTH          2
+#define ASN1_LONG_TAG_HDR_LTH           4
+#define ASN1_NULL_LTH                   2
+#define ASN1_CONSTRUCTED                0x20
+#define ASN1_CONTEXT_SPECIFIC           0x80
+#define COMMON_NAME_OID_LTH             3
+#define KEY_TYPE_RSA_OID_LTH            9
+#define SUBJECTALTNAME_EMAIL_OID_LTH    9
+#define SUBJECTALTNAME_OID_LTH          3
+#define CHALLENGEPW_OID_LTH             9
+#define MD5WITHRSA_OID_LTH              9
+#define MD5SIGNATURE_OID_LTH            8
+#define SHA1WITHRSA_OID_LTH             9
+#define PKCS10_EXTENSION_OID_LTH        9
+#define DC_OID_LTH                     10
+
+enum THashType {HASH_TYPE_MD5, HASH_TYPE_SHA1};
+const TUint8 KCommonNameOid[COMMON_NAME_OID_LTH] = {0x55, 0x04, 0x03};
+const TUint8 KEmailAddressOid[SUBJECTALTNAME_EMAIL_OID_LTH] = {0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01};
+const TUint8 KSubjectAltNameOid[SUBJECTALTNAME_OID_LTH] = {0x55, 0x1D, 0x11};
+const TUint8 KChallengePWOid[CHALLENGEPW_OID_LTH] = { 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x07};
+const TUint8 KKeyTypeRSAOid[KEY_TYPE_RSA_OID_LTH] = {0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01};
+const TUint8 KMd5WithRSAEncryptionOid[MD5WITHRSA_OID_LTH] = {0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x04};
+const TUint8 KMd5SignatureOid[MD5SIGNATURE_OID_LTH] = {0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x05};
+const TUint8 KSha1WithRSAEncryptionOid[SHA1WITHRSA_OID_LTH] = {0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05};
+const TUint8 KPkcs10ExtensionOid[PKCS10_EXTENSION_OID_LTH] = {0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x0E};
+
+#define HEADERLENGTH    40
+#define TRAILERLENGTH   37
+#define HEADER _L("-----BEGIN NEW CERTIFICATE REQUEST-----\n")
+#define TRAILER _L("\n-----END NEW CERTIFICATE REQUEST-----")
+   
+#define StoreINTValue(d, s)  \
+                             (*(unsigned char*)((unsigned char*)(d)+3)) = (unsigned char)((s) & 0xff);\
+                             (*(unsigned char*)((unsigned char*)(d)+2)) = (unsigned char)(((s) >> 8 ) & 0xff);\
+                             (*(unsigned char*)((unsigned char*)(d)+1)) = (unsigned char)(((s) >> 16) & 0xff);\
+                             (*(unsigned char*)(d))                     = (unsigned char)(((s) >> 24) & 0xff)
+
+typedef TBool (*TSignCallback)(const TDesC8 &aHash, TDes8 &aSig, const TPKIKeyIdentifier &aPrivKey, TAny* aContext);
+
+class TIndexPair
+{
+    public:
+        TUint startIndex;
+        TUint endIndex;
+};
+
+const TUint8 KCountryNameOid[COMMON_NAME_OID_LTH] = {0x55, 0x04, 0x06};
+const TUint8 KOrganizationNameOid[COMMON_NAME_OID_LTH] = {0x55, 0x04, 0x0a};
+const TUint8 KOrganizationalUnitNameOid[COMMON_NAME_OID_LTH] = {0x55,0x04, 0x0b};
+const TUint8 KLocalityNameOid[COMMON_NAME_OID_LTH]= {0x55, 0x04, 0x07};
+const TUint8 KStateOrProvinceNameOid[COMMON_NAME_OID_LTH] = {0x55, 0x04, 0x08};
+const TUint8 KTitleOid[COMMON_NAME_OID_LTH] = {0x55, 0x04, 0x0c};
+const TUint8 KCommonNOid[COMMON_NAME_OID_LTH] = {0x55, 0x04, 0x03};
+const TUint8 KGivenNameOid[COMMON_NAME_OID_LTH] = {0x55, 0x04, 0x2a};
+const TUint8 KSurnameOid[COMMON_NAME_OID_LTH] = {0x55, 0x04, 0x04};
+const TUint8 KInitialsOid[COMMON_NAME_OID_LTH] = {0x55, 0x04, 0x2b};
+const TUint8 KGenerationQualifierOid[COMMON_NAME_OID_LTH] = {0x55, 0x04, 0x2c};
+const TUint8 KDNQualifierOid[COMMON_NAME_OID_LTH] = {0x55, 0x04, 0x2e};
+const TUint8 KSerialNumberOid[COMMON_NAME_OID_LTH] = {0x55, 0x04, 0x05};
+const TUint8 KDomainComponentOid[DC_OID_LTH] = {0x09, 0x92, 0x26, 0x89, 0x93, 0xF2, 0x2C, 0x64, 0x01, 0x19};
+
+const TUint KNullAttributeIndex          =  0;
+const TUint KCountryNameIndex            =  1;
+const TUint KOrganizationNameIndex       =  2;
+const TUint KOrganizationalUnitNameIndex =  3;
+const TUint KLocalityNameIndex           =  4;
+const TUint KStateOrProvinceNameIndex    =  5;
+const TUint KTitleIndex                  =  6;
+const TUint KCommonNameIndex             =  7;
+const TUint KGivenNameIndex              =  8;
+const TUint KSurnameIndex                =  9;
+const TUint KInitialsIndex               = 10;
+const TUint KGenerationQualifierIndex    = 11;
+const TUint KDNQualifierIndex            = 12;
+const TUint KSerialNumberIndex           = 13;
+const TUint KDomainComponentIndex        = 14;
+
+_LIT8(KCountryName, "C");
+_LIT8(KOrganizationName, "O");
+_LIT8(KOrganizationalUnitName, "OU");
+_LIT8(KLocalityName, "L"); 
+_LIT8(KStateOrProvinceName, "ST");
+_LIT8(KTitle, "TITLE");      
+_LIT8(KCommonName, "CN");    
+_LIT8(KGivenName, "GIVENNAME");
+_LIT8(KSurname, "SN");   
+_LIT8(KInitials, "INITIALS");
+_LIT8(KGenerationQualifier, "GENERATIONQUALIFIER");
+_LIT8(KDNQualifier, "DNQUALIFIER");
+_LIT8(KSerialNumber, "SERIALNUMBER");
+_LIT8(KDomainComponent, "DC");
+
+_LIT8(KDot, ".");
+
+//////////////////////////////////////////////////////////////////////////////
+//  Class CPkcs10Req
+//////////////////////////////////////////////////////////////////////////////
+class CPkcs10Req : public CBase
+{
+    public:
+#ifdef __EABI__
+        /** Cause vtable & typeinfo to be exported */
+        IMPORT_C CPkcs10Req() {};
+#endif
+        IMPORT_C ~CPkcs10Req();
+        //////////////////////////////////////////////////////////////////////
+        //  Visible interface
+        //////////////////////////////////////////////////////////////////////
+        //  Setting parameters for PKCS#10 request
+        //////////////////////////////////////////////////////////////////////
+        IMPORT_C TInt SetDistinguishedName(const TDesC8 &aDistinguishedName);
+        IMPORT_C TInt SetSubjectAltNameRfc822(const TDesC8 &aSubjectAltNameRfc822);
+        IMPORT_C TInt SetChallengePw(const TDesC8 &aChallengePw);
+        IMPORT_C TInt SetDNSName(const TDesC8 &aDNSName);
+        IMPORT_C TInt SetPublicKey(const TDesC8 &aPublicKeyBits);
+        IMPORT_C TInt SetDistinguishedNameExtendedL(const TDesC8 &aDistinguishedName);
+        //////////////////////////////////////////////////////////////////////
+        // Create PKCS#10 request
+        //////////////////////////////////////////////////////////////////////
+        IMPORT_C HBufC8* CreateCertificateRequestLC(THashType aSignatureAlgorithmId, const TPKIKeyIdentifier& aPrivateKeyFilename, TBool aDoBase64, TBool aDoPEM, TSignCallback aSignCallBack, TAny* aSignCallBackContext);
+        // Static functions
+        IMPORT_C static void BuildDistinguishedNameDerFromTextL(HBufC8 *&derBuffer, const TDesC8 &aDistinguishedName, TBool aByPass, const TDesC8 &aByPassType);
+        IMPORT_C static TPtrC8 AttributeTypeOidToText(const TDesC &aType);
+        static TInt ASNCopy(TUint8 *dataPtr, TUint8 *valuePtr, TInt length);
+        static void BuildIndexPairsLC(HBufC8 *&buffer, const TDesC8 &aDistinguishedName, CArrayFixFlat<TIndexPair> *aTypeIndexArray, CArrayFixFlat<TIndexPair> *aValueIndexArray);
+        static void BuildDerL(HBufC8 *aSource, HBufC8 *&derBuffer, CArrayFixFlat<TIndexPair> *aTypeIndexArray, CArrayFixFlat<TIndexPair> *aValueIndexArray, CArrayFixFlat<TPtr8> *aTypePtrArray, CArrayFixFlat<TPtr8> *aValuePtrArray, TBool aByPass, const TDesC8 &aByPassType);
+        static TBool OidExistsL(TPtr8 &aTypePtrArray, TUint &aIndex, TBuf8<32> &aDottedOidDer);
+        static TInt GetOid(TUint aIndex, const TUint8 *&aValue);
+        static void BuildElementDerLC(CArrayFixFlat<HBufC8 *> *aElementArray, TUint aWholeLength, TUint aSetLength, TUint aSeqLength, TUint aOidLength, TUint aStringLength, TUint aOidIndex, TBuf8<32> &aDottedOidDerPtr, TPtr8 &aValuePtr);
+        static TInt    DERSetLength(TUint8 *p, TInt datalen);
+        static TInt    DERSetInteger(TUint8 *p, TInt aValue);
+        static inline TInt DERSetTag(TUint8 *p, TUint8 aTag) { *p = aTag; return 1;};
+        static inline TInt DERSetOid(TUint8 *p, const unsigned char *oid, TInt datalen) {Mem::Copy(p, oid, datalen); return datalen;};
+    private:
+        ////////////////////////////////////////////////////////////////////////////////////////
+        // Class variables
+        ////////////////////////////////////////////////////////////////////////////////////////
+        TPtrC8 iDistinguishedName;
+        TPtrC8 iSubjectAltName;
+        TPtrC8 iChallengePW;
+        TPtrC8 iDNSName;
+        TPtrC8 iPublicKey;
+        THashType iSignatureAlgorithmId;
+        TBool   iUseExtendedDistinguishedName;
+        HBufC8 *iDNDerBuf;
+        ////////////////////////////////////////////////////////////////////////////////////////
+        // Internal functions
+        ////////////////////////////////////////////////////////////////////////////////////////
+        void MD5_HashL(const TDesC8 &aInData, TDes8& aOutData);
+        void SHA1_HashL(const TDesC8 &aInData, TDes8& aOutData);
+        void DigestL(const TDesC8& aData, TDes8& aDigest, THashType aHashType);
+        HBufC8* ASNEncodeCertificationRequestInfoLC();
+        HBufC8* ASNEncodeCertificationRequestLC(const TDes8 &CRLInfoBuffer, const TDes8 &signature);
+        HBufC8* ASNEncodeCommonAttributesLC();
+        HBufC8* ASNEncodePKIinfoLC();
+        HBufC8* ASNEncodeExtendedAttributesLC();
+};
+
+#endif
+