diff --git a/config.m4 b/config.m4 index 27e55ba..395f4e5 100644 --- a/config.m4 +++ b/config.m4 @@ -16,7 +16,7 @@ if test "$PHP_AWSCRT" != "no"; then platform_tls_libs="-ls2n -l:libcrypto.a" fi CRT_LIBPATHS="-L${cwd}/build/install/lib -L${cwd}/build/install/lib64" - CRT_LIBS="-laws-crt-ffi -laws-c-auth -laws-c-http -laws-c-io -laws-c-cal -laws-c-compression -laws-c-common ${platform_tls_libs}" + CRT_LIBS="-laws-crt-ffi -laws-c-auth -laws-c-http -laws-c-io -laws-c-cal -laws-c-compression -laws-checksums -laws-c-common ${platform_tls_libs}" PHP_ADD_INCLUDE(${cwd}/build/install/include) PHP_EVAL_LIBLINE([$CRT_LIBPATHS $CRT_LIBS], AWSCRT_SHARED_LIBADD) diff --git a/crt/aws-crt-ffi b/crt/aws-crt-ffi index 14b72a2..77b25c5 160000 --- a/crt/aws-crt-ffi +++ b/crt/aws-crt-ffi @@ -1 +1 @@ -Subproject commit 14b72a2fda3d81f1397057869fba8cc25530d741 +Subproject commit 77b25c562b333acd753d988d405539439a8e6fdb diff --git a/ext/awscrt.c b/ext/awscrt.c index 55ba77e..c72b758 100644 --- a/ext/awscrt.c +++ b/ext/awscrt.c @@ -11,3 +11,5 @@ #include "http.c" #include "signing.c" #include "stream.c" +// #include "hash.c" +#include "crc.c" diff --git a/ext/awscrt.stub.php b/ext/awscrt.stub.php index 1f72189..b7f7a10 100644 --- a/ext/awscrt.stub.php +++ b/ext/awscrt.stub.php @@ -118,3 +118,7 @@ function aws_crt_signing_result_release(int $signing_result): void {} function aws_crt_signing_result_apply_to_http_request(object $signing_result, object $http_request): void {} function aws_crt_sign_request_aws(int $signable, int $signing_config, object $on_complete, object $user_data): int {} + +function aws_crt_crc32(string $input, int $prev): int {} + +function aws_crt_crc32c(string $input, int $prev): int {} \ No newline at end of file diff --git a/ext/awscrt_arginfo.h b/ext/awscrt_arginfo.h index 10b90d2..811492a 100644 --- a/ext/awscrt_arginfo.h +++ b/ext/awscrt_arginfo.h @@ -1,11 +1,11 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 8ee94b778eb6d2eeabc8c2695aaded9fb18de88f */ + * Stub hash: 36d4e512f02a12c10689eb9b0941bcd7837fbf1d */ ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_last_error, 0, 0, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_error_name, 0, 0, 1) - ZEND_ARG_INFO(0, error_code) +ZEND_ARG_INFO(0, error_code) ZEND_END_ARG_INFO() #define arginfo_aws_crt_error_str arginfo_aws_crt_error_name @@ -15,69 +15,69 @@ ZEND_END_ARG_INFO() #define arginfo_aws_crt_event_loop_group_options_new arginfo_aws_crt_last_error ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_event_loop_group_options_release, 0, 0, 1) - ZEND_ARG_INFO(0, elg_options) +ZEND_ARG_INFO(0, elg_options) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_event_loop_group_options_set_max_threads, 0, 0, 2) - ZEND_ARG_INFO(0, elg_options) - ZEND_ARG_INFO(0, max_threads) +ZEND_ARG_INFO(0, elg_options) +ZEND_ARG_INFO(0, max_threads) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_event_loop_group_new, 0, 0, 1) - ZEND_ARG_INFO(0, options) +ZEND_ARG_INFO(0, options) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_event_loop_group_release, 0, 0, 1) - ZEND_ARG_INFO(0, event_loop_group) +ZEND_ARG_INFO(0, event_loop_group) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_input_stream_options_new, 0, 0, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_input_stream_options_release, 0, 0, 1) - ZEND_ARG_INFO(0, options) +ZEND_ARG_INFO(0, options) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_input_stream_options_set_user_data, 0, 0, 2) - ZEND_ARG_INFO(0, options) - ZEND_ARG_INFO(0, user_data) +ZEND_ARG_INFO(0, options) +ZEND_ARG_INFO(0, user_data) ZEND_END_ARG_INFO() #define arginfo_aws_crt_input_stream_new arginfo_aws_crt_event_loop_group_new ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_input_stream_release, 0, 0, 1) - ZEND_ARG_INFO(0, stream) +ZEND_ARG_INFO(0, stream) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_input_stream_seek, 0, 0, 3) - ZEND_ARG_INFO(0, stream) - ZEND_ARG_INFO(0, offset) - ZEND_ARG_INFO(0, basis) +ZEND_ARG_INFO(0, stream) +ZEND_ARG_INFO(0, offset) +ZEND_ARG_INFO(0, basis) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_input_stream_read, 0, 0, 2) - ZEND_ARG_INFO(0, stream) - ZEND_ARG_INFO(0, length) +ZEND_ARG_INFO(0, stream) +ZEND_ARG_INFO(0, length) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_input_stream_eof, 0, 0, 1) - ZEND_ARG_INFO(0, stream) +ZEND_ARG_INFO(0, stream) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_input_stream_get_length, 0, 0, 1) - ZEND_ARG_INFO(0, stream) +ZEND_ARG_INFO(0, stream) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_http_message_new_from_blob, 0, 0, 1) - ZEND_ARG_INFO(0, blob) +ZEND_ARG_INFO(0, blob) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_http_message_to_blob, 0, 0, 1) - ZEND_ARG_INFO(0, message) +ZEND_ARG_INFO(0, message) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_http_message_release, 0, 0, 1) - ZEND_ARG_INFO(0, message) +ZEND_ARG_INFO(0, message) ZEND_END_ARG_INFO() #define arginfo_aws_crt_credentials_options_new arginfo_aws_crt_input_stream_options_new @@ -85,146 +85,155 @@ ZEND_END_ARG_INFO() #define arginfo_aws_crt_credentials_options_release arginfo_aws_crt_input_stream_options_release ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_credentials_options_set_access_key_id, 0, 0, 2) - ZEND_ARG_INFO(0, options) - ZEND_ARG_INFO(0, access_key_id) +ZEND_ARG_INFO(0, options) +ZEND_ARG_INFO(0, access_key_id) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_credentials_options_set_secret_access_key, 0, 0, 2) - ZEND_ARG_INFO(0, options) - ZEND_ARG_INFO(0, secret_access_key) +ZEND_ARG_INFO(0, options) +ZEND_ARG_INFO(0, secret_access_key) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_credentials_options_set_session_token, 0, 0, 2) - ZEND_ARG_INFO(0, options) - ZEND_ARG_INFO(0, session_token) +ZEND_ARG_INFO(0, options) +ZEND_ARG_INFO(0, session_token) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_credentials_options_set_expiration_timepoint_seconds, 0, 0, 2) - ZEND_ARG_INFO(0, options) - ZEND_ARG_INFO(0, expiration_timepoint_seconds) +ZEND_ARG_INFO(0, options) +ZEND_ARG_INFO(0, expiration_timepoint_seconds) ZEND_END_ARG_INFO() #define arginfo_aws_crt_credentials_new arginfo_aws_crt_event_loop_group_new ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_credentials_release, 0, 0, 1) - ZEND_ARG_INFO(0, credentials) +ZEND_ARG_INFO(0, credentials) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_credentials_provider_release, 0, 0, 1) - ZEND_ARG_INFO(0, credentials) +ZEND_ARG_INFO(0, credentials) ZEND_END_ARG_INFO() #define arginfo_aws_crt_credentials_provider_static_options_new arginfo_aws_crt_input_stream_options_new #define arginfo_aws_crt_credentials_provider_static_options_release arginfo_aws_crt_input_stream_options_release -#define arginfo_aws_crt_credentials_provider_static_options_set_access_key_id arginfo_aws_crt_credentials_options_set_access_key_id +#define arginfo_aws_crt_credentials_provider_static_options_set_access_key_id \ + arginfo_aws_crt_credentials_options_set_access_key_id -#define arginfo_aws_crt_credentials_provider_static_options_set_secret_access_key arginfo_aws_crt_credentials_options_set_secret_access_key +#define arginfo_aws_crt_credentials_provider_static_options_set_secret_access_key \ + arginfo_aws_crt_credentials_options_set_secret_access_key -#define arginfo_aws_crt_credentials_provider_static_options_set_session_token arginfo_aws_crt_credentials_options_set_session_token +#define arginfo_aws_crt_credentials_provider_static_options_set_session_token \ + arginfo_aws_crt_credentials_options_set_session_token #define arginfo_aws_crt_credentials_provider_static_new arginfo_aws_crt_event_loop_group_new #define arginfo_aws_crt_signing_config_aws_new arginfo_aws_crt_last_error ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_release, 0, 0, 1) - ZEND_ARG_INFO(0, config) +ZEND_ARG_INFO(0, config) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_algorithm, 0, 0, 2) - ZEND_ARG_INFO(0, config) - ZEND_ARG_INFO(0, algorithm) +ZEND_ARG_INFO(0, config) +ZEND_ARG_INFO(0, algorithm) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_signature_type, 0, 0, 2) - ZEND_ARG_INFO(0, config) - ZEND_ARG_INFO(0, signature_type) +ZEND_ARG_INFO(0, config) +ZEND_ARG_INFO(0, signature_type) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_credentials_provider, 0, 0, 2) - ZEND_ARG_INFO(0, config) - ZEND_ARG_INFO(0, credentials_provider) +ZEND_ARG_INFO(0, config) +ZEND_ARG_INFO(0, credentials_provider) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_region, 0, 0, 2) - ZEND_ARG_INFO(0, config) - ZEND_ARG_INFO(0, region) +ZEND_ARG_INFO(0, config) +ZEND_ARG_INFO(0, region) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_service, 0, 0, 2) - ZEND_ARG_INFO(0, config) - ZEND_ARG_INFO(0, service) +ZEND_ARG_INFO(0, config) +ZEND_ARG_INFO(0, service) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_use_double_uri_encode, 0, 0, 2) - ZEND_ARG_INFO(0, config) - ZEND_ARG_INFO(0, use_double_uri_encode) +ZEND_ARG_INFO(0, config) +ZEND_ARG_INFO(0, use_double_uri_encode) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_should_normalize_uri_path, 0, 0, 2) - ZEND_ARG_INFO(0, config) - ZEND_ARG_INFO(0, should_normalize_uri_path) +ZEND_ARG_INFO(0, config) +ZEND_ARG_INFO(0, should_normalize_uri_path) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_omit_session_token, 0, 0, 2) - ZEND_ARG_INFO(0, config) - ZEND_ARG_INFO(0, omit_session_token) +ZEND_ARG_INFO(0, config) +ZEND_ARG_INFO(0, omit_session_token) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_signed_body_value, 0, 0, 2) - ZEND_ARG_INFO(0, config) - ZEND_ARG_INFO(0, signed_body_value) +ZEND_ARG_INFO(0, config) +ZEND_ARG_INFO(0, signed_body_value) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_signed_body_header_type, 0, 0, 2) - ZEND_ARG_INFO(0, config) - ZEND_ARG_INFO(0, signed_body_header_type) +ZEND_ARG_INFO(0, config) +ZEND_ARG_INFO(0, signed_body_header_type) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_expiration_in_seconds, 0, 0, 2) - ZEND_ARG_INFO(0, config) - ZEND_ARG_INFO(0, expiration_in_seconds) +ZEND_ARG_INFO(0, config) +ZEND_ARG_INFO(0, expiration_in_seconds) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_config_aws_set_date, 0, 0, 2) - ZEND_ARG_INFO(0, config) - ZEND_ARG_INFO(0, timestamp) +ZEND_ARG_INFO(0, config) +ZEND_ARG_INFO(0, timestamp) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signable_new_from_http_request, 0, 0, 1) - ZEND_ARG_INFO(0, http_message) +ZEND_ARG_INFO(0, http_message) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signable_new_from_chunk, 0, 0, 2) - ZEND_ARG_INFO(0, input_stream) - ZEND_ARG_INFO(0, previous_signature) +ZEND_ARG_INFO(0, input_stream) +ZEND_ARG_INFO(0, previous_signature) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signable_new_from_canonical_request, 0, 0, 1) - ZEND_ARG_INFO(0, request) +ZEND_ARG_INFO(0, request) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signable_release, 0, 0, 1) - ZEND_ARG_INFO(0, signable) +ZEND_ARG_INFO(0, signable) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_result_release, 0, 0, 1) - ZEND_ARG_INFO(0, signing_result) +ZEND_ARG_INFO(0, signing_result) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_signing_result_apply_to_http_request, 0, 0, 2) - ZEND_ARG_INFO(0, signing_result) - ZEND_ARG_INFO(0, http_request) +ZEND_ARG_INFO(0, signing_result) +ZEND_ARG_INFO(0, http_request) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_sign_request_aws, 0, 0, 4) - ZEND_ARG_INFO(0, signable) - ZEND_ARG_INFO(0, signing_config) - ZEND_ARG_INFO(0, on_complete) - ZEND_ARG_INFO(0, user_data) +ZEND_ARG_INFO(0, signable) +ZEND_ARG_INFO(0, signing_config) +ZEND_ARG_INFO(0, on_complete) +ZEND_ARG_INFO(0, user_data) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_crc32, 0, 0, 2) +ZEND_ARG_INFO(0, input) +ZEND_ARG_INFO(0, prev) +ZEND_END_ARG_INFO() + +#define arginfo_aws_crt_crc32c arginfo_aws_crt_crc32 ZEND_FUNCTION(aws_crt_last_error); ZEND_FUNCTION(aws_crt_error_name); @@ -283,65 +292,89 @@ ZEND_FUNCTION(aws_crt_signable_release); ZEND_FUNCTION(aws_crt_signing_result_release); ZEND_FUNCTION(aws_crt_signing_result_apply_to_http_request); ZEND_FUNCTION(aws_crt_sign_request_aws); +ZEND_FUNCTION(aws_crt_crc32); +ZEND_FUNCTION(aws_crt_crc32c); - -static const zend_function_entry ext_functions[] = { - ZEND_FE(aws_crt_last_error, arginfo_aws_crt_last_error) - ZEND_FE(aws_crt_error_name, arginfo_aws_crt_error_name) - ZEND_FE(aws_crt_error_str, arginfo_aws_crt_error_str) - ZEND_FE(aws_crt_error_debug_str, arginfo_aws_crt_error_debug_str) - ZEND_FE(aws_crt_event_loop_group_options_new, arginfo_aws_crt_event_loop_group_options_new) - ZEND_FE(aws_crt_event_loop_group_options_release, arginfo_aws_crt_event_loop_group_options_release) - ZEND_FE(aws_crt_event_loop_group_options_set_max_threads, arginfo_aws_crt_event_loop_group_options_set_max_threads) - ZEND_FE(aws_crt_event_loop_group_new, arginfo_aws_crt_event_loop_group_new) - ZEND_FE(aws_crt_event_loop_group_release, arginfo_aws_crt_event_loop_group_release) - ZEND_FE(aws_crt_input_stream_options_new, arginfo_aws_crt_input_stream_options_new) - ZEND_FE(aws_crt_input_stream_options_release, arginfo_aws_crt_input_stream_options_release) - ZEND_FE(aws_crt_input_stream_options_set_user_data, arginfo_aws_crt_input_stream_options_set_user_data) - ZEND_FE(aws_crt_input_stream_new, arginfo_aws_crt_input_stream_new) - ZEND_FE(aws_crt_input_stream_release, arginfo_aws_crt_input_stream_release) - ZEND_FE(aws_crt_input_stream_seek, arginfo_aws_crt_input_stream_seek) - ZEND_FE(aws_crt_input_stream_read, arginfo_aws_crt_input_stream_read) - ZEND_FE(aws_crt_input_stream_eof, arginfo_aws_crt_input_stream_eof) - ZEND_FE(aws_crt_input_stream_get_length, arginfo_aws_crt_input_stream_get_length) - ZEND_FE(aws_crt_http_message_new_from_blob, arginfo_aws_crt_http_message_new_from_blob) - ZEND_FE(aws_crt_http_message_to_blob, arginfo_aws_crt_http_message_to_blob) - ZEND_FE(aws_crt_http_message_release, arginfo_aws_crt_http_message_release) - ZEND_FE(aws_crt_credentials_options_new, arginfo_aws_crt_credentials_options_new) - ZEND_FE(aws_crt_credentials_options_release, arginfo_aws_crt_credentials_options_release) - ZEND_FE(aws_crt_credentials_options_set_access_key_id, arginfo_aws_crt_credentials_options_set_access_key_id) - ZEND_FE(aws_crt_credentials_options_set_secret_access_key, arginfo_aws_crt_credentials_options_set_secret_access_key) - ZEND_FE(aws_crt_credentials_options_set_session_token, arginfo_aws_crt_credentials_options_set_session_token) - ZEND_FE(aws_crt_credentials_options_set_expiration_timepoint_seconds, arginfo_aws_crt_credentials_options_set_expiration_timepoint_seconds) - ZEND_FE(aws_crt_credentials_new, arginfo_aws_crt_credentials_new) - ZEND_FE(aws_crt_credentials_release, arginfo_aws_crt_credentials_release) - ZEND_FE(aws_crt_credentials_provider_release, arginfo_aws_crt_credentials_provider_release) - ZEND_FE(aws_crt_credentials_provider_static_options_new, arginfo_aws_crt_credentials_provider_static_options_new) - ZEND_FE(aws_crt_credentials_provider_static_options_release, arginfo_aws_crt_credentials_provider_static_options_release) - ZEND_FE(aws_crt_credentials_provider_static_options_set_access_key_id, arginfo_aws_crt_credentials_provider_static_options_set_access_key_id) - ZEND_FE(aws_crt_credentials_provider_static_options_set_secret_access_key, arginfo_aws_crt_credentials_provider_static_options_set_secret_access_key) - ZEND_FE(aws_crt_credentials_provider_static_options_set_session_token, arginfo_aws_crt_credentials_provider_static_options_set_session_token) - ZEND_FE(aws_crt_credentials_provider_static_new, arginfo_aws_crt_credentials_provider_static_new) - ZEND_FE(aws_crt_signing_config_aws_new, arginfo_aws_crt_signing_config_aws_new) - ZEND_FE(aws_crt_signing_config_aws_release, arginfo_aws_crt_signing_config_aws_release) - ZEND_FE(aws_crt_signing_config_aws_set_algorithm, arginfo_aws_crt_signing_config_aws_set_algorithm) - ZEND_FE(aws_crt_signing_config_aws_set_signature_type, arginfo_aws_crt_signing_config_aws_set_signature_type) - ZEND_FE(aws_crt_signing_config_aws_set_credentials_provider, arginfo_aws_crt_signing_config_aws_set_credentials_provider) - ZEND_FE(aws_crt_signing_config_aws_set_region, arginfo_aws_crt_signing_config_aws_set_region) - ZEND_FE(aws_crt_signing_config_aws_set_service, arginfo_aws_crt_signing_config_aws_set_service) - ZEND_FE(aws_crt_signing_config_aws_set_use_double_uri_encode, arginfo_aws_crt_signing_config_aws_set_use_double_uri_encode) - ZEND_FE(aws_crt_signing_config_aws_set_should_normalize_uri_path, arginfo_aws_crt_signing_config_aws_set_should_normalize_uri_path) - ZEND_FE(aws_crt_signing_config_aws_set_omit_session_token, arginfo_aws_crt_signing_config_aws_set_omit_session_token) - ZEND_FE(aws_crt_signing_config_aws_set_signed_body_value, arginfo_aws_crt_signing_config_aws_set_signed_body_value) - ZEND_FE(aws_crt_signing_config_aws_set_signed_body_header_type, arginfo_aws_crt_signing_config_aws_set_signed_body_header_type) - ZEND_FE(aws_crt_signing_config_aws_set_expiration_in_seconds, arginfo_aws_crt_signing_config_aws_set_expiration_in_seconds) - ZEND_FE(aws_crt_signing_config_aws_set_date, arginfo_aws_crt_signing_config_aws_set_date) - ZEND_FE(aws_crt_signable_new_from_http_request, arginfo_aws_crt_signable_new_from_http_request) - ZEND_FE(aws_crt_signable_new_from_chunk, arginfo_aws_crt_signable_new_from_chunk) - ZEND_FE(aws_crt_signable_new_from_canonical_request, arginfo_aws_crt_signable_new_from_canonical_request) - ZEND_FE(aws_crt_signable_release, arginfo_aws_crt_signable_release) - ZEND_FE(aws_crt_signing_result_release, arginfo_aws_crt_signing_result_release) - ZEND_FE(aws_crt_signing_result_apply_to_http_request, arginfo_aws_crt_signing_result_apply_to_http_request) - ZEND_FE(aws_crt_sign_request_aws, arginfo_aws_crt_sign_request_aws) - ZEND_FE_END -}; +static const zend_function_entry ext_functions[] = + {ZEND_FE(aws_crt_last_error, arginfo_aws_crt_last_error) ZEND_FE(aws_crt_error_name, arginfo_aws_crt_error_name) ZEND_FE( + aws_crt_error_str, + arginfo_aws_crt_error_str) ZEND_FE(aws_crt_error_debug_str, arginfo_aws_crt_error_debug_str) + ZEND_FE(aws_crt_event_loop_group_options_new, arginfo_aws_crt_event_loop_group_options_new) ZEND_FE( + aws_crt_event_loop_group_options_release, + arginfo_aws_crt_event_loop_group_options_release) ZEND_FE(aws_crt_event_loop_group_options_set_max_threads, arginfo_aws_crt_event_loop_group_options_set_max_threads) + ZEND_FE(aws_crt_event_loop_group_new, arginfo_aws_crt_event_loop_group_new) ZEND_FE( + aws_crt_event_loop_group_release, + arginfo_aws_crt_event_loop_group_release) ZEND_FE(aws_crt_input_stream_options_new, arginfo_aws_crt_input_stream_options_new) + ZEND_FE(aws_crt_input_stream_options_release, arginfo_aws_crt_input_stream_options_release) ZEND_FE( + aws_crt_input_stream_options_set_user_data, + arginfo_aws_crt_input_stream_options_set_user_data) ZEND_FE(aws_crt_input_stream_new, arginfo_aws_crt_input_stream_new) + ZEND_FE(aws_crt_input_stream_release, arginfo_aws_crt_input_stream_release) ZEND_FE( + aws_crt_input_stream_seek, + arginfo_aws_crt_input_stream_seek) ZEND_FE(aws_crt_input_stream_read, arginfo_aws_crt_input_stream_read) + ZEND_FE(aws_crt_input_stream_eof, arginfo_aws_crt_input_stream_eof) ZEND_FE( + aws_crt_input_stream_get_length, + arginfo_aws_crt_input_stream_get_length) + ZEND_FE(aws_crt_http_message_new_from_blob, arginfo_aws_crt_http_message_new_from_blob) ZEND_FE( + aws_crt_http_message_to_blob, + arginfo_aws_crt_http_message_to_blob) + ZEND_FE(aws_crt_http_message_release, arginfo_aws_crt_http_message_release) ZEND_FE( + aws_crt_credentials_options_new, + arginfo_aws_crt_credentials_options_new) + ZEND_FE(aws_crt_credentials_options_release, arginfo_aws_crt_credentials_options_release) ZEND_FE( + aws_crt_credentials_options_set_access_key_id, + arginfo_aws_crt_credentials_options_set_access_key_id) + ZEND_FE( + aws_crt_credentials_options_set_secret_access_key, + arginfo_aws_crt_credentials_options_set_secret_access_key) + ZEND_FE( + aws_crt_credentials_options_set_session_token, + arginfo_aws_crt_credentials_options_set_session_token) + ZEND_FE( + aws_crt_credentials_options_set_expiration_timepoint_seconds, + arginfo_aws_crt_credentials_options_set_expiration_timepoint_seconds) + ZEND_FE(aws_crt_credentials_new, arginfo_aws_crt_credentials_new) ZEND_FE( + aws_crt_credentials_release, + arginfo_aws_crt_credentials_release) + ZEND_FE( + aws_crt_credentials_provider_release, + arginfo_aws_crt_credentials_provider_release) + ZEND_FE( + aws_crt_credentials_provider_static_options_new, + arginfo_aws_crt_credentials_provider_static_options_new) + ZEND_FE( + aws_crt_credentials_provider_static_options_release, + arginfo_aws_crt_credentials_provider_static_options_release) + ZEND_FE( + aws_crt_credentials_provider_static_options_set_access_key_id, + arginfo_aws_crt_credentials_provider_static_options_set_access_key_id) + ZEND_FE( + aws_crt_credentials_provider_static_options_set_secret_access_key, + arginfo_aws_crt_credentials_provider_static_options_set_secret_access_key) + ZEND_FE( + aws_crt_credentials_provider_static_options_set_session_token, + arginfo_aws_crt_credentials_provider_static_options_set_session_token) + ZEND_FE( + aws_crt_credentials_provider_static_new, + arginfo_aws_crt_credentials_provider_static_new) + ZEND_FE( + aws_crt_signing_config_aws_new, + arginfo_aws_crt_signing_config_aws_new) + ZEND_FE( + aws_crt_signing_config_aws_release, + arginfo_aws_crt_signing_config_aws_release) + ZEND_FE( + aws_crt_signing_config_aws_set_algorithm, + arginfo_aws_crt_signing_config_aws_set_algorithm) ZEND_FE(aws_crt_signing_config_aws_set_signature_type, arginfo_aws_crt_signing_config_aws_set_signature_type) ZEND_FE(aws_crt_signing_config_aws_set_credentials_provider, arginfo_aws_crt_signing_config_aws_set_credentials_provider) ZEND_FE(aws_crt_signing_config_aws_set_region, arginfo_aws_crt_signing_config_aws_set_region) ZEND_FE(aws_crt_signing_config_aws_set_service, arginfo_aws_crt_signing_config_aws_set_service) ZEND_FE(aws_crt_signing_config_aws_set_use_double_uri_encode, arginfo_aws_crt_signing_config_aws_set_use_double_uri_encode) ZEND_FE(aws_crt_signing_config_aws_set_should_normalize_uri_path, arginfo_aws_crt_signing_config_aws_set_should_normalize_uri_path) ZEND_FE(aws_crt_signing_config_aws_set_omit_session_token, arginfo_aws_crt_signing_config_aws_set_omit_session_token) ZEND_FE(aws_crt_signing_config_aws_set_signed_body_value, arginfo_aws_crt_signing_config_aws_set_signed_body_value) ZEND_FE(aws_crt_signing_config_aws_set_signed_body_header_type, arginfo_aws_crt_signing_config_aws_set_signed_body_header_type) ZEND_FE(aws_crt_signing_config_aws_set_expiration_in_seconds, arginfo_aws_crt_signing_config_aws_set_expiration_in_seconds) ZEND_FE(aws_crt_signing_config_aws_set_date, arginfo_aws_crt_signing_config_aws_set_date) ZEND_FE(aws_crt_signable_new_from_http_request, arginfo_aws_crt_signable_new_from_http_request) ZEND_FE(aws_crt_signable_new_from_chunk, arginfo_aws_crt_signable_new_from_chunk) ZEND_FE(aws_crt_signable_new_from_canonical_request, arginfo_aws_crt_signable_new_from_canonical_request) ZEND_FE(aws_crt_signable_release, arginfo_aws_crt_signable_release) ZEND_FE(aws_crt_signing_result_release, arginfo_aws_crt_signing_result_release) + ZEND_FE( + aws_crt_signing_result_apply_to_http_request, + arginfo_aws_crt_signing_result_apply_to_http_request) + ZEND_FE( + aws_crt_sign_request_aws, + arginfo_aws_crt_sign_request_aws) + ZEND_FE( + aws_crt_crc32, + arginfo_aws_crt_crc32) + ZEND_FE( + aws_crt_crc32c, + arginfo_aws_crt_crc32c) + ZEND_FE_END}; diff --git a/ext/crc.c b/ext/crc.c new file mode 100644 index 0000000..8e520f8 --- /dev/null +++ b/ext/crc.c @@ -0,0 +1,32 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +#include "php_aws_crt.h" + +PHP_FUNCTION(aws_crt_crc32) { + zend_ulong prev = 0; + const char *input = NULL; + size_t len = 0; + + aws_php_parse_parameters("sl", &input, &len, &prev); + + if (prev > UINT32_MAX) { + aws_php_throw_exception("previous crc cannot be larger than UINT32_MAX"); + } + RETURN_LONG((zend_ulong)aws_crt_crc32((const uint8_t *)input, len, prev)); +} + +PHP_FUNCTION(aws_crt_crc32c) { + zend_ulong prev = 0; + const char *input = NULL; + size_t len = 0; + + aws_php_parse_parameters("sl", &input, &len, &prev); + + if (prev > UINT32_MAX) { + aws_php_throw_exception("previous crc cannot be larger than UINT32_MAX"); + } + RETURN_LONG((zend_ulong)aws_crt_crc32c((const uint8_t *)input, len, prev)); +} diff --git a/src/AWS/CRT/CRT.php b/src/AWS/CRT/CRT.php index c0eddb7..5410496 100644 --- a/src/AWS/CRT/CRT.php +++ b/src/AWS/CRT/CRT.php @@ -345,4 +345,12 @@ final class CRT { function sign_request_aws($signable, $signing_config, $on_complete, $user_data) { return self::$impl->aws_crt_sign_request_aws($signable, $signing_config, $on_complete, $user_data); } + + public static function crc32($input, $previous = 0) { + return self::$impl->aws_crt_crc32($input, $previous); + } + + public static function crc32c($input, $previous = 0) { + return self::$impl->aws_crt_crc32c($input, $previous); + } } diff --git a/tests/CrcTest.php b/tests/CrcTest.php new file mode 100644 index 0000000..56c5038 --- /dev/null +++ b/tests/CrcTest.php @@ -0,0 +1,90 @@ +assertEquals($output, $expected); + } + + public function testCrc32ZeroesIterated() { + $output = 0; + for ($i = 0; $i < 32; $i++) { + $output = CRT::crc32("\x00", $output); + } + $expected = 0x190A55AD; + $this->assertEquals($output, $expected); + } + + public function testCrc32ValuesOneShot() { + $input = implode(array_map("chr", range(0, 31))); + $output = CRT::crc32($input); + $expected = 0x91267E8A; + $this->assertEquals($output, $expected); + } + + public function testCrc32ValuesIterated() { + $output = 0; + foreach (range(0, 31) as $n) { + $output = CRT::crc32(chr($n), $output); + } + $expected = 0x91267E8A; + $this->assertEquals($output, $expected); + } + + public function testCrc32LargeBuffer() { + $input = implode(array_map("chr", array_fill(0, 1 << 20, 0))); + $output = CRT::crc32($input); + $expected = 0xA738EA1C; + $this->assertEquals($output, $expected); + } + + public function testCrc32cZeroesOneShot() { + $input = implode(array_map("chr", array_fill(0, 32, 0))); + $output = CRT::crc32c($input); + $expected = 0x8A9136AA; + $this->assertEquals($output, $expected); + } + + public function testCrc32cZeroesIterated() { + $output = 0; + for ($i = 0; $i < 32; $i++) { + $output = CRT::crc32c("\x00", $output); + } + $expected = 0x8A9136AA; + $this->assertEquals($output, $expected); + } + + public function testCrc32cValuesOneShot() { + $input = implode(array_map("chr", range(0, 31))); + $output = CRT::crc32c($input); + $expected = 0x46DD794E; + $this->assertEquals($output, $expected); + } + + public function testCrc32cValuesIterated() { + $output = 0; + foreach (range(0, 31) as $n) { + $output = CRT::crc32c(chr($n), $output); + } + $expected = 0x46DD794E; + $this->assertEquals($output, $expected); + } + + public function testCrc32cLargeBuffer() { + $input = implode(array_map("chr", array_fill(0, 1 << 20, 0))); + $output = CRT::crc32c($input); + $expected = 0x14298C12; + $this->assertEquals($output, $expected); + } + +} diff --git a/tests/common.inc b/tests/common.inc index 391a475..35601fa 100644 --- a/tests/common.inc +++ b/tests/common.inc @@ -5,6 +5,8 @@ */ use AWS\CRT\CRT as CRT; +ini_set("memory_limit", "512M"); + abstract class CrtTestCase extends PHPUnit_Framework_TestCase { private static $crt = null; public static function setUpBeforeClass() {