--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/natfw/natfwunsaf_protocols/unsaf_codec/src/natfwunsaffingerprintattribute.cpp Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,209 @@
+/*
+* Copyright (c) 2006-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:
+*
+*/
+
+
+
+
+#include "natfwunsaffingerprintattribute.h"
+#include "natfwunsafmessage.h"
+#include "natfwunsafutils.h"
+#include "natfwunsaflog.h"
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFFingerprintAttribute::DecodeL
+// -----------------------------------------------------------------------------
+//
+CNATFWUNSAFFingerprintAttribute*
+CNATFWUNSAFFingerprintAttribute::DecodeL(const TDesC8& aValue)
+ {
+ CNATFWUNSAFFingerprintAttribute* self =
+ new (ELeave) CNATFWUNSAFFingerprintAttribute();
+ CleanupStack::PushL(self);
+ self->DecodeValueL(aValue);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFFingerprintAttribute::NewL
+// -----------------------------------------------------------------------------
+//
+CNATFWUNSAFFingerprintAttribute*
+CNATFWUNSAFFingerprintAttribute::NewL(CBufBase& aNATFWUNSAFMessage)
+ {
+ CNATFWUNSAFFingerprintAttribute* self =
+ CNATFWUNSAFFingerprintAttribute::NewLC(aNATFWUNSAFMessage);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFFingerprintAttribute::NewLC
+// -----------------------------------------------------------------------------
+//
+CNATFWUNSAFFingerprintAttribute*
+CNATFWUNSAFFingerprintAttribute::NewLC(CBufBase& aNATFWUNSAFMessage)
+ {
+ CNATFWUNSAFFingerprintAttribute* self =
+ new (ELeave) CNATFWUNSAFFingerprintAttribute();
+ CleanupStack::PushL(self);
+ self->ConstructL(aNATFWUNSAFMessage);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFFingerprintAttribute::DecodeAttributeL
+// -----------------------------------------------------------------------------
+//
+CNATFWUNSAFAttribute*
+CNATFWUNSAFFingerprintAttribute::DecodeAttributeL(
+ const TDesC8& aByteStream)
+ {
+ CheckLengthL(aByteStream);
+
+ return DecodeL(aByteStream.Mid(EValueOffset));
+ }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFFingerprintAttribute::CNATFWUNSAFFingerprintAttribute
+// -----------------------------------------------------------------------------
+//
+CNATFWUNSAFFingerprintAttribute::CNATFWUNSAFFingerprintAttribute()
+ {
+
+ }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFFingerprintAttribute::ConstructL
+// Update message header's length field to include the FINGERPRINT before
+// computing the CRC-32.
+// -----------------------------------------------------------------------------
+//
+void CNATFWUNSAFFingerprintAttribute::ConstructL(CBufBase& aNATFWUNSAFMessage)
+ {
+ __ASSERT_ALWAYS(aNATFWUNSAFMessage.Size(), User::Leave(KErrArgument));
+ TInt length = CNATFWUNSAFMessage::MessageLength(aNATFWUNSAFMessage.Ptr(0));
+ CNATFWUNSAFMessage::SetMessageLength(aNATFWUNSAFMessage,
+ length + EValueOffset + EAttributeValueSize);
+
+ ComputeCRC32(aNATFWUNSAFMessage, iCRC);
+ }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFFingerprintAttribute::~CNATFWUNSAFFingerprintAttribute
+// -----------------------------------------------------------------------------
+//
+CNATFWUNSAFFingerprintAttribute::~CNATFWUNSAFFingerprintAttribute()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFFingerprintAttribute::Type
+// -----------------------------------------------------------------------------
+//
+CNATFWUNSAFAttribute::TType CNATFWUNSAFFingerprintAttribute::Type() const
+ {
+ return EFingerprint;
+ }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFFingerprintAttribute::EncodeValueL
+// -----------------------------------------------------------------------------
+//
+HBufC8* CNATFWUNSAFFingerprintAttribute::EncodeValueL() const
+ {
+ HBufC8* encodedValue = HBufC8::NewLC(EAttributeValueSize);
+
+ TPtr8 ptr = encodedValue->Des();
+ ptr.FillZ(EAttributeValueSize);
+
+ TUint32 value(iCRC);
+ NATFWUNSAFUtils::WriteNetworkOrder32L(ptr, 0, value);
+
+ CleanupStack::Pop(encodedValue);
+ return encodedValue;
+ }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFFingerprintAttribute::CheckLengthL
+// This attribute has a fixed length
+// -----------------------------------------------------------------------------
+//
+void CNATFWUNSAFFingerprintAttribute::CheckLengthL(
+ const TDesC8& aByteStream)
+ {
+ __ASSERT_ALWAYS(ParseLengthL(aByteStream) == EAttributeValueSize,
+ User::Leave(KErrCorrupt));
+ }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFFingerprintAttribute::CheckFingerprintL
+// Exclude FINGERPRINT attribute from CRC-32 computing. It is located at the
+// end of the message.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CNATFWUNSAFFingerprintAttribute::CheckFingerprintL(
+ const TDesC8& aNATFWUNSAFMessage) const
+ {
+ TInt KFingerprintSize = static_cast<TInt>(EValueOffset) +
+ static_cast<TInt>(EAttributeValueSize);
+ //Check there is enough data
+ __ASSERT_ALWAYS(aNATFWUNSAFMessage.Length() >= KFingerprintSize,
+ User::Leave(KErrArgument));
+
+ CBufBase* message = CBufFlat::NewL(
+ aNATFWUNSAFMessage.Length() - KFingerprintSize);
+ CleanupStack::PushL(message);
+ message->InsertL(0,
+ aNATFWUNSAFMessage,
+ aNATFWUNSAFMessage.Length() - KFingerprintSize);
+
+ TUint32 crc(0);
+ ComputeCRC32(*message, crc);
+
+ TBool match = (crc == iCRC);
+ NATFWUNSAF_INTLOG("Checking FINGERPRINT, match", match)
+
+ CleanupStack::PopAndDestroy(message);
+ return match;
+ }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFFingerprintAttribute::DecodeValueL
+// -----------------------------------------------------------------------------
+//
+void CNATFWUNSAFFingerprintAttribute::DecodeValueL(const TDesC8& aValue)
+ {
+ __ASSERT_ALWAYS(aValue.Length() == EAttributeValueSize,
+ User::Leave(KErrCorrupt));
+ iCRC = BigEndian::Get32(aValue.Ptr());
+ }
+
+// -----------------------------------------------------------------------------
+// CNATFWUNSAFFingerprintAttribute::ComputeCRC32
+// -----------------------------------------------------------------------------
+//
+void CNATFWUNSAFFingerprintAttribute::ComputeCRC32(
+ CBufBase& aNATFWUNSAFMessage,
+ TUint32& aCRC) const
+ {
+ // Perform the CCITT CRC-32 checksum on the message
+ Mem::Crc32(aCRC, aNATFWUNSAFMessage.Ptr(0).Ptr(),
+ sizeof(aNATFWUNSAFMessage));
+ // XOR according to RFC3489-bis05
+ aCRC ^= EXORedValue;
+ }