hmac pad fix
[asdcplib.git] / src / KLV.cpp
index 0e7d783989fa12d4bade3eaf4fc0c463b687586d..a91d32bf9bb900630fcb1730f2b0af94fadad79a 100755 (executable)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2005-2006, John Hurst
+Copyright (c) 2005-2009, John Hurst
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -45,13 +45,12 @@ const ui32_t tmp_read_size = 32;
 
 // 
 ASDCP::Result_t
-ASDCP::KLVPacket::InitFromBuffer(const byte_t* buf, ui32_t buf_len, const byte_t* label)
+ASDCP::KLVPacket::InitFromBuffer(const byte_t* buf, ui32_t buf_len, const UL& label)
 {
   Result_t result = KLVPacket::InitFromBuffer(buf, buf_len);
 
   if ( ASDCP_SUCCESS(result) )
-    result = ( memcmp(m_KeyStart, label, SMPTE_UL_LENGTH) == 0 ) ?
-      RESULT_OK : RESULT_FAIL;
+    result = ( UL(m_KeyStart) == label ) ? RESULT_OK : RESULT_FAIL;
 
   return result;
 }
@@ -88,7 +87,8 @@ ASDCP::KLVPacket::InitFromBuffer(const byte_t* buf, ui32_t buf_len)
   if ( ! Kumu::read_BER(buf + SMPTE_UL_LENGTH, &tmp_size) )
        return RESULT_FAIL;
 
-  m_ValueLength = tmp_size;
+  assert (tmp_size <= 0xFFFFFFFFL);
+  m_ValueLength = (ui32_t) tmp_size;
   m_KLLength = SMPTE_UL_LENGTH + Kumu::BER_length(buf + SMPTE_UL_LENGTH);
   m_KeyStart = buf;
   m_ValueStart = buf + m_KLLength;
@@ -107,7 +107,7 @@ ASDCP::KLVPacket::HasUL(const byte_t* ul)
 
 //
 ASDCP::Result_t
-ASDCP::KLVPacket::WriteKLToBuffer(ASDCP::FrameBuffer& Buffer, const byte_t* label, ui32_t length)
+ASDCP::KLVPacket::WriteKLToBuffer(ASDCP::FrameBuffer& Buffer, const UL& label, ui32_t length)
 {
   if ( Buffer.Size() + kl_length > Buffer.Capacity() )
     {
@@ -115,7 +115,7 @@ ASDCP::KLVPacket::WriteKLToBuffer(ASDCP::FrameBuffer& Buffer, const byte_t* labe
       return RESULT_FAIL;
     }
   
-  memcpy(Buffer.Data() + Buffer.Size(), label, SMPTE_UL_LENGTH);
+  memcpy(Buffer.Data() + Buffer.Size(), label.Value(), label.Size());
 
   if ( ! Kumu::write_BER(Buffer.Data() + Buffer.Size() + SMPTE_UL_LENGTH, length, MXF_BER_LENGTH) )
     return RESULT_FAIL;
@@ -126,7 +126,7 @@ ASDCP::KLVPacket::WriteKLToBuffer(ASDCP::FrameBuffer& Buffer, const byte_t* labe
 
 //
 void
-ASDCP::KLVPacket::Dump(FILE* stream, bool show_hex)
+ASDCP::KLVPacket::Dump(FILE* stream, const Dictionary& Dict, bool show_value)
 {
   if ( stream == 0 )
     stream = stderr;
@@ -134,15 +134,15 @@ ASDCP::KLVPacket::Dump(FILE* stream, bool show_hex)
   if ( m_KeyStart != 0 )
     {
       assert(m_ValueStart);
+      UL TmpUL(m_KeyStart);
+      char buf[64];
+      fprintf(stream, "%s", TmpUL.EncodeString(buf, 64));
 
-      for ( ui32_t i = 0; i < SMPTE_UL_LENGTH; i++ )
-       fprintf(stream, "%02x.", m_KeyStart[i]);
+      const MDDEntry* Entry = Dict.FindUL(m_KeyStart);
+      fprintf(stream, "  len: %7u (%s)\n", m_ValueLength, (Entry ? Entry->name : "Unknown"));
 
-      const MDDEntry* Entry = Dict::FindUL(m_KeyStart);
-      fprintf(stream, "\b  len: %7u (%s)\n", m_ValueLength, (Entry ? Entry->name : "Unknown"));
-
-      if ( show_hex && m_ValueLength < 1000 )
-       Kumu::hexdump(m_ValueStart, Kumu::xmin(m_ValueLength, (ui32_t)64), stream);
+      if ( show_value && m_ValueLength < 1000 )
+       Kumu::hexdump(m_ValueStart, Kumu::xmin(m_ValueLength, (ui32_t)128), stream);
     }
   else
     {
@@ -152,13 +152,12 @@ ASDCP::KLVPacket::Dump(FILE* stream, bool show_hex)
 
 // 
 ASDCP::Result_t
-ASDCP::KLVFilePacket::InitFromFile(const Kumu::FileReader& Reader, const byte_t* label)
+ASDCP::KLVFilePacket::InitFromFile(const Kumu::FileReader& Reader, const UL& label)
 {
   Result_t result = KLVFilePacket::InitFromFile(Reader);
 
   if ( ASDCP_SUCCESS(result) )
-    result = ( memcmp(m_KeyStart, label, SMPTE_UL_LENGTH) == 0 ) ?
-      RESULT_OK : RESULT_FAIL;
+    result = ( UL(m_KeyStart) == label ) ? RESULT_OK : RESULT_FAIL;
 
   return result;
 }
@@ -208,7 +207,8 @@ ASDCP::KLVFilePacket::InitFromFile(const Kumu::FileReader& Reader)
   ui32_t remainder = 0;
   ui32_t ber_len = Kumu::BER_length(tmp_data + SMPTE_UL_LENGTH);
   m_KLLength = SMPTE_UL_LENGTH + ber_len;
-  m_ValueLength = tmp_size;
+  assert(tmp_size <= 0xFFFFFFFFL);
+  m_ValueLength = (ui32_t) tmp_size;
   ui32_t packet_length = m_ValueLength + m_KLLength;
 
   result = m_Buffer.Capacity(packet_length);
@@ -264,10 +264,10 @@ ASDCP::KLVFilePacket::InitFromFile(const Kumu::FileReader& Reader)
 
 //
 ASDCP::Result_t
-ASDCP::KLVFilePacket::WriteKLToFile(Kumu::FileWriter& Writer, const byte_t* label, ui32_t length)
+ASDCP::KLVFilePacket::WriteKLToFile(Kumu::FileWriter& Writer, const UL& label, ui32_t length)
 {
   byte_t buffer[kl_length];
-  memcpy(buffer, label, SMPTE_UL_LENGTH);
+  memcpy(buffer, label.Value(), label.Size());
 
   if ( ! Kumu::write_BER(buffer+SMPTE_UL_LENGTH, length, MXF_BER_LENGTH) )
     return RESULT_FAIL;