fcrypt only supports passwords up to UINT_MAX characters long.

Also, avoid implicit integer conversion.
diff --git a/lib/zip_source_winzip_aes_decode.c b/lib/zip_source_winzip_aes_decode.c
index fdf4a33..87484af 100644
--- a/lib/zip_source_winzip_aes_decode.c
+++ b/lib/zip_source_winzip_aes_decode.c
@@ -92,6 +92,11 @@
 	return NULL;
     }
 
+    if (strlen(password) > UINT_MAX) {
+        zip_error_set(&za->error, ZIP_ER_INVAL, 0); /* TODO: better error code? (password too long) */
+        return NULL;
+    }
+
     if (zip_source_stat(src, &st) != 0) {
 	_zip_error_set_from_source(&za->error, src);
 	return NULL;
@@ -125,7 +130,7 @@
 {
     zip_uint8_t header[MAX_HEADER_LENGTH];
     zip_uint8_t password_verification[PWD_VER_LENGTH];
-    zip_uint8_t headerlen;
+    unsigned int headerlen;
     zip_int64_t n;
 
     headerlen = PWD_VER_LENGTH + salt_length[ctx->mode];
@@ -139,7 +144,7 @@
 	return -1;
     }
 
-    if (_zip_fcrypt_init(ctx->mode, (unsigned char *)ctx->password, strlen(ctx->password), header, password_verification, &ctx->fcrypt_ctx) != 0) {
+    if (_zip_fcrypt_init(ctx->mode, (unsigned char *)ctx->password, (unsigned int)strlen(ctx->password), header, password_verification, &ctx->fcrypt_ctx) != 0) {
 	zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0);
 	return -1;
     }
@@ -208,7 +213,7 @@
 
 	total = (zip_uint64_t)n;
 	for (offset = 0; offset < total; offset += ZIP_MIN(total - offset, UINT_MAX)) {
-	    _zip_fcrypt_decrypt((zip_uint8_t *)data + offset, ZIP_MIN(total - offset, UINT_MAX), &ctx->fcrypt_ctx);
+	    _zip_fcrypt_decrypt((zip_uint8_t *)data + offset, (unsigned int)ZIP_MIN(total - offset, UINT_MAX), &ctx->fcrypt_ctx);
 	}
 
 	return n;