os/security/cryptoservices/filebasedcertificateandkeystores/source/shared/TokenDataMarshaller.cpp
First public contribution.
2 * Copyright (c) 2004-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.
19 #include "fsmarshaller.h"
20 #include "fsdatatypes.h"
21 #include "NullStream.h"
22 #include <asymmetric.h>
26 #include <certificateapps.h>
27 #include <ccertattributefilter.h>
29 // Generic externalization stuff ///////////////////////////////////////////////
32 * Determine how many bytes are taked up by the externalized representation of
36 TInt Size(const T& aObject)
38 RNullWriteStream stream;
39 TRAPD(err, stream << aObject);
42 _LIT(KPanicCategory, "InValid Size");
43 User::Panic(KPanicCategory,ESerialisationPanic);
46 return stream.BytesWritten();
50 * Externalize an object to a buffer. Leaves if an error occurs.
53 void WriteL(const T& aIn, TDes8& aOut)
55 RDesWriteStream stream(aOut);
61 * Externalize an object to a buffer. In debug mode, it will panics if an error
62 * occurs - eg buffer is too short. In release mode, errors are ignored.
65 void Write(const T& aIn, TDes8& aOut)
67 TRAPD(err, WriteL(aIn, aOut));
70 _LIT(KPanicCategory, "Writing Error");
71 User::Panic(KPanicCategory,ESerialisationPanic);
76 * Implement Externalization selector for RPointerArrays to use a function.
79 EXTERNALIZE_FUNCTION(RPointerArray<T>)
82 * Function to externalize RPointerArrays.
84 * Although this is generic, it's currently only instantiated for CKeyInfo.
87 void ExternalizeL(const RPointerArray<T>& aIn, RWriteStream& aOut)
89 TInt count = aIn.Count();
90 aOut.WriteInt32L(count);
91 for (TInt i = 0 ; i < count ; ++i)
96 User::Leave(KErrArgument);
103 * Implement Externalization selector for RArrays to use a function.
106 EXTERNALIZE_FUNCTION(RArray<T>)
109 * Function to externalize RArrays.
112 void ExternalizeL(const RArray<T>& aIn, RWriteStream& aOut)
114 TInt count = aIn.Count();
115 aOut.WriteInt32L(count);
116 for (TInt i = 0 ; i < count ; ++i)
122 // No-so-generic internalization stuff /////////////////////////////////////////
125 * Internalize an object from a descriptor.
128 void ReadL(const TDesC8& aIn, T& aOut)
130 RDesReadStream stream(aIn);
136 * Implement Internalization selector for RArrays to use a function.
139 inline Internalize::Function Internalization(const RArray<T>*)
141 return Internalize::Function();
145 * Function to internalize an RArray.
148 void InternalizeL(RArray<T>& aOut, RReadStream& aIn)
150 ASSERT(aOut.Count() == 0);
151 TInt count = aIn.ReadInt32L();
152 for (TInt i = 0 ; i < count ; ++i)
156 User::LeaveIfError(aOut.Append(t));
161 * Internalize an object from a stream. Creates an instance by calling the
162 * class' NewL(RReadStream&) method.
165 inline void CreateL(RReadStream& aIn, T*& aOut)
171 * Internalize an object from a descriptor.
174 void CreateL(const TDesC8& aIn, T& aOut)
176 RDesReadStream stream(aIn);
177 CreateL(stream, aOut);
182 * Internalize an object from a descriptor leaving the result on the cleanup
183 * stack. This is generic, but is only instantiated for RInteger.
186 void CreateLC(const TDesC8& aIn, T& aOut)
188 RDesReadStream stream(aIn);
189 CreateLC(stream, aOut);
194 * Internalize a cryptotokens object from a descriptor.
197 void CreateL(const TDesC8& aIn, MCTToken& aToken, T& aOut)
199 RDesReadStream stream(aIn);
200 CreateL(stream, aToken, aOut);
205 * Internalize a cryptotoken object from a stream. Creates an instance by
206 * calling the class' NewL(RReadStream&, MCTToken&) method.
209 inline void CreateL(RReadStream& aIn, MCTToken& aToken, T*& aOut)
211 aOut = T::NewL(aIn, aToken);
215 * Internalize an array of of key info objects from a stream.
217 void CreateL(RReadStream& aIn, MCTToken& aToken, MKeyInfoArray& aOut)
219 TInt count = aIn.ReadInt32L();
220 for (TInt i = 0 ; i < count ; ++i)
223 CreateL(aIn, aToken, t);
224 CleanupReleasePushL(*t);
225 User::LeaveIfError(aOut.Append(t));
230 // can we combine this with the one above?
233 * Internalize an RMPointerArray of cryptotoken objects from a stream.
236 void CreateL(RReadStream& aIn, MCTToken& aToken, RMPointerArray<T>& aOut)
238 TInt count = aIn.ReadInt32L();
239 for (TInt i = 0 ; i < count ; ++i)
242 CreateL(aIn, aToken, t);
243 CleanupReleasePushL(*t);
244 User::LeaveIfError(aOut.Append(t));
249 // Serialization for RIntegers /////////////////////////////////////////////////
251 // This is exported as it is useful itself in the server
254 * Implement a CreateL function for internalizing HBufC8s.
256 inline void CreateL(RReadStream& aIn, HBufC8*& aOut)
258 aOut = HBufC8::NewL(aIn, KMaxIntegerSize);
262 * Implement a CreateLC function for internalizing RIntegers.
264 EXPORT_C void CreateLC(RReadStream& aIn, RInteger& aOut)
268 CleanupStack::PushL(rBuf);
269 TPtr8 rPtr(rBuf->Des());
270 aOut = RInteger::NewL(rPtr);
271 CleanupStack::PopAndDestroy(rBuf);
272 CleanupStack::PushL(aOut);
276 * Externalize an RInteger.
278 EXPORT_C void ExternalizeL(const TInteger& aIn, RWriteStream& aOut)
280 HBufC8* sBuf = aIn.BufferLC();
282 CleanupStack::PopAndDestroy(sBuf);
285 // Externalization for signature objects ///////////////////////////////////////
288 * Implement Externalization selector for CDSASignature to use a function.
290 EXTERNALIZE_FUNCTION(CDSASignature)
293 * Externalise a DSA signature object.
295 void ExternalizeL(const CDSASignature& aIn, RWriteStream& aOut)
302 * Implement Externalization selector for CRSASignature to use a function.
304 EXTERNALIZE_FUNCTION(CRSASignature)
307 * Externalize an RSA signature object.
309 void ExternalizeL(const CRSASignature& aIn, RWriteStream& aOut)
314 // Internalization for signature objects ///////////////////////////////////////
317 * Specialise CreateL for CRSASignature.
320 void CreateL(RReadStream& aIn, CRSASignature*& aOut)
324 aOut = CRSASignature::NewL(r);
325 CleanupStack::Pop(); // r
329 * Specialise CreateL for CDSASignature.
332 void CreateL(RReadStream& aIn, CDSASignature*& aOut)
338 aOut = CDSASignature::NewL(r, s);
339 CleanupStack::Pop(2); // s, r
342 // Serialization for DH ojects /////////////////////////////////////////////////
345 * Implement Externalization selector for CDHParams to use a function.
347 EXTERNALIZE_FUNCTION(CDHParams)
350 * Externalise a TDHParams object.
352 void ExternalizeL(const CDHParams& aIn, RWriteStream& aOut)
359 * Specialise CreateL for CDHParams.
362 void CreateL(RReadStream& aIn, CDHParams*& aOut)
368 aOut = CDHParams::NewL(n, g);
369 CleanupStack::PopAndDestroy(2, &n); // g, n
373 * Implement Externalization selector for CDHPublicKey to use a function.
375 EXTERNALIZE_FUNCTION(CDHPublicKey)
378 * Externalise a CDHPublicKey object.
380 void ExternalizeL(const CDHPublicKey& aIn, RWriteStream& aOut)
388 * Specialise CreateL for CDHPublicKey.
391 void CreateL(RReadStream& aIn, CDHPublicKey*& aOut)
399 aOut = CDHPublicKey::NewL(n, g, X);
400 CleanupStack::Pop(3); // X, g, n
403 // Common //////////////////////////////////////////////////////////////////////
405 EXPORT_C void TokenDataMarshaller::ReadL(const TDesC8& aIn, RArray<TUid>& aOut)
410 EXPORT_C TInt TokenDataMarshaller::Size(const CKeyInfoBase& aIn)
415 EXPORT_C void TokenDataMarshaller::Write(const CKeyInfoBase& aIn, TDes8& aOut)
420 EXPORT_C TInt TokenDataMarshaller::Size(const RArray<TUid>& aIn)
425 EXPORT_C void TokenDataMarshaller::Write(const RArray<TUid>& aIn, TDes8& aOut)
430 EXPORT_C TInt TokenDataMarshaller::Size(const MCertInfo& aIn)
435 EXPORT_C void TokenDataMarshaller::Write(const MCertInfo& aIn, TDes8& aOut)
440 // Client //////////////////////////////////////////////////////////////////////
442 EXPORT_C void TokenDataMarshaller::ReadL(const TDesC8& aIn, MCTToken& aToken, MKeyInfoArray& aOut)
444 ::CreateL(aIn, aToken, aOut);
447 EXPORT_C void TokenDataMarshaller::ReadL(const TDesC8& aIn, MCTToken& aToken, CCTKeyInfo*& aOut)
449 ::CreateL(aIn, aToken, aOut);
452 EXPORT_C void TokenDataMarshaller::ReadL(const TDesC8& aIn, CDSASignature*& aOut)
454 ::CreateL(aIn, aOut);
457 EXPORT_C void TokenDataMarshaller::ReadL(const TDesC8& aIn, CRSASignature*& aOut)
459 ::CreateL(aIn, aOut);
462 EXPORT_C TInt TokenDataMarshaller::Size(const CDHParams& aIn)
464 return Size(aIn.N()) + Size(aIn.G());
467 EXPORT_C void TokenDataMarshaller::WriteL(const CDHParams& aIn, TDes8& aOut)
472 EXPORT_C TInt TokenDataMarshaller::Size(const CDHPublicKey& aIn)
474 return Size(aIn.N()) + Size(aIn.G()) + Size(aIn.X());
477 EXPORT_C void TokenDataMarshaller::WriteL(const CDHPublicKey& aIn, TDes8& aOut)
482 EXPORT_C void TokenDataMarshaller::ReadL(const TDesC8& aIn, RInteger& aInteger)
484 ::CreateLC(aIn, aInteger);
488 EXPORT_C TInt TokenDataMarshaller::Size(const CPBEncryptParms& aIn)
493 EXPORT_C void TokenDataMarshaller::Write(const CPBEncryptParms& aIn, TDes8& aOut)
498 EXPORT_C void TokenDataMarshaller::ReadL(const TDesC8& aIn, MCTToken& aToken, RMPointerArray<CCTCertInfo>& aOut)
500 ::CreateL(aIn, aToken, aOut);
503 EXPORT_C void TokenDataMarshaller::ReadL(const TDesC8& aIn, MCTToken& aToken, CCTCertInfo*& aOut)
505 ::CreateL(aIn, aToken, aOut);
508 EXPORT_C void TokenDataMarshaller::ReadL(const TDesC8& aIn, RArray<TCertificateAppInfo>& aOut)
513 EXPORT_C TInt TokenDataMarshaller::Size(const CCertAttributeFilter& aIn)
518 EXPORT_C void TokenDataMarshaller::WriteL(const CCertAttributeFilter& aIn, TDes8& aOut)
523 // Server //////////////////////////////////////////////////////////////////////
525 EXPORT_C TInt TokenDataMarshaller::Size(const RPointerArray<CKeyInfo>& aIn)
530 EXPORT_C void TokenDataMarshaller::ReadL(const TDesC8& aIn, CPBEncryptParms*& aOut)
532 ::CreateL(aIn, aOut);
535 EXPORT_C void TokenDataMarshaller::Write(const RPointerArray<CKeyInfo>& aIn, TDes8& aOut)
540 EXPORT_C void TokenDataMarshaller::ReadL(const TDesC8& aIn, CKeyInfo*& aOut)
542 ::CreateL(aIn, aOut);
546 * Determine the size of an externalized big integer. This assumes that the
547 * size of the buffer returned by TInteger::BufferLC() is the same as the size
548 * of the integer as returned by TInteger::ByteCount(). This is done to avoid
549 * allocating the buffer just so we can tell how big it is.
551 EXPORT_C TInt TokenDataMarshaller::Size(const TInteger& aIn)
553 // This is an overestimate as the length is encoded with a TCardinality
554 return sizeof(TInt32) + aIn.ByteCount();
557 EXPORT_C TInt TokenDataMarshaller::Size(const CDSASignature& aIn)
559 return Size(aIn.R()) + Size(aIn.S());
562 EXPORT_C void TokenDataMarshaller::WriteL(const CDSASignature& aIn, TDes8& aOut)
567 EXPORT_C TInt TokenDataMarshaller::Size(const CRSASignature& aIn)
569 return Size(aIn.S());
572 EXPORT_C void TokenDataMarshaller::WriteL(const CRSASignature& aIn, TDes8& aOut)
577 EXPORT_C void TokenDataMarshaller::ReadL(const TDesC8& aIn, CDHParams*& aOut)
579 ::CreateL(aIn, aOut);
582 EXPORT_C void TokenDataMarshaller::ReadL(const TDesC8& aIn, CDHPublicKey*& aOut)
584 ::CreateL(aIn, aOut);
587 EXPORT_C void TokenDataMarshaller::WriteL(const TInteger& aIn, TDes8& aOut)
592 EXPORT_C void TokenDataMarshaller::ReadL(const TDesC8& aIn, CCertInfo*& aOut)
594 ::CreateL(aIn, aOut);
597 EXPORT_C TInt TokenDataMarshaller::Size(const RPointerArray<CCertInfo>& aIn)
602 EXPORT_C void TokenDataMarshaller::Write(const RPointerArray<CCertInfo>& aIn, TDes8& aOut)
607 EXPORT_C TInt TokenDataMarshaller::Size(const RArray<TCertificateAppInfo>& aIn)
612 EXPORT_C void TokenDataMarshaller::Write(const RArray<TCertificateAppInfo>& aIn, TDes8& aOut)
617 EXPORT_C void TokenDataMarshaller::ReadL(const TDesC8& aIn, CCertAttributeFilter*& aOut)
619 ::CreateL(aIn, aOut);