blob: 1bb46a31bb7f91d915102d7e20fa235751d08791 [file] [log] [blame]
// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:collection/collection.dart';
import 'package:convert/convert.dart';
/// A message digest as computed by a `Hash` or `HMAC` function.
class Digest {
/// The message digest as an array of bytes.
final List<int> bytes;
Digest(this.bytes);
/// Returns whether this is equal to another digest.
///
/// This should be used instead of manual comparisons to avoid leaking
/// information via timing.
@override
bool operator ==(Object other) {
if (other is Digest) {
final a = bytes;
final b = other.bytes;
final n = a.length;
if (n != b.length) {
return false;
}
var mismatch = 0;
for (var i = 0; i < n; i++) {
mismatch |= a[i] ^ b[i];
}
return mismatch == 0;
}
return false;
}
@override
int get hashCode => const ListEquality().hash(bytes);
/// The message digest as a string of hexadecimal digits.
@override
String toString() => hex.encode(bytes);
}