2 * Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
4 * This component and the accompanying materials are made available
5 * under the terms of the License "Eclipse Public License v1.0"
6 * which accompanies this distribution, and is available
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
9 * Initial Contributors:
10 * Nokia Corporation - initial contribution.
15 * X.509 key classes and utility classes for key encoding/decoding.
27 #if !defined (__X509KEYS_H__)
28 #define __X509KEYS_H__
32 #include <asymmetrickeys.h>
33 #include <asymmetric.h>
38 // Forward declarations
40 class CASN1EncContainer;
41 class CASN1EncSequence;
42 class CASN1EncBitString;
44 class CX509RSAPublicKey : public CRSAPublicKey
45 /** Adds the capability to decode DER-encoded RSA public keys.
47 * Adds a commitment to a specific encoding scheme allowing X.509 RSA public key
48 * superclasses to remain encoding-independent.
57 /** Creates a new RSA Public key object from the specified buffer containing the
58 * encoded binary representation.
60 * Initialises the object from its encoded binary form into an internal representation.
62 * @param aBinaryData The encoded binary representation.
63 * @return A pointer to the new CX509RSAPublicKey object. */
64 IMPORT_C static CX509RSAPublicKey* NewL(const TDesC8& aBinaryData);
66 /** Creates a new RSA Public Key object from the specified buffer containing the
67 * encoded binary representation, and puts a pointer to it onto the cleanup stack.
69 * @param aBinaryData The encoded binary representation.
70 * @return A pointer to the new CX509RSAPublicKey object. */
71 IMPORT_C static CX509RSAPublicKey* NewLC(const TDesC8& aBinaryData);
73 /** Creates a new RSA Public key object from the specified buffer containing the
74 * encoded binary representation, starting at the specified offset.
76 * @param aBinaryData The encoded binary representation.
77 * @param aPos The offset position from which to start decoding.
78 * @return A pointer to the new CX509RSAPublicKey object. */
79 IMPORT_C static CX509RSAPublicKey* NewL(const TDesC8& aBinaryData, TInt& aPos);
81 /** Creates a new RSA Public key object from the specified buffer containing the
82 * encoded binary representation, starting at the specified offset, and puts
83 * a pointer to it onto the cleanup stack.
85 * @param aBinaryData The encoded binary representation.
86 * @param aPos The offset position from which to start decoding.
87 * @return A pointer to the new CX509RSAPublicKey object. */
88 IMPORT_C static CX509RSAPublicKey* NewLC(const TDesC8& aBinaryData, TInt& aPos);
90 void ConstructL(const TDesC8& aBinaryData, TInt& aPos);
94 class TASN1EncRSAPublicKey
96 * Class for encoding RSA public keys to ASN.1 encoding.
105 * Encodes the supplied public key into buffer in DER format ASN.1:
112 * @param aKey Key to encode.
113 * @return Allocated buffer containing DER encoding of
114 * the supplied key aKey.
116 IMPORT_C HBufC8* EncodeDERL(const CRSAPublicKey& aKey) const;
119 class TASN1DecRSAPublicKey
121 * Class for decoding RSA public keys from ASN.1 DER encoding.
130 * Decodes an RSA key from the supplied buffer starting at the
131 * specified position.
133 * @param aDER Buffer containing DER ASN.1 encoding of the key.
134 * @param aPos Starting position in the buffer (updated on exit).
135 * @return A pointer to the new CRSAPublicKey object.
137 IMPORT_C CRSAPublicKey* DecodeDERL(const TDesC8& aDER, TInt& aPos) const;
140 class TASN1DecRSAKeyPair
142 * Class for decoding RSA key pairs from ASN.1 DER encoding.
151 * Decodes an RSA key pair from buffer containing ASN.1
152 * DER-encoded private key. The encoding of a private key
153 * contains public key components as well.
155 * @param aDER DER-encoded private key.
156 * @param aPos Position in the buffer to start decoding
158 * @param aPublicKey On return, the RSA public key object
159 * @param aPrivateKey On return, the RSA private key object
160 * @param aKeyType Key type, default is @c EStandardCRT
162 IMPORT_C void DecodeDERL(const TDesC8& aDER, TInt& aPos,
163 CRSAPublicKey*& aPublicKey,
164 CRSAPrivateKey*& aPrivateKey,
165 TRSAPrivateKeyType aKeyType = EStandardCRT);
168 class CX509DSAPublicKey : public CDSAPublicKey
169 /** Encapsulates the X.509 DSA public key.
171 * Adds a commitment to a specific encoding scheme allowing superclasses to remain
172 * encoding-independent.
178 // DSA public key, params, signature.
181 /** Creates a new X.509 DSA public key object.
183 * @param aParamsData A non-modifiable descriptor representing the entire encoding.
184 * @param aBinaryData The encoded binary representation.
185 * @return A pointer to the new CX509DSAPublicKey object. */
186 IMPORT_C static CX509DSAPublicKey* NewL(const TDesC8& aParamsData, const TDesC8& aBinaryData);
188 /** Creates a new X.509 DSA public key object, and puts a pointer to it onto the cleanup stack.
190 * @param aParamsData A non-modifiable descriptor representing the entire encoding.
191 * @param aBinaryData The encoded binary representation.
192 * @return A pointer to the new CX509DSAPublicKey object. */
193 IMPORT_C static CX509DSAPublicKey* NewLC(const TDesC8& aParamsData, const TDesC8& aBinaryData);
195 /** Creates a new X.509 DSA public key object.
197 * @param aParams The DSA parameters.
198 * @param aBinaryData The encoded binary representation.
199 * @return A pointer to the new CX509DSAPublicKey object. */
200 IMPORT_C static CX509DSAPublicKey* NewL(const CDSAParameters& aParams, const TDesC8& aBinaryData);
202 /** Creates a new X.509 DSA public key object, and puts a pointer to it onto the cleanup stack.
204 * @param aParams The DSA parameters.
205 * @param aBinaryData The encoded binary representation.
206 * @return A pointer to the new CX509DSAPublicKey object. */
207 IMPORT_C static CX509DSAPublicKey* NewLC(const CDSAParameters& aParams, const TDesC8& aBinaryData);
209 /** Creates a new X.509 DSA public key object.
211 * @param aParamsData A non-modifiable descriptor representing the entire encoding.
212 * @param aBinaryData The encoded binary representation.
213 * @param aPos The position from which to start decoding.
214 * @return A pointer to the new CX509DSAPublicKey object. */
215 IMPORT_C static CX509DSAPublicKey* NewL(const TDesC8& aParamsData, const TDesC8& aBinaryData,TInt& aPos);
217 /** Creates a new X.509 DSA public key object, and puts a pointer to it onto the cleanup stack.
219 * @param aParamsData A non-modifiable descriptor representing the entire encoding.
220 * @param aBinaryData The encoded binary representation.
221 * @param aPos The position from which to start decoding.
222 * @return A pointer to the new CX509DSAPublicKey object. */
223 IMPORT_C static CX509DSAPublicKey* NewLC(const TDesC8& aParamsData, const TDesC8& aBinaryData, TInt& aPos);
225 /** Creates a new X.509 DSA public key object.
227 * @param aParams The DSA parameters.
228 * @param aBinaryData The encoded binary representation.
229 * @param aPos The position from which to start decoding.
230 * @return A pointer to the new CX509DSAPublicKey object. */
231 IMPORT_C static CX509DSAPublicKey* NewL(const CDSAParameters& aParams, const TDesC8& aBinaryData, TInt& aPos);
233 /** Creates a new X.509 DSA public key object, and puts a pointer to it onto the cleanup stack.
235 * @param aParams The DSA parameters.
236 * @param aBinaryData The encoded binary representation.
237 * @param aPos The position from which to start decoding.
238 * @return A pointer to the new CX509DSAPublicKey object. */
239 IMPORT_C static CX509DSAPublicKey* NewLC(const CDSAParameters& aParams, const TDesC8& aBinaryData, TInt& aPos);
241 /** Gets the DSA parameters from the encoding key.
243 * @param aParamsData A non-modifiable descriptor representing the entire encoding.
244 * @return The DSA parameters. */
245 IMPORT_C static CDSAParameters* DSAParametersL(const TDesC8& aParamsData);
247 /** @internalComponent */
248 void ConstructL(const TDesC8& aParamsData, const TDesC8& aBinaryData, TInt& aPos);
249 /** @internalComponent */
250 void ConstructL(const CDSAParameters& aParams, const TDesC8& aBinaryData, TInt& aPos);
251 /** @internalComponent */
255 class TASN1DecDSAKeyPair
257 * Class for decoding DSA key pairs from ASN.1 DER encoding.
266 * Decodes a DSA key pair from a buffer containing an ASN.1
267 * DER-encoded private key.
269 * The encoding of the private key contains public key components as well.
271 * The DER encoding has the following format:
274 * INTEGER version (==0, ignored)
275 * INTEGER p (public prime)
276 * INTEGER q (160-bit public subprime, q | p-1)
277 * INTEGER g (public generator of subgroup)
278 * INTEGER x (private key)
279 * INTEGER y (public key y=g^x)
282 * @param aDER DER-encoded private key.
283 * @param aPos Position in the buffer to start decoding
285 * @param aPublicKey On return, the DSA public key object
286 * @param aPrivateKey On return, the DSA private key object
288 IMPORT_C void DecodeDERL(const TDesC8& aDER, TInt& aPos,
289 CDSAPublicKey*& aPublicKey, CDSAPrivateKey*& aPrivateKey);
293 * Class for encoding DSA public keys to ASN.1 encoding.
299 class TASN1EncDSAPublicKey
303 * Encodes the supplied public key into a buffer in DER format.
305 * Note that the encoding has the following format:
312 * BIT STRING (encoded INTEGER public value)
315 * @param aKey Key to encode.
316 * @return Sequence containing public key information.
318 IMPORT_C CASN1EncSequence* EncodeDERL(const CDSAPublicKey& aKey) const;
321 * Encodes DSA parameters into an ASN.1 encoding structure suitable for
322 * inclusion into other objects, like a PKCS#10 certificate request.
324 * Note that the encoding has the following form:
332 * @param aKey DSA public key.
333 * @return ASN.1 encoding structure on the cleanup stack.
335 IMPORT_C CASN1EncSequence* EncodeParamsLC(const CDSAPublicKey& aKey) const;
338 * Encodes a public key as a bit string.
340 * @param aKey DSA public key.
341 * @return ASN.1 bit string (public key). This is left on the cleanup stack.
344 IMPORT_C CASN1EncBitString* EncodePublicValueLC(const CDSAPublicKey& aKey) const;
347 class CX509DSASignature : public CDSASignature
348 /** Encapsulates the X.509 DSA signature.
350 * Adds a commitment to a specific encoding scheme allowing superclasses to remain
351 * encoding-independent.
358 /** Creates a new DSA Signature object from the specified buffer containing the
359 * encoded binary representation.
361 * @param aBinaryData The encoded binary representation.
362 * @return A pointer to the new CX509DSASignature object. */
363 IMPORT_C static CX509DSASignature* NewL(const TDesC8& aBinaryData);
365 /** Creates a new DSA Signature object from the specified buffer containing the
366 * encoded binary representation, and puts a pointer to it onto the cleanup stack.
368 * @param aBinaryData The encoded binary representation.
369 * @return A pointer to the new CX509DSASignature object. */
370 IMPORT_C static CX509DSASignature* NewLC(const TDesC8& aBinaryData);
372 /** Creates a new DSA Signature object from the specified buffer containing the
373 * encoded binary representation, starting at the specified offset.
375 * @param aBinaryData The encoded binary representation.
376 * @param aPos The offset position from which to start decoding.
377 * @return A pointer to the new CX509DSASignature object. */
378 IMPORT_C static CX509DSASignature* NewL(const TDesC8& aBinaryData, TInt& aPos);
380 /** Creates a new DSA Signature object from the specified buffer containing the
381 * encoded binary representation, starting at the specified offset, and puts
382 * a pointer to it onto the cleanup stack.
384 * @param aBinaryData The encoded binary representation.
385 * @param aPos The offset position from which to start decoding.
386 * @return A pointer to the new CX509DSASignature object. */
387 IMPORT_C static CX509DSASignature* NewLC(const TDesC8& aBinaryData, TInt& aPos);
389 void ConstructL(const TDesC8& aBinaryData, TInt& aPos);
393 class CX509DHPublicKey : public CDHPublicKey
394 /** Provides clients with the information they need for Diffie-Hellman key exchange
402 /** Creates a new CX509DHPublicKey object from the specified buffer containing the encoded
403 * binary representation.
405 * @param aParamsData A non-modifiable descriptor representing the entire encoding.
407 * @return A pointer to the new CX509DHPublicKey object.*/
408 IMPORT_C static CX509DHPublicKey* NewL(const TDesC8& aParamsData, const TDesC8& aKeyData);
410 /** Creates a new CX509DHPublicKey object from the specified buffer containing the encoded
411 * binary representation, and puts a pointer to it onto the cleanup stack.
413 * @param aParamsData A non-modifiable descriptor representing the entire encoding.
415 * @return A pointer to the new CX509DHPublicKey object.*/
416 IMPORT_C static CX509DHPublicKey* NewLC(const TDesC8& aParamsData, const TDesC8& aKeyData);
420 * Frees all resources owned by the object, prior to its destruction. */
421 IMPORT_C virtual ~CX509DHPublicKey();
423 /** @internalComponent */
425 /** @internalComponent */
426 void ConstructL(const TDesC8& aParamsData, const TDesC8& aKeyData);
429 class CX509DHKeyPair : public CDHKeyPair
430 /** This class represents the Diffie-Hellman Key Pair.
437 /** Creates a new DH key pair object from the specified buffer containing
438 * the encoded binary representation .
440 * @param aParamsData A non-modifiable descriptor representing the entire encoding.
441 * @return A pointer to the new CX509DHKeyPair object.
443 IMPORT_C static CX509DHKeyPair* NewL(const TDesC8& aParamsData);
445 /** Creates a new DH Key Pair object from the specified buffer containing the encoded binary
446 * representation, and puts a pointer to it onto the cleanup stack.
448 * @param aParamsData A non-modifiable descriptor representing the entire encoding.
449 * @return A pointer to the new CX509DHKeyPair object.
451 IMPORT_C static CX509DHKeyPair* NewLC(const TDesC8& aParamsData);
454 /** Virtual Destructor.
455 * Frees all resources owned by the object, prior to its destruction.
458 IMPORT_C virtual ~CX509DHKeyPair();
460 /** @internalComponent */
462 /** @internalComponent */
463 void ConstructL(const TDesC8& aParamsData);
466 class CX509DHValidationParams : public CBase
467 /** Validates Diffie-Hellman (DH) Domain parameters.
469 * Provides access to the DH Validation Parameters, which are used to determine
470 * if the DH Public Key has been generated in conformance with the algorithm
471 * specified in ESDH (see RFC 2631).
478 /** Creates a new DH Validation parameters object from the specified buffer containing
479 * the encoded binary representation.
481 * @param aBinaryData The encoded binary representation.
482 * @return A pointer to the new CX509DHValidationParams object. */
483 IMPORT_C static CX509DHValidationParams* NewL(const TDesC8& aBinaryData);
485 /** Creates a new DH Validation parameters object from the specified buffer containing
486 * the encoded binary representation, and puts a pointer to it onto the cleanup stack.
488 * @param aBinaryData The encoded binary representation.
489 * @return A pointer to the new CX509DHValidationParams object. */
490 IMPORT_C static CX509DHValidationParams* NewLC(const TDesC8& aBinaryData);
492 /** Creates a new DH Validation parameters object from the specified buffer containing
493 * the encoded binary representation, starting at the specified offset.
495 * @param aBinaryData The encoded binary representation.
496 * @param aPos The offset position from which to start decoding.
497 * @return A pointer to the new CX509DHValidationParams object. */
498 IMPORT_C static CX509DHValidationParams* NewL(const TDesC8& aBinaryData, TInt& aPos);
500 /** Creates a new DH Validation parameters object from the specified buffer containing
501 * the encoded binary representation, starting at the specified offset, and puts
502 * a pointer to it onto the cleanup stack.
504 * @param aBinaryData The encoded binary representation.
505 * @param aPos The offset position from which to start decoding.
506 * @return A pointer to the new CX509DHValidationParams object. */
507 IMPORT_C static CX509DHValidationParams* NewLC(const TDesC8& aBinaryData, TInt& aPos);
509 /** Gets a DSA prime generation seed.
511 * @return The bit string parameter used as the seed. */
512 IMPORT_C const TPtrC8 Seed() const;
514 /** Gets the output from a DSA prime generation counter.
516 * @return The integer value output. */
517 IMPORT_C const TInteger& PGenCounter() const;
521 * Frees all resources owned by the object, prior to its destruction. */
522 virtual ~CX509DHValidationParams();
524 /** @internalComponent */
525 CX509DHValidationParams();
526 /** @internalComponent */
527 void ConstructL(const TDesC8& aBinaryData, TInt& aPos);
529 RInteger iPGenCounter;
532 class CX509DHDomainParams : public CBase
533 /** Encapsulates the compulsory Diffie-Hellman domain parameter values P and G
541 /** Creates a new DH Domain parameters object from the specified buffer containing
542 * the encoded binary representation.
544 * @param aBinaryData The encoded binary representation.
545 * @return A pointer to the new CX509DHDomainParams object. */
546 IMPORT_C static CX509DHDomainParams* NewL(const TDesC8& aBinaryData);
548 /** Creates a new DH Domain parameters object from the specified buffer containing
549 * the encoded binary representation, and puts a pointer to it onto the cleanup stack.
551 * @param aBinaryData The encoded binary representation.
552 * @return A pointer to the new CX509DHDomainParams object. */
553 IMPORT_C static CX509DHDomainParams* NewLC(const TDesC8& aBinaryData);
555 /** Creates a new DH Domain parameters object from the specified buffer containing
556 * the encoded binary representation, starting at the specified offset.
558 * @param aBinaryData The encoded binary representation.
559 * @param aPos The offset position from which to start decoding.
560 * @return A pointer to the new CX509DHDomainParams object. */
561 IMPORT_C static CX509DHDomainParams* NewL(const TDesC8& aBinaryData, TInt& aPos);
563 /** Creates a new DH Domain parameters object from the specified buffer containing
564 * the encoded binary representation, starting at the specified offset, and puts
565 * a pointer to it onto the cleanup stack.
567 * @param aBinaryData The encoded binary representation.
568 * @param aPos The offset position from which to start decoding.
569 * @return A pointer to the new CX509DHDomainParams object. */
570 IMPORT_C static CX509DHDomainParams* NewLC(const TDesC8& aBinaryData, TInt& aPos);
572 /** Gets the compulsory parameter value P.
574 * @return The compulsory parameter value P. */
575 IMPORT_C const TInteger& P() const;
577 /** Gets the compulsory parameter value G.
579 * @return The compulsory parameter value G. */
580 IMPORT_C const TInteger& G() const;
582 //the next 3 members are optional, in which case NULL is returned
583 //the returned objects remain the property of this object
585 //N.B. according to RFC 2459 the Q member is *not* optional,
586 //however it is not essential for doing DH, and empirical studies
587 //suggest it doesn't get included much, so I'm relaxing the spec here
588 //to permit DomainParams objects which contain no Q.
590 /** Gets the optional value Q.
592 * @return The optional value Q. */
593 IMPORT_C const TInteger& Q() const;
595 /** Gets the optional value J.
597 * @return The optional value J. */
598 IMPORT_C const TInteger& J() const;
600 /** Gets the optional validation parameters.
602 * @return The optional validation parameters. */
603 IMPORT_C const CX509DHValidationParams* ValidationParams() const;
607 * Frees all resources owned by the object, prior to its destruction. */
608 virtual ~CX509DHDomainParams();
610 /** @internalComponent */
611 CX509DHDomainParams();
612 /** @internalComponent */
613 void ConstructL(const TDesC8& aBinaryData, TInt& aPos);
618 CX509DHValidationParams* iValidationParams;
621 class TX509KeyEncoder
623 * Abstract class that is the base class for RSA and DSA key encoder classes.
624 * These classes are used to encode the X509 ASN.1 types AlgorithmIdentifier and
625 * SubjectPublicKeyInfo.
627 * This class is part of the pkcs10 API, and will be changed or removed in a
628 * future release. You should not use it.
630 * @internalTechnology
635 * Constructor that takes an algorithm identifier and saves it into the
636 * corresponding member variable. It is then used in the
637 * EncodeSignatureAlgorithm() function.
639 * @param aDigestAlg Digest algorithm to use. Currently the following
640 * algorithms are supported: MD2, MD5, and SHA-1.
642 IMPORT_C TX509KeyEncoder(TAlgorithmId aDigestAlg);
645 * Produces the SubjectPublicKeyInfo encoding.
647 * The encoding has the following ASN.1 format:
649 * SubjectPublicKeyInfo {ALGORITHM : IOSet} ::= SEQUENCE {
650 * algorithm AlgorithmIdentifier {{IOSet}},
651 * subjectPublicKey BIT STRING
655 IMPORT_C virtual CASN1EncBase* EncodeKeyLC() const = 0;
658 * Produces the AlgorithmIdentifier encoding.
660 * @return ASN.1 sequence containing signature algorithm
662 IMPORT_C virtual CASN1EncSequence* EncodeSignatureAlgorithmLC() const = 0;
665 * Produces the DigestAlgorithmIdentifier encoder.
667 * The encoding has the following ASN.1 format
669 * DigestAlgorithmIdentifier ::= SEQUENCE {
670 * algorithm AlgorithmIdentifier,
671 * parameters ANY DEFINED BY algorithm OPTIONAL }
673 * AlgorithmIdentifier ::= OBJECT IDENTIFIER
676 * @return Appropriate ASN.1 sequence of type <code>DigestAlgorithmIdentifier</code>
678 IMPORT_C virtual CASN1EncSequence* EncodeDigestAlgorithmLC() const;
681 /** Digest algorithm to use. */
682 TAlgorithmId iDigestAlg;
685 class TX509RSAKeyEncoder : public TX509KeyEncoder
687 * Subclasses TC509KeyEncoder to provides key encoding capability for RSA public keys.
689 * This class is part of the pkcs10 API, and will be changed or removed in a
690 * future release. You should not use it.
692 * @internalTechnology
697 * Constructs a RSA key pair encoder, saving reference to the passed
698 * key pair in the member variable.
700 * @param aPublicKey RSA public key to use for encoding.
701 * @param aDigestAlg Digest algorithm to use.
703 IMPORT_C TX509RSAKeyEncoder(const CRSAPublicKey& aPublicKey, TAlgorithmId aDigestAlg);
706 * Produces the SubjectPublicKeyInfo encoding.
708 * The resulting encoding has the following form:
712 * OID of the encryption algorithm (KRSA)
714 * BIT STRING encoded public key.
717 * @return DER-encoded public key information, placed on the cleanup stack.
719 IMPORT_C virtual CASN1EncBase* EncodeKeyLC() const;
722 * Produces the AlgorithmIdentifier encoding.
724 * This has the following form:
727 * OID signature-algorithm
731 * @return ASN.1 sequence containing signature algorithm encoding,
732 * placed on the cleanup stack.
734 IMPORT_C virtual CASN1EncSequence* EncodeSignatureAlgorithmLC() const;
738 * Saved reference to the RSA public key to be used for encoding.
740 const CRSAPublicKey& iPublicKey;
743 class TX509DSAKeyEncoder : public TX509KeyEncoder
745 * Provides key encoding and signing capability using a DSA public key.
747 * This class is part of the pkcs10 API, and will be changed or removed in a
748 * future release. You should not use it.
750 * @internalTechnology
755 * Constructs a DSA key pair encoder, saving reference to the passed
756 * public key in the member variable.
758 * @param aKeyPublic DSA public key to use for encoding.
759 * @param aDigestAlg Digest algorithm to use.
761 IMPORT_C TX509DSAKeyEncoder(const CDSAPublicKey& aKeyPublic,
762 TAlgorithmId aDigestAlg);
765 * Produces the SubjectPublicKeyInfo encoding.
767 * The ASN.1 encoding of a DSA key has the following form:
771 * OID dsa (1.2.840.10040.4.1)
777 * INTEGER public value (y)
780 * @return DER-encoded public key information, placed on the cleanup stack.
782 IMPORT_C virtual CASN1EncBase* EncodeKeyLC() const;
785 * Produces the AlgorithmIdentifier encoding.
787 * This has the following form:
790 * OID dsa-signature-oid
791 * SEQUENCE-OF dsa-params
797 * @return ASN.1 sequence containing signature algorithm encoding,
798 * placed on the cleanup stack.
800 IMPORT_C virtual CASN1EncSequence* EncodeSignatureAlgorithmLC() const;
804 * Saved reference to the DSA public key to be used for encoding.
806 const CDSAPublicKey& iPublicKey;