예제 #1
0
파일: message.cpp 프로젝트: capitalk/fix8
//-------------------------------------------------------------------------------------------------
// copy all fields from this message to 'to' where the field is legal for 'to' and it is not
// already present in 'to'; includes repeating groups;
// if force, copy all fields regardless, replacing any existing, adding any new
unsigned MessageBase::copy_legal(MessageBase *to, bool force) const
{
	unsigned copied(0);
	for (Presence::const_iterator itr(_fp.get_presence().begin()); itr != _fp.get_presence().end(); ++itr)
	{
		if (itr->_field_traits & FieldTrait::present && (force || (to->_fp.has(itr->_fnum) && !to->_fp.get(itr->_fnum))))
		{
			if (itr->_field_traits & FieldTrait::group)
			{
				GroupBase *gb(find_group(itr->_fnum)), *gb1(to->find_group(itr->_fnum));

				for (GroupElement::const_iterator gitr(gb->_msgs.begin()); gitr != gb->_msgs.end(); ++gitr)
				{
					MessageBase *grc(gb1->create_group());
					(*gitr)->copy_legal(grc, force);
					*gb1 += grc;
				}
			}

			BaseField *nf(get_field(itr->_fnum)->copy());
#if defined POPULATE_METADATA
			to->check_set_rlm(nf);
#endif
			Presence::const_iterator fpitr(_fp.get_presence().end());
			if (force && to->_fp.get(itr->_fnum, fpitr, FieldTrait::present))
				delete to->replace(itr->_fnum, fpitr, nf);
			else
				to->add_field(nf);
			++copied;
		}
	}

	return copied;
}
예제 #2
0
파일: Aes.c 프로젝트: Dabil/puNES
void MY_FAST_CALL Aes_SetKey_Enc(UInt32 *w, const Byte *key, unsigned keySize)
{
  unsigned i, wSize;
  wSize = keySize + 28;
  keySize /= 4;
  w[0] = ((UInt32)keySize / 2) + 3;
  w += 4;

  for (i = 0; i < keySize; i++, key += 4)
    w[i] = GetUi32(key);

  for (; i < wSize; i++)
  {
    UInt32 t = w[i - 1];
    unsigned rem = i % keySize;
    if (rem == 0)
      t = Ui32(Sbox[gb1(t)] ^ Rcon[i / keySize], Sbox[gb2(t)], Sbox[gb3(t)], Sbox[gb0(t)]);
    else if (keySize > 6 && rem == 4)
      t = Ui32(Sbox[gb0(t)], Sbox[gb1(t)], Sbox[gb2(t)], Sbox[gb3(t)]);
    w[i] = w[i - keySize] ^ t;
  }
}
예제 #3
0
void Aes_SetKeyEncode(CAes *p, const Byte *key, unsigned keySize)
{
  unsigned i, wSize;
  UInt32 *w;
  keySize /= 4;
  p->numRounds2 = keySize / 2 + 3;

  wSize = (p->numRounds2 * 2 + 1) * 4;
  w = p->rkey;

  for (i = 0; i < keySize; i++, key += 4)
    w[i] = Ui32(key[0], key[1], key[2], key[3]);

  for (; i < wSize; i++)
  {
    UInt32 t = w[i - 1];
    unsigned rem = i % keySize;
    if (rem == 0)
      t = Ui32(Sbox[gb1(t)] ^ Rcon[i / keySize], Sbox[gb2(t)], Sbox[gb3(t)], Sbox[gb0(t)]);
    else if (keySize > 6 && rem == 4)
      t = Ui32(Sbox[gb0(t)], Sbox[gb1(t)], Sbox[gb2(t)], Sbox[gb3(t)]);
    w[i] = w[i - keySize] ^ t;
  }
}
예제 #4
0
파일: aesalg.cpp 프로젝트: Jerryang/cdec
void CAesAlg::_SetKeyEncode(AesCTX &aes, const Byte *key, unsigned keySize)
{
	unsigned i, wSize;
	UInt32 *w;
	keySize /= 4;
	aes.numRounds2 = keySize / 2 + 3;

	wSize = (aes.numRounds2 * 2 + 1) * 4;
	w = aes.rkey;

	for (i = 0; i < keySize; i++, key += 4)
		w[i] = Ui32(key[0], key[1], key[2], key[3]);

	for (; i < wSize; i++)
	{
		UInt32 t = w[i - 1];
		unsigned rem = i % keySize;
		if (rem == 0)
			t = Ui32(m_Sbox[gb1(t)] ^ m_Rcon[i / keySize], m_Sbox[gb2(t)], m_Sbox[gb3(t)], m_Sbox[gb0(t)]);
		else if (keySize > 6 && rem == 4)
			t = Ui32(m_Sbox[gb0(t)], m_Sbox[gb1(t)], m_Sbox[gb2(t)], m_Sbox[gb3(t)]);
		w[i] = w[i - keySize] ^ t;
	}
}
예제 #5
0
파일: Aes.c 프로젝트: Dabil/puNES
void MY_FAST_CALL Aes_SetKey_Dec(UInt32 *w, const Byte *key, unsigned keySize)
{
  unsigned i, num;
  Aes_SetKey_Enc(w, key, keySize);
  num = keySize + 20;
  w += 8;
  for (i = 0; i < num; i++)
  {
    UInt32 r = w[i];
    w[i] =
      D[        Sbox[gb0(r)]] ^
      D[0x100 + Sbox[gb1(r)]] ^
      D[0x200 + Sbox[gb2(r)]] ^
      D[0x300 + Sbox[gb3(r)]];
  }
}
예제 #6
0
void Aes_SetKeyDecode(CAes *p, const Byte *key, unsigned keySize)
{
  unsigned i, num;
  UInt32 *w;
  Aes_SetKeyEncode(p, key, keySize);
  num = p->numRounds2 * 8 - 4;
  w = p->rkey + 4;
  for (i = 0; i < num; i++)
  {
    UInt32 r = w[i];
    w[i] =
      D[        Sbox[gb0(r)]] ^
      D[0x100 + Sbox[gb1(r)]] ^
      D[0x200 + Sbox[gb2(r)]] ^
      D[0x300 + Sbox[gb3(r)]];
  }
}
예제 #7
0
파일: aesalg.cpp 프로젝트: Jerryang/cdec
void CAesAlg::_SetKeyDecode(const Byte *key, unsigned keySize)
{
	unsigned i, num;
	UInt32 *w;
	_SetKeyEncode(m_AesDecodeCTX, key, keySize);
	num = m_AesDecodeCTX.numRounds2 * 8 - 4;
	w = m_AesDecodeCTX.rkey + 4;
	for (i = 0; i < num; i++)
	{
		UInt32 r = w[i];
		w[i] =
			m_D[        m_Sbox[gb0(r)]] ^
			m_D[0x100 + m_Sbox[gb1(r)]] ^
			m_D[0x200 + m_Sbox[gb2(r)]] ^
			m_D[0x300 + m_Sbox[gb3(r)]];
	}
}