diff options
author | Patrick Venture <venture@google.com> | 2018-09-12 08:53:29 -0700 |
---|---|---|
committer | Patrick Venture <venture@google.com> | 2018-09-15 13:11:30 -0700 |
commit | ef3aeadc9be37c47d0627e576e81a74a5bb9e94f (patch) | |
tree | 95c183977468b107bdd3faaaa988b5d853be2f00 /crc.cpp | |
parent | baa73da1abaaf05ea1133319405fb2b891825618 (diff) | |
download | phosphor-ipmi-blobs-ef3aeadc9be37c47d0627e576e81a74a5bb9e94f.tar.gz phosphor-ipmi-blobs-ef3aeadc9be37c47d0627e576e81a74a5bb9e94f.zip |
initial drop of phosphor-ipmi-blobs
This implements a majority of the OEM IPMI BLOBS protocol. The only
piece missing from this is the timed expiration of sessions.
Change-Id: I82c9d17b625c94fc3340edcfabbbf1ffeb5ad7ac
Signed-off-by: Patrick Venture <venture@google.com>
Diffstat (limited to 'crc.cpp')
-rw-r--r-- | crc.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
@@ -0,0 +1,66 @@ +/* + * Copyright 2018 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "crc.hpp" + +namespace blobs +{ + +void Crc16::clear() +{ + value = crc16Initial; +} + +// Origin: security/crypta/ipmi/portable/ipmi_utils.c +void Crc16::compute(const uint8_t* bytes, uint32_t length) +{ + if (!bytes) + { + return; + } + + const int kExtraRounds = 2; + const uint16_t kLeftBit = 0x8000; + uint16_t crc = value; + size_t i, j; + + for (i = 0; i < length + kExtraRounds; ++i) + { + for (j = 0; j < 8; ++j) + { + bool xor_flag = crc & kLeftBit; + crc <<= 1; + // If this isn't an extra round and the current byte's j'th bit + // from the left is set, increment the CRC. + if (i < length && bytes[i] & (1 << (7 - j))) + { + crc++; + } + if (xor_flag) + { + crc ^= crc16Ccitt; + } + } + } + + value = crc; +} + +uint16_t Crc16::get() const +{ + return value; +} +} // namespace blobs |