diff --git a/src/add-ons/kernel/file_systems/udf/Utils.cpp b/src/add-ons/kernel/file_systems/udf/Utils.cpp index dd0c0a5f8e..6a66b551ae 100644 --- a/src/add-ons/kernel/file_systems/udf/Utils.cpp +++ b/src/add-ons/kernel/file_systems/udf/Utils.cpp @@ -149,5 +149,24 @@ Udf::check_size_error(ssize_t bytesReturned, ssize_t bytesExpected) : (bytesReturned >= 0 ? B_ERROR : status_t(bytesReturned)); } +/*! \brief Calculates the UDF crc checksum for the given byte stream. + + Based on crc code from UDF-2.50 6.5, as permitted. + + \param data Pointer to the byte stream. + \param length Length of the byte stream in bytes. + + \return The crc checksum, or 0 if an error occurred. +*/ +uint16 +Udf::calculate_crc(uint8 *data, uint16 length) +{ + uint16 crc = 0; + for ( ; length > 0; length--, data++) + crc = Udf::kCrcTable[(crc >> 8 ^ *data) & 0xff] ^ (crc << 8); + return crc; +} + + } // namespace Udf diff --git a/src/add-ons/kernel/file_systems/udf/Utils.h b/src/add-ons/kernel/file_systems/udf/Utils.h index 94d37a6946..6e8c00b46b 100644 --- a/src/add-ons/kernel/file_systems/udf/Utils.h +++ b/src/add-ons/kernel/file_systems/udf/Utils.h @@ -36,6 +36,8 @@ const char* bool_to_string(bool value); status_t check_size_error(ssize_t bytesReturned, ssize_t bytesExpected); +uint16 calculate_crc(uint8 *data, uint16 length); + } // namespace Udf #endif // _UDF_UTILS_H