BellServer::BellServer(uint32 keyMaster, uint32 *keyVersions, uint8 keyMax) { keyMaster_ = keyMaster; keyVersions_ = keyVersions; keyMax_ = keyMax; printf("BellServer with master key: %08X\n", keyMaster); // Build all keys for all clients for(uint8 i = 0; i < keyMax_; i++) { uint32 clientKey = indexToKey(i); uint32 clientIndex = keyToIndex(clientKey, i); printf("Client %i (version: %i) with key %08X, decrypted key: %i\n", i, getKeyVersion(i), clientKey, clientIndex); if(clientIndex != i) { printf("There is an error in the key algorithm, EXIT!"); exit(1); } // Add it to the list clientBells_[clientKey][0] = NULL; } }
bool DESFireKey::operator==(const DESFireKey& key) const { if (!Key::operator==(key)) { return false; } if (isEmpty() && key.isEmpty()) { return true; } if (getLength() != key.getLength() || isEmpty() || key.isEmpty()) { return false; } return (getKeyVersion() == key.getKeyVersion() && getKeyType() == key.getKeyType()); }
uint32 BellServer::keyToIndex(uint32 key, uint8 index) { return ((key ^ getKeyVersion(index)) ^ keyMaster_) >> (32 - keyMax_); }
uint32 BellServer::indexToKey(uint8 index) { return (((index << (32 - keyMax_)) ^ keyMaster_) ^ getKeyVersion(index)); }