1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     util_Crc.cpp
4 
5   Copyright (C)2009 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev: 31343 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_UTIL_UTIL_CRC_H_
17 #define NN_UTIL_UTIL_CRC_H_
18 
19 #include <nn/types.h>
20 
21 #ifdef __cplusplus
22 
23 namespace nn { namespace util {
24 
25 const size_t CRC_TABLE_SIZE = 256;
26 
27 //----------------------------------------------------------------------------
28 // CRC-8
29 //----------------------------------------------------------------------------
30 
31 //! @brief    CRC-8 を計算するためのクラスです。
32 class Crc8 {
33 
34 public:
35 
36     //! @brief  デフォルトコンストラクタです。
37     Crc8();
38 
39     /*!
40         @brief CRC-8 ハッシュ計算を行うためのコンテキストを初期化します。
41         @param[in]    context    コンテキストの初期値。通常はデフォルト値を使います。
42      */
43     void InitializeContext(u8 context = CRC8_STANDARD_INIT);
44 
45     //! @brief CRC-8 ハッシュ値を入力データで更新します。
46     //! @param[in]    input    入力データへのポインタ
47     //! @param[in]    length   入力データのサイズ
48     void Update(const void* input, size_t length);
49 
50     //! @brief 最終的な CRC-8 ハッシュ計算結果を取得します。
51     //! @return 計算結果
52     u8 GetHash();
53 
54     /*!
55         @brief
56 
57         CRC-8 を計算するための一連の関数呼び出しをまとめて行い、計算結果を取得します。
58 
59         @param[in]    input   入力データへのポインタ
60         @param[in]    length  入力データのサイズ
61         @param[in]    context    コンテキストの初期値。通常はデフォルト値を使います。
62 
63         @return 計算結果
64      */
65     static u8 Calculate(const void* input, size_t length, u8 context = CRC8_STANDARD_INIT);
66 
67 private:
68     //! @brief 生成多項式です。
69     static const u8 CRC8_STANDARD_POLY = 0x07;
70 
71     //! @brief コンテキストの初期値です。
72     static const u8 CRC8_STANDARD_INIT = 0;
73 
74     //! @brief ハッシュ計算を行うためのコンテキスト構造体です。
75     typedef u8 Context;
76 
77     //! @brief ハッシュ計算を行うためのテーブルの構造体です。
78     struct Table
79     {
80         u8      table[CRC_TABLE_SIZE];
81     };
82 
83     //! @brief ハッシュ計算を行うためのコンテキストです。
84     Context m_Context;
85 
86     //! @brief ハッシュ計算を行うためのテーブルです。
87     Table   m_Table;
88 
89     //! @brief ハッシュ計算を行うためのテーブルを初期化します。
90     //! @param[in]    poly    テーブルを初期化するための生成多項式
91     void InitializeTable(u8 poly);
92 
93 };
94 
95 //----------------------------------------------------------------------------
96 // CRC-16
97 //----------------------------------------------------------------------------
98 
99 //! @brief    CRC-16 を計算するためのクラスです。
100 class Crc16 {
101 
102 public:
103     //! @brief  デフォルトコンストラクタです。
104     Crc16();
105 
106     //! @brief CRC-16 ハッシュ計算を行うためのコンテキストを初期化します。
107     //! @param[in]    context    コンテキストの初期値。通常はデフォルト値を使います。
108     void InitializeContext(u16 context = CRC16_STANDARD_INIT);
109 
110     //! @brief CRC-16 ハッシュ値を入力データで更新します。
111     //! @param[in]    input    入力データへのポインタ
112     //! @param[in]    length   入力データのサイズ
113     void Update(const void* input, size_t length);
114 
115     //! @brief 最終的な CRC-16 ハッシュ計算結果を取得します。
116     //! @return 計算結果
117     u16 GetHash();
118 
119     /*!
120         @brief
121 
122         CRC-16 を計算するための一連の関数呼び出しをまとめて行い、計算結果を取得します。
123 
124         @param[in]    input   入力データへのポインタ
125         @param[in]    length  入力データのサイズ
126         @param[in]    context    コンテキストの初期値。通常はデフォルト値を使います。
127 
128         @return 計算結果
129      */
130     static u16 Calculate(const void* input, size_t length, u16 context = CRC16_STANDARD_INIT);
131 
132 private:
133     //! @brief 生成多項式です。
134     static const u16 CRC16_STANDARD_POLY = 0xa001;      // ビット反転するものは生成多項式も反転
135 
136     //! @brief コンテキストの初期値です。
137     static const u16 CRC16_STANDARD_INIT = 0;
138 
139     //! @brief ハッシュ計算を行うためのコンテキスト構造体です。
140     typedef u16 Context;
141 
142     //! @brief ハッシュ計算を行うためのテーブルの構造体です。
143     struct Table
144     {
145         u16      table[CRC_TABLE_SIZE];
146     };
147 
148     //! @brief ハッシュ計算を行うためのコンテキストです。
149     Context m_Context;
150 
151     //! @brief ハッシュ計算を行うためのテーブルです。
152     Table   m_Table;
153 
154     //! @brief ハッシュ計算を行うためのテーブルを初期化します。
155     //! @param[in]    poly    テーブルを初期化するための生成多項式
156     void InitializeTable(u16 poly);
157 
158 };
159 
160 //----------------------------------------------------------------------------
161 // CRC-16/CCITT
162 //----------------------------------------------------------------------------
163 
164 //! @brief    CRC-16/CCITT を計算するためのクラスです。
165 class Crc16Ccitt {
166 
167 public:
168 
169     //! @brief  デフォルトコンストラクタです。
170     Crc16Ccitt();
171 
172     //! @brief CRC-16/CCITT ハッシュ計算を行うためのコンテキストを初期化します。
173     //! @param[in]    context    コンテキストの初期値。通常はデフォルト値を使います。
174     void InitializeContext(u16 context = CRC16_CCITT_INIT);
175 
176     //! @brief CRC-16/CCITT ハッシュ値を入力データで更新します。
177     //! @param[in]    input    入力データへのポインタ
178     //! @param[in]    length   入力データのサイズ
179     void Update(const void* input, size_t length);
180 
181     //! @brief 最終的な CRC-16/CCITT ハッシュ計算結果を取得します。
182     //! @return 計算結果
183     u16 GetHash();
184 
185     /*!
186         @brief
187 
188         CRC-16/CCITT を計算するための一連の関数呼び出しをまとめて行い、計算結果を取得します。
189 
190         @param[in]    input   入力データへのポインタ
191         @param[in]    length  入力データのサイズ
192         @param[in]    context    コンテキストの初期値。通常はデフォルト値を使います。
193 
194         @return 計算結果
195      */
196     static u16 Calculate(const void* input, size_t length, u16 context = CRC16_CCITT_INIT);
197 
198 private:
199     //! @brief 生成多項式です。
200     static const u16 CRC16_CCITT_POLY = 0x1021;
201 
202     //! @brief コンテキストの初期値です。
203     static const u16 CRC16_CCITT_INIT = 0xffff;
204 
205     //! @brief ハッシュ計算を行うためのコンテキスト構造体です。
206     typedef u16 Context;
207 
208     //! @brief ハッシュ計算を行うためのテーブルの構造体です。
209     struct Table
210     {
211         u16      table[CRC_TABLE_SIZE];
212     };
213 
214     //! @brief ハッシュ計算を行うためのコンテキストです。
215     Context m_Context;
216 
217     //! @brief ハッシュ計算を行うためのテーブルです。
218     Table   m_Table;
219 
220 
221     //! @brief ハッシュ計算を行うためのテーブルを初期化します。
222     //! @param[in]    poly    テーブルを初期化するための生成多項式
223     void InitializeTable(u16 poly);
224 
225 };
226 
227 //----------------------------------------------------------------------------
228 // CRC-32
229 //----------------------------------------------------------------------------
230 
231 //! @brief    CRC-32 を計算するためのクラスです。
232 class Crc32 {
233 
234 public:
235 
236     //! @brief  デフォルトコンストラクタです。
237     Crc32();
238 
239     //! @brief CRC-32 ハッシュ計算を行うためのコンテキストを初期化します。
240     //! @param[in]    context    コンテキストの初期値。通常はデフォルト値を使います。
241     void InitializeContext(u32 context = CRC32_STANDARD_INIT);
242 
243     //! @brief CRC-32 ハッシュ値を入力データで更新します。
244     //! @param[in]    input    入力データへのポインタ
245     //! @param[in]    length   入力データのサイズ
246     void Update(const void* input, size_t length);
247 
248     //! @brief 最終的な CRC-32 ハッシュ計算結果を取得します。
249     //! @return 計算結果
250     u32 GetHash();
251 
252     /*!
253         @brief
254 
255         CRC-32 を計算するための一連の関数呼び出しをまとめて行い、計算結果を取得します。
256 
257         @param[in]    input   入力データへのポインタ
258         @param[in]    length  入力データのサイズ
259         @param[in]    context    コンテキストの初期値。通常はデフォルト値を使います。
260 
261         @return 計算結果
262      */
263     static u32 Calculate(const void* input, size_t length, u32 context = CRC32_STANDARD_INIT);
264 
265 private:
266     //! @brief 生成多項式です。
267     static const u32 CRC32_STANDARD_POLY = 0xedb88320;  // ビット反転するものは生成多項式も反転
268 
269     //! @brief コンテキストの初期値です。
270     static const u32 CRC32_STANDARD_INIT = 0xffffffff;
271 
272     //! @brief ハッシュ計算を行うためのコンテキスト構造体です。
273     typedef u32 Context;
274 
275     //! @brief ハッシュ計算を行うためのテーブルの構造体です。
276     struct Table
277     {
278         u32      table[CRC_TABLE_SIZE];
279     };
280 
281     //! @brief ハッシュ計算を行うためのコンテキストです。
282     Context m_Context;
283 
284     //! @brief ハッシュ計算を行うためのテーブルです。
285     Table   m_Table;
286 
287 
288     //! @brief ハッシュ計算を行うためのテーブルを初期化します。
289     //! @param[in]    poly    テーブルを初期化するための生成多項式
290     void InitializeTable(u32 poly);
291 
292 };
293 
294 //----------------------------------------------------------------------------
295 // CRC-32/POSIX
296 //----------------------------------------------------------------------------
297 
298 //! @brief    CRC-32/POSIX を計算するためのクラスです。
299 class Crc32Posix {
300 
301 public:
302 
303     //! @brief  デフォルトコンストラクタです。
304     Crc32Posix();
305 
306     //! @brief CRC-32/POSIX ハッシュ計算を行うためのコンテキストを初期化します。
307     //! @param[in]    context    コンテキストの初期値。通常はデフォルト値を使います。
308     void InitializeContext(u32 context = CRC32_POSIX_INIT);
309 
310     //! @brief CRC-32/POSIX ハッシュ値を入力データで更新します。
311     //! @param[in]    input    入力データへのポインタ
312     //! @param[in]    length   入力データのサイズ
313     void Update(const void* input, size_t length);
314 
315     //! @brief 最終的な CRC-32/POSIX ハッシュ計算結果を取得します。
316     //! @return 計算結果
317     u32 GetHash();
318 
319     /*!
320         @brief
321 
322         CRC-32/POSIX を計算するための一連の関数呼び出しをまとめて行い、計算結果を取得します。
323 
324         @param[in]    input   入力データへのポインタ
325         @param[in]    length  入力データのサイズ
326         @param[in]    context    コンテキストの初期値。通常はデフォルト値を使います。
327 
328         @return 計算結果
329      */
330     static u32 Calculate(const void* input, size_t length, u32 context = CRC32_POSIX_INIT);
331 
332 private:
333     //! @brief 生成多項式です。
334     static const u32 CRC32_POSIX_POLY = 0x04c11db7;
335 
336     //! @brief コンテキストの初期値です。
337     static const u32 CRC32_POSIX_INIT = 0;
338 
339     //! @brief ハッシュ計算を行うためのコンテキスト構造体です。
340     typedef u32 Context;
341 
342     //! @brief ハッシュ計算を行うためのテーブルの構造体です。
343     struct Table
344     {
345         u32      table[CRC_TABLE_SIZE];
346     };
347 
348     //! @brief ハッシュ計算を行うためのコンテキストです。
349     Context m_Context;
350 
351     //! @brief ハッシュ計算を行うためのテーブルです。
352     Table   m_Table;
353 
354 
355     //! @brief ハッシュ計算を行うためのテーブルを初期化します。
356     //! @param[in]    poly    テーブルを初期化するための生成多項式
357     void InitializeTable(u32 poly);
358 
359 };
360 
361 }}
362 
363 #endif // __cplusplus
364 
365 #endif // ifndef NN_UTIL_UTIL_CRC_H_
366