--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cryptoservices/certificateandkeymgmt/inc/x509keyencoder.h Thu Sep 10 14:01:51 2009 +0300
@@ -0,0 +1,227 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:
+* X.509 key classes and utility classes for key encoding/decoding.
+*
+*/
+
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#if !defined (X509KEYENCODER_H)
+#define X509KEYENCODER_H
+
+#include <e32base.h>
+#include <e32std.h>
+#include <asymmetrickeys.h>
+#include <asymmetric.h>
+#include <hash.h>
+#include <bigint.h>
+#include <signed.h>
+
+// Forward declarations
+class CASN1EncBase;
+class CASN1EncContainer;
+class CASN1EncSequence;
+class CASN1EncBitString;
+
+class TX509KeyEncoder
+/**
+ * Abstract class that is the base class for RSA and DSA key encoder classes.
+ * These classes are used to encode the X509 ASN.1 types AlgorithmIdentifier and
+ * SubjectPublicKeyInfo.
+ *
+ * This class is part of the pkcs10 API, and will be changed or removed in a
+ * future release. You should not use it.
+ *
+ */
+ {
+public:
+ /**
+ * Constructor that takes an algorithm identifier and saves it into the
+ * corresponding member variable. It is then used in the
+ * EncodeSignatureAlgorithm() function.
+ *
+ * @param aDigestAlg Digest algorithm to use. Currently the following
+ * algorithms are supported: MD2, MD5, and SHA-1.
+ */
+ TX509KeyEncoder(TAlgorithmId aDigestAlg);
+
+ /**
+ * Produces the SubjectPublicKeyInfo encoding.
+ *
+ * The encoding has the following ASN.1 format:
+ * @code
+ * SubjectPublicKeyInfo {ALGORITHM : IOSet} ::= SEQUENCE {
+ * algorithm AlgorithmIdentifier {{IOSet}},
+ * subjectPublicKey BIT STRING
+ * }
+ * @endcode
+ */
+ IMPORT_C virtual CASN1EncBase* EncodeKeyLC() const = 0;
+
+ /**
+ * Produces the AlgorithmIdentifier encoding.
+ *
+ * @return ASN.1 sequence containing signature algorithm
+ */
+ IMPORT_C virtual CASN1EncSequence* EncodeSignatureAlgorithmLC() const = 0;
+
+ /**
+ * Produces the DigestAlgorithmIdentifier encoder.
+ *
+ * The encoding has the following ASN.1 format
+ * @code
+ * DigestAlgorithmIdentifier ::= SEQUENCE {
+ * algorithm AlgorithmIdentifier,
+ * parameters ANY DEFINED BY algorithm OPTIONAL }
+ *
+ * AlgorithmIdentifier ::= OBJECT IDENTIFIER
+ * @endcode
+ *
+ * @return Appropriate ASN.1 sequence of type <code>DigestAlgorithmIdentifier</code>
+ */
+ IMPORT_C virtual CASN1EncSequence* EncodeDigestAlgorithmLC() const;
+
+protected:
+ /** Digest algorithm to use. */
+ TAlgorithmId iDigestAlg;
+ };
+
+class TX509RSAKeyEncoder : public TX509KeyEncoder
+/**
+ * Subclasses TC509KeyEncoder to provides key encoding capability for RSA public keys.
+ *
+ * This class is part of the pkcs10 API, and will be changed or removed in a
+ * future release. You should not use it.
+ *
+ */
+ {
+public:
+ /**
+ * Constructs a RSA key pair encoder, saving reference to the passed
+ * key pair in the member variable.
+ *
+ * @param aPublicKey RSA public key to use for encoding.
+ * @param aDigestAlg Digest algorithm to use.
+ */
+ IMPORT_C TX509RSAKeyEncoder(const CRSAPublicKey& aPublicKey, TAlgorithmId aDigestAlg);
+
+ /**
+ * Produces the SubjectPublicKeyInfo encoding.
+ *
+ * The resulting encoding has the following form:
+ * @code
+ * SEQUENCE-OF
+ * SEQUENCE-OF
+ * OID of the encryption algorithm (KRSA)
+ * NULL
+ * BIT STRING encoded public key.
+ * @endcode
+ *
+ * @return DER-encoded public key information, placed on the cleanup stack.
+ */
+ IMPORT_C virtual CASN1EncBase* EncodeKeyLC() const;
+
+ /**
+ * Produces the AlgorithmIdentifier encoding.
+ *
+ * This has the following form:
+ * @code
+ * SEQUENCE-OF
+ * OID signature-algorithm
+ * NULL
+ * @endcode
+ *
+ * @return ASN.1 sequence containing signature algorithm encoding,
+ * placed on the cleanup stack.
+ */
+ IMPORT_C virtual CASN1EncSequence* EncodeSignatureAlgorithmLC() const;
+
+private:
+ /**
+ * Saved reference to the RSA public key to be used for encoding.
+ */
+ const CRSAPublicKey& iPublicKey;
+ };
+
+class TX509DSAKeyEncoder : public TX509KeyEncoder
+/**
+ * Provides key encoding and signing capability using a DSA public key.
+ *
+ * This class is part of the pkcs10 API, and will be changed or removed in a
+ * future release. You should not use it.
+ *
+ */
+ {
+public:
+ /**
+ * Constructs a DSA key pair encoder, saving reference to the passed
+ * public key in the member variable.
+ *
+ * @param aKeyPublic DSA public key to use for encoding.
+ * @param aDigestAlg Digest algorithm to use.
+ */
+ IMPORT_C TX509DSAKeyEncoder(const CDSAPublicKey& aKeyPublic,
+ TAlgorithmId aDigestAlg);
+
+ /**
+ * Produces the SubjectPublicKeyInfo encoding.
+ *
+ * The ASN.1 encoding of a DSA key has the following form:
+ * @code
+ * SEQUENCE-OF
+ * SEQUENCE-OF
+ * OID dsa (1.2.840.10040.4.1)
+ * SEQUENCE-OF
+ * INTEGER p
+ * INTEGER q
+ * INTEGER g
+ * BIT STRING
+ * INTEGER public value (y)
+ * @endcode
+ *
+ * @return DER-encoded public key information, placed on the cleanup stack.
+ */
+ IMPORT_C virtual CASN1EncBase* EncodeKeyLC() const;
+
+ /**
+ * Produces the AlgorithmIdentifier encoding.
+ *
+ * This has the following form:
+ * @code
+ * SEQUENCE-OF
+ * OID dsa-signature-oid
+ * SEQUENCE-OF dsa-params
+ * INTEGER p
+ * INTEGER q
+ * INTEGER g
+ * @endcode
+ *
+ * @return ASN.1 sequence containing signature algorithm encoding,
+ * placed on the cleanup stack.
+ */
+ IMPORT_C virtual CASN1EncSequence* EncodeSignatureAlgorithmLC() const;
+
+private:
+ /**
+ * Saved reference to the DSA public key to be used for encoding.
+ */
+ const CDSAPublicKey& iPublicKey;
+ };
+
+#endif