summaryrefslogtreecommitdiff
path: root/src/AS_DCP_AES.cpp
diff options
context:
space:
mode:
authormsheby <msheby@cinecert.com>2007-10-25 18:44:45 +0000
committermsheby <>2007-10-25 18:44:45 +0000
commitdeadc1bf01e8bc68905c7d33578ffb77b8317c8f (patch)
treee23733b29ffed1a996599c00a3c74490dcff3a3d /src/AS_DCP_AES.cpp
parentc5e3e4e83032b790c62bd55795a20dd912010c9f (diff)
Win32 portability fixes
Diffstat (limited to 'src/AS_DCP_AES.cpp')
-rwxr-xr-xsrc/AS_DCP_AES.cpp57
1 files changed, 43 insertions, 14 deletions
diff --git a/src/AS_DCP_AES.cpp b/src/AS_DCP_AES.cpp
index 1146bb7..84229d5 100755
--- a/src/AS_DCP_AES.cpp
+++ b/src/AS_DCP_AES.cpp
@@ -239,6 +239,7 @@ ASDCP::AESDecContext::DecryptBlock(const byte_t* ct_buf, byte_t* pt_buf, ui32_t
//------------------------------------------------------------------------------------------
+static const ui32_t B_len = 64; // rfc 2104, Sec. 2
static byte_t ipad[KeyLen] = { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 };
@@ -249,12 +250,13 @@ static byte_t opad[KeyLen] = { 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
class HMACContext::h__HMACContext
{
SHA_CTX m_SHA;
- byte_t m_key[KeyLen];
+ byte_t m_key[KeyLen];
ASDCP_NO_COPY_CONSTRUCT(h__HMACContext);
public:
- byte_t sha_value[HMAC_SIZE];
- bool m_Final;
+ byte_t m_SHAValue[HMAC_SIZE];
+ LabelSet_t m_SetType;
+ bool m_Final;
h__HMACContext() : m_Final(false) {}
~h__HMACContext() {}
@@ -265,6 +267,7 @@ public:
byte_t rng_buf[SHA_DIGEST_LENGTH*2];
Kumu::Gen_FIPS_186_Value(key, KeyLen, rng_buf, SHA_DIGEST_LENGTH*2);
memcpy(m_key, rng_buf+SHA_DIGEST_LENGTH, KeyLen);
+ m_SetType = LS_MXF_SMPTE;
Reset();
}
@@ -282,24 +285,37 @@ public:
SHA1_Update(&SHA, key_nonce, KeyLen);
SHA1_Final(sha_buf, &SHA);
memcpy(m_key, sha_buf, KeyLen);
-
+ m_SetType = LS_MXF_INTEROP;
Reset();
}
+ //
void
Reset()
{
- byte_t xor_buf[KeyLen];
- memset(sha_value, 0, HMAC_SIZE);
+ byte_t xor_buf[B_len];
+ memset(m_SHAValue, 0, HMAC_SIZE);
m_Final = false;
SHA1_Init(&m_SHA);
// H(K XOR opad, H(K XOR ipad, text))
// ^^^^^^^^^^
- for ( ui32_t i = 0; i < KeyLen; i++ )
+ ui32_t i = 0;
+
+ for ( ; i < KeyLen; i++ )
xor_buf[i] = m_key[i] ^ ipad[i];
- SHA1_Update(&m_SHA, xor_buf, KeyLen);
+ if ( m_SetType == LS_MXF_SMPTE )
+ {
+ for ( ; i < B_len; i++ )
+ xor_buf[i] = 0 ^ ipad[0];
+
+ SHA1_Update(&m_SHA, xor_buf, B_len);
+ }
+ else
+ {
+ SHA1_Update(&m_SHA, xor_buf, KeyLen);
+ }
}
//
@@ -317,20 +333,33 @@ public:
{
// H(K XOR opad, H(K XOR ipad, text))
// ^^^^^^^^^^^^^^^
- SHA1_Final(sha_value, &m_SHA);
+ SHA1_Final(m_SHAValue, &m_SHA);
SHA_CTX SHA;
SHA1_Init(&SHA);
byte_t xor_buf[KeyLen];
+ ui32_t i = 0;
- for ( ui32_t i = 0; i < KeyLen; i++ )
+ for ( ; i < KeyLen; i++ )
xor_buf[i] = m_key[i] ^ opad[i];
+ if ( m_SetType == LS_MXF_SMPTE )
+ {
+ for ( ; i < B_len; i++ )
+ xor_buf[i] = 0 ^ opad[0];
+
+ SHA1_Update(&m_SHA, xor_buf, B_len);
+ }
+ else
+ {
+ SHA1_Update(&m_SHA, xor_buf, KeyLen);
+ }
+
SHA1_Update(&SHA, xor_buf, KeyLen);
- SHA1_Update(&SHA, sha_value, HMAC_SIZE);
+ SHA1_Update(&SHA, m_SHAValue, HMAC_SIZE);
- SHA1_Final(sha_value, &SHA);
+ SHA1_Final(m_SHAValue, &SHA);
m_Final = true;
}
};
@@ -410,7 +439,7 @@ HMACContext::GetHMACValue(byte_t* buf) const
if ( m_Context.empty() || ! m_Context->m_Final )
return RESULT_INIT;
- memcpy(buf, m_Context->sha_value, HMAC_SIZE);
+ memcpy(buf, m_Context->m_SHAValue, HMAC_SIZE);
return RESULT_OK;
}
@@ -424,7 +453,7 @@ HMACContext::TestHMACValue(const byte_t* buf) const
if ( m_Context.empty() || ! m_Context->m_Final )
return RESULT_INIT;
- return ( memcmp(buf, m_Context->sha_value, HMAC_SIZE) == 0 ) ? RESULT_OK : RESULT_HMACFAIL;
+ return ( memcmp(buf, m_Context->m_SHAValue, HMAC_SIZE) == 0 ) ? RESULT_OK : RESULT_HMACFAIL;
}