| ... | ... | @@ -840,7 +840,21 @@ fn KTHash( |
| 840 | 840 | /// The block length, or rate, in bytes. |
| 841 | 841 | pub const block_length = Variant.rate; |
| 842 | 842 | |
| 843 | | /// Options for KangarooTwelve can include a customization string for domain separation. |
| 843 | /// Configuration options for KangarooTwelve hashing. |
| 844 | /// |
| 845 | /// Options include an optional customization string that provides domain separation, |
| 846 | /// ensuring that identical inputs with different customization strings |
| 847 | /// produce completely distinct hash outputs. |
| 848 | /// |
| 849 | /// This prevents hash collisions when the same data is hashed in different contexts. |
| 850 | /// |
| 851 | /// Customization strings can be of any length. |
| 852 | /// |
| 853 | /// Common options for customization:: |
| 854 | /// |
| 855 | /// - Key derivation or MAC: 16-byte secret for KT128, 32-byte secret for KT256 |
| 856 | /// - Context Separation: domain-specific strings (e.g., "email", "password", "session") |
| 857 | /// - Composite Keys: concatenation of secret key + context string |
| 844 | 858 | pub const Options = struct { |
| 845 | 859 | customization: ?[]const u8 = null, |
| 846 | 860 | }; |
| ... | ... | @@ -864,7 +878,20 @@ fn KTHash( |
| 864 | 878 | pending_count: usize, // Number of complete chunks in pending_chunks |
| 865 | 879 | |
| 866 | 880 | /// Initialize a KangarooTwelve hashing context. |
| 867 | | /// The customization string is optional and used for domain separation. |
| 881 | /// |
| 882 | /// Options include an optional customization string that provides domain separation, |
| 883 | /// ensuring that identical inputs with different customization strings |
| 884 | /// produce completely distinct hash outputs. |
| 885 | /// |
| 886 | /// This prevents hash collisions when the same data is hashed in different contexts. |
| 887 | /// |
| 888 | /// Customization strings can be of any length. |
| 889 | /// |
| 890 | /// Common options for customization:: |
| 891 | /// |
| 892 | /// - Key derivation or MAC: 16-byte secret for KT128, 32-byte secret for KT256 |
| 893 | /// - Context Separation: domain-specific strings (e.g., "email", "password", "session") |
| 894 | /// - Composite Keys: concatenation of secret key + context string |
| 868 | 895 | pub fn init(options: Options) Self { |
| 869 | 896 | const custom = options.customization orelse &[_]u8{}; |
| 870 | 897 | return .{ |
| ... | ... | @@ -971,7 +998,13 @@ fn KTHash( |
| 971 | 998 | } |
| 972 | 999 | |
| 973 | 1000 | /// Finalize the hash and produce output. |
| 974 | | /// After calling this, the context should not be reused. |
| 1001 | /// |
| 1002 | /// Unlike traditional hash functions, the output can be of any length. |
| 1003 | /// |
| 1004 | /// When using as a regular hash function, use the recommended `digest_length` value (32 bytes for KT128, 64 bytes for KT256). |
| 1005 | /// |
| 1006 | /// After calling this method, the context should not be reused. However, the structure can be cloned before finalizing |
| 1007 | /// to compute multiple hashes with the same prefix. |
| 975 | 1008 | pub fn final(self: *Self, out: []u8) void { |
| 976 | 1009 | const cv_size = Variant.cv_size; |
| 977 | 1010 | |
| ... | ... | @@ -1063,12 +1096,11 @@ fn KTHash( |
| 1063 | 1096 | } |
| 1064 | 1097 | |
| 1065 | 1098 | /// Hash a message using sequential processing with SIMD acceleration. |
| 1066 | | /// Best performance for inputs under 10MB. Never allocates memory. |
| 1067 | 1099 | /// |
| 1068 | 1100 | /// Parameters: |
| 1069 | 1101 | /// - message: Input data to hash (any length) |
| 1070 | | /// - out: Output buffer (any length, arbitrary output sizes supported) |
| 1071 | | /// - options: Optional settings including customization string for domain separation |
| 1102 | /// - out: Output buffer (any length, arbitrary output sizes supported, `digest_length` recommended for standard use) |
| 1103 | /// - options: Optional settings to include a secret key or a context separation string |
| 1072 | 1104 | pub fn hash(message: []const u8, out: []u8, options: Options) !void { |
| 1073 | 1105 | const custom = options.customization orelse &[_]u8{}; |
| 1074 | 1106 | |