All the algorithms you need for this are in the dart crypto package.
import 'dart:io';
import 'package:crypto/crypto.dart' as crypto;
main() {
var content = [65, 66, 67];
var md5 = new crypto.MD5();
md5.add(content);
var verb = 'GET';
var hash = crypto.CryptoUtils.bytesToHex(md5.close());
var type = 'text/plain';
var date = HttpDate.format(new DateTime.now());
var path = '/request/path';
var stringToSign = '$verb\n$hash\n$type\n$date\n$path';
print(stringToSign);
print('');
var key = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var hmac = new crypto.HMAC(new crypto.SHA1(), key);
hmac.add(content);
print(crypto.CryptoUtils.bytesToHex(hmac.close()));
}
Of cause you need to figure out the exact encoding of the different parts, e.g. the date. If just one bit is wrong in the input nothing works.
If you have some examples of input and output it is much easier to get the details right. E.g. test the MD5 of the empty string
print(crypto.CryptoUtils.bytesToHex(new crypto.MD5().close()));