| Index: sdk/lib/crypto/hmac.dart
|
| diff --git a/sdk/lib/crypto/hmac.dart b/sdk/lib/crypto/hmac.dart
|
| index 8844704e3f2f3f10e1a22884cdcf23b78f0325fe..2dd3902c27e96865a91ff4a6620a924b3d97b457 100644
|
| --- a/sdk/lib/crypto/hmac.dart
|
| +++ b/sdk/lib/crypto/hmac.dart
|
| @@ -5,25 +5,28 @@
|
| part of dart.crypto;
|
|
|
| class _HMAC implements HMAC {
|
| + bool _isClosed = false;
|
| +
|
| _HMAC(Hash this._hash, List<int> this._key) : _message = [];
|
|
|
| - HMAC update(List<int> data) {
|
| + add(List<int> data) {
|
| + if (_isClosed) throw new StateError("HMAC is closed");
|
| _message.addAll(data);
|
| - return this;
|
| }
|
|
|
| - List<int> digest() {
|
| + List<int> get digest {
|
| var blockSize = _hash.blockSize;
|
|
|
| // Hash the key if it is longer than the block size of the hash.
|
| if (_key.length > blockSize) {
|
| _hash = _hash.newInstance();
|
| - _key = _hash.update(_key).digest();
|
| + _hash.add(_key);
|
| + _key = _hash.close();
|
| }
|
|
|
| // Zero-pad the key until its size is equal to the block size of the hash.
|
| if (_key.length < blockSize) {
|
| - var newKey = new List(blockSize);
|
| + var newKey = new List.fixedLength(blockSize);
|
| newKey.setRange(0, _key.length, _key);
|
| for (var i = _key.length; i < blockSize; i++) {
|
| newKey[i] = 0;
|
| @@ -32,14 +35,16 @@ class _HMAC implements HMAC {
|
| }
|
|
|
| // Compute inner padding.
|
| - var padding = new List(blockSize);
|
| + var padding = new List.fixedLength(blockSize);
|
| for (var i = 0; i < blockSize; i++) {
|
| padding[i] = 0x36 ^ _key[i];
|
| }
|
|
|
| // Inner hash computation.
|
| _hash = _hash.newInstance();
|
| - var innerHash = _hash.update(padding).update(_message).digest();
|
| + _hash.add(padding);
|
| + _hash.add(_message);
|
| + var innerHash = _hash.close();
|
|
|
| // Compute outer padding.
|
| for (var i = 0; i < blockSize; i++) {
|
| @@ -48,11 +53,18 @@ class _HMAC implements HMAC {
|
|
|
| // Outer hash computation which is the result.
|
| _hash = _hash.newInstance();
|
| - return _hash.update(padding).update(innerHash).digest();
|
| + _hash.add(padding);
|
| + _hash.add(innerHash);
|
| + return _hash.close();
|
| + }
|
| +
|
| + List<int> close() {
|
| + _isClosed = true;
|
| + return digest;
|
| }
|
|
|
| bool verify(List<int> digest) {
|
| - var computedDigest = this.digest();
|
| + var computedDigest = this.digest;
|
| if (digest.length != computedDigest.length) {
|
| throw new ArgumentError(
|
| 'Invalid digest size: ${digest.length} in HMAC.verify. '
|
|
|