summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/KM_util.cpp23
-rwxr-xr-xsrc/KM_util.h4
-rwxr-xr-xsrc/h__Writer.cpp40
3 files changed, 49 insertions, 18 deletions
diff --git a/src/KM_util.cpp b/src/KM_util.cpp
index b155362..b5dfce6 100755
--- a/src/KM_util.cpp
+++ b/src/KM_util.cpp
@@ -539,9 +539,6 @@ Kumu::GenRandomValue(SymmetricKey& Key)
//------------------------------------------------------------------------------------------
// read a ber value from the buffer and compare with test value.
// Advances buffer to first character after BER value.
-
-// read a ber value from the buffer and compare with test value.
-// Advances buffer to first character after BER value.
//
bool
Kumu::read_test_BER(byte_t **buf, ui64_t test_value)
@@ -605,6 +602,20 @@ static const ui64_t ber_masks[9] =
0
};
+//
+ui32_t
+Kumu::get_BER_length_for_value(ui64_t val)
+{
+ for ( ui32_t i = 0; i < 9; i++ )
+ {
+ if ( ( val & ber_masks[i] ) == 0 )
+ return i + 1;
+ }
+
+ ui64Printer tmp_i(val);
+ DefaultLogSink().Error("BER integer encoding not supported for large value %s\n", tmp_i.c_str());
+ return 0;
+}
//
bool
@@ -626,14 +637,14 @@ Kumu::write_BER(byte_t* buf, ui64_t val, ui32_t ber_len)
{ // sanity check BER length
if ( ber_len > 9 )
{
- DefaultLogSink().Error("BER size %u exceeds maximum size of 9\n", ber_len);
+ DefaultLogSink().Error("BER integer length %u exceeds maximum size of 9\n", ber_len);
return false;
}
- if ( val & ber_masks[ber_len - 1] )
+ if ( ( val & ber_masks[ber_len - 1] ) != 0 )
{
ui64Printer tmp_i(val);
- DefaultLogSink().Error("BER size %u too small for value %s\n", tmp_i.c_str());
+ DefaultLogSink().Error("BER integer length %u too small for value %s\n", ber_len, tmp_i.c_str());
return false;
}
}
diff --git a/src/KM_util.h b/src/KM_util.h
index 0f2af46..7ca30e0 100755
--- a/src/KM_util.h
+++ b/src/KM_util.h
@@ -154,6 +154,10 @@ namespace Kumu
return (*buf & 0x0f) + 1;
}
+ // Return the BER length required to encode value. A return value of zero
+ // indicates a value too large for this library.
+ ui32_t get_BER_length_for_value(ui64_t valuse);
+
// read a BER value
bool read_BER(const byte_t* buf, ui64_t* val);
diff --git a/src/h__Writer.cpp b/src/h__Writer.cpp
index 69873b6..64d6faa 100755
--- a/src/h__Writer.cpp
+++ b/src/h__Writer.cpp
@@ -527,24 +527,40 @@ ASDCP::h__Writer::WriteEKLVPacket(const ASDCP::FrameBuffer& FrameBuf, const byte
// construct encrypted triplet header
ui32_t ETLength = klv_cryptinfo_size + m_CtFrameBuf.Size();
+ ui32_t BER_length = MXF_BER_LENGTH;
if ( m_Info.UsesHMAC )
ETLength += klv_intpack_size;
else
ETLength += (MXF_BER_LENGTH * 3); // for empty intpack
- Overhead.WriteBER(ETLength, MXF_BER_LENGTH); // write encrypted triplet length
- Overhead.WriteBER(UUIDlen, MXF_BER_LENGTH); // write ContextID length
- Overhead.WriteRaw(m_Info.ContextID, UUIDlen); // write ContextID
- Overhead.WriteBER(sizeof(ui64_t), MXF_BER_LENGTH); // write PlaintextOffset length
- Overhead.WriteUi64BE(FrameBuf.PlaintextOffset()); // write PlaintextOffset
- Overhead.WriteBER(SMPTE_UL_LENGTH, MXF_BER_LENGTH); // write essence UL length
- Overhead.WriteRaw((byte_t*)EssenceUL, SMPTE_UL_LENGTH); // write the essence UL
- Overhead.WriteBER(sizeof(ui64_t), MXF_BER_LENGTH); // write SourceLength length
- Overhead.WriteUi64BE(FrameBuf.Size()); // write SourceLength
- Overhead.WriteBER(m_CtFrameBuf.Size(), MXF_BER_LENGTH); // write ESV length
-
- result = m_File.Writev(Overhead.Data(), Overhead.Length());
+ if ( ETLength > 0x00ffffff ) // Need BER integer longer than MXF_BER_LENGTH bytes
+ {
+ BER_length = Kumu::get_BER_length_for_value(ETLength);
+
+ if ( BER_length == 0 )
+ result = RESULT_KLV_CODING;
+ }
+
+ if ( ASDCP_SUCCESS(result) )
+ {
+ if ( ! ( Overhead.WriteBER(ETLength, BER_length) // write encrypted triplet length
+ && Overhead.WriteBER(UUIDlen, MXF_BER_LENGTH) // write ContextID length
+ && Overhead.WriteRaw(m_Info.ContextID, UUIDlen) // write ContextID
+ && Overhead.WriteBER(sizeof(ui64_t), MXF_BER_LENGTH) // write PlaintextOffset length
+ && Overhead.WriteUi64BE(FrameBuf.PlaintextOffset()) // write PlaintextOffset
+ && Overhead.WriteBER(SMPTE_UL_LENGTH, MXF_BER_LENGTH) // write essence UL length
+ && Overhead.WriteRaw((byte_t*)EssenceUL, SMPTE_UL_LENGTH) // write the essence UL
+ && Overhead.WriteBER(sizeof(ui64_t), MXF_BER_LENGTH) // write SourceLength length
+ && Overhead.WriteUi64BE(FrameBuf.Size()) // write SourceLength
+ && Overhead.WriteBER(m_CtFrameBuf.Size(), BER_length) ) ) // write ESV length
+ {
+ result = RESULT_KLV_CODING;
+ }
+ }
+
+ if ( ASDCP_SUCCESS(result) )
+ result = m_File.Writev(Overhead.Data(), Overhead.Length());
}
if ( ASDCP_SUCCESS(result) )