diff --git a/crt/aws-crt-ffi b/crt/aws-crt-ffi index 927850d..94e82ef 160000 --- a/crt/aws-crt-ffi +++ b/crt/aws-crt-ffi @@ -1 +1 @@ -Subproject commit 927850d2e7a43fd8c930a9c42fb7b329c610ae85 +Subproject commit 94e82ef7b42fd23241f68692c2b3dfc9d596d685 diff --git a/ext/awscrt.stub.php b/ext/awscrt.stub.php index d53d5ff..5a8d837 100644 --- a/ext/awscrt.stub.php +++ b/ext/awscrt.stub.php @@ -6,135 +6,83 @@ */ function aws_crt_last_error(): int {} - function aws_crt_error_name(int $error_code): string {} - function aws_crt_error_str(int $error_code): string {} - function aws_crt_error_debug_str(int $error_code): string {} function aws_crt_log_to_stdout(): void {} - function aws_crt_log_to_stderr(): void {} - function aws_crt_log_to_file(string $filename): void {} - function aws_crt_log_to_stream(object $stream): void {} - function aws_crt_log_stop(): void {} - function aws_crt_log_set_level(int $level): void {} - function aws_crt_log_message(string $message): void {} function aws_crt_event_loop_group_options_new(): int {} - function aws_crt_event_loop_group_options_release(int $elg_options): void {} - function aws_crt_event_loop_group_options_set_max_threads(int $elg_options, int $max_threads): void {} - function aws_crt_event_loop_group_new(object $options): object {} - function aws_crt_event_loop_group_release(object $event_loop_group): void {} function aws_crt_input_stream_options_new(): object {} - function aws_crt_input_stream_options_release(object $options): void {} - function aws_crt_input_stream_options_set_user_data(object $options, object $user_data): void {} - function aws_crt_input_stream_new(object $options): object {} - function aws_crt_input_stream_release(int $stream): void {} - function aws_crt_input_stream_seek(int $stream, int $offset, int $basis): int {} - function aws_crt_input_stream_read(int $stream, int $length): string {} - function aws_crt_input_stream_eof(int $stream): bool {} - function aws_crt_input_stream_get_length(int $stream): int {} function aws_crt_http_message_new_from_blob(string $blob): int {} - function aws_crt_http_message_to_blob(int $message): string {} - function aws_crt_http_message_release(int $message): void {} function aws_crt_credentials_options_new(): object {} - function aws_crt_credentials_options_release(object $options): void {} - function aws_crt_credentials_options_set_access_key_id(object $options, string $access_key_id): void {} - function aws_crt_credentials_options_set_secret_access_key(object $options, string $secret_access_key): void {} - function aws_crt_credentials_options_set_session_token(object $options, string $session_token): void {} - function aws_crt_credentials_options_set_expiration_timepoint_seconds(object $options, int $expiration_timepoint_seconds): void {} function aws_crt_credentials_new(object $options): object {} - function aws_crt_credentials_release(object $credentials): void {} function aws_crt_credentials_provider_release(int $credentials): void {} function aws_crt_credentials_provider_static_options_new(): object {} - function aws_crt_credentials_provider_static_options_release(object $options): void {} - function aws_crt_credentials_provider_static_options_set_access_key_id(object $options, string $access_key_id): void {} - function aws_crt_credentials_provider_static_options_set_secret_access_key(object $options, string $secret_access_key): void {} - function aws_crt_credentials_provider_static_options_set_session_token(object $options, string $session_token): void {} - function aws_crt_credentials_provider_static_new(object $options): object {} function aws_crt_signing_config_aws_new(): int {} - function aws_crt_signing_config_aws_release(int $config): void {} - function aws_crt_signing_config_aws_set_algorithm(int $config, int $algorithm): void {} - function aws_crt_signing_config_aws_set_signature_type(int $config, int $signature_type): void {} - function aws_crt_signing_config_aws_set_credentials_provider(int $config, int $credentials_provider): void {} - function aws_crt_signing_config_aws_set_region(int $config, string $region): void {} - function aws_crt_signing_config_aws_set_service(int $config, string $service): void {} - function aws_crt_signing_config_aws_set_use_double_uri_encode(int $config, bool $use_double_uri_encode): void {} - function aws_crt_signing_config_aws_set_should_normalize_uri_path(int $config, bool $should_normalize_uri_path): void {} - function aws_crt_signing_config_aws_set_omit_session_token(int $config, bool $omit_session_token): void {} - function aws_crt_signing_config_aws_set_signed_body_value(int $config, string $signed_body_value): void {} - function aws_crt_signing_config_aws_set_signed_body_header_type(int $config, int $signed_body_header_type): void {} - function aws_crt_signing_config_aws_set_expiration_in_seconds(int $config, int $expiration_in_seconds): void {} - function aws_crt_signing_config_aws_set_date(int $config, int $timestamp): void {} - function aws_crt_signing_config_aws_set_should_sign_header_fn(int $config, object $should_sign_header): void {} function aws_crt_signable_new_from_http_request(int $http_message): int {} - function aws_crt_signable_new_from_chunk(int $input_stream, string $previous_signature): int {} - function aws_crt_signable_new_from_canonical_request(string $request): int {} - function aws_crt_signable_release(int $signable): void {} 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_test_verify_sigv4a_signing(int $signable, int $signing_config, string $expected_canonical_request, string $signature, string $ecc_key_pub_x, string $ecc_key_pub_y): bool {} function aws_crt_crc32(string $input, int $prev): int {} - function aws_crt_crc32c(string $input, int $prev): int {} diff --git a/ext/awscrt_arginfo.h b/ext/awscrt_arginfo.h index 2ef88ef..53e2559 100644 --- a/ext/awscrt_arginfo.h +++ b/ext/awscrt_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 3d39c69ca902372d6bf164faadb43df1f201bd80 */ + * Stub hash: 344f9d59b85697b80bb6808ac7d5eb7c1d07c03f */ ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_last_error, 0, 0, 0) ZEND_END_ARG_INFO() @@ -253,6 +253,15 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_sign_request_aws, 0, 0, 4) ZEND_ARG_INFO(0, user_data) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_aws_crt_test_verify_sigv4a_signing, 0, 0, 6) + ZEND_ARG_INFO(0, signable) + ZEND_ARG_INFO(0, signing_config) + ZEND_ARG_INFO(0, expected_canonical_request) + ZEND_ARG_INFO(0, signature) + ZEND_ARG_INFO(0, ecc_key_pub_x) + ZEND_ARG_INFO(0, ecc_key_pub_y) +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) @@ -326,6 +335,7 @@ 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_test_verify_sigv4a_signing); ZEND_FUNCTION(aws_crt_crc32); ZEND_FUNCTION(aws_crt_crc32c); @@ -396,6 +406,7 @@ static const zend_function_entry ext_functions[] = { 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_test_verify_sigv4a_signing, arginfo_aws_crt_test_verify_sigv4a_signing) 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/signing.c b/ext/signing.c index 702319a..69da25a 100644 --- a/ext/signing.c +++ b/ext/signing.c @@ -337,3 +337,38 @@ done: aws_promise_release(promise); RETURN_LONG(ret); } + +PHP_FUNCTION(aws_crt_test_verify_sigv4a_signing) { + zend_ulong php_signable = 0; + zend_ulong php_signing_config = 0; + const char *expected_canonical_request = NULL; + size_t expected_canonical_request_len = 0; + const char *signature = NULL; + size_t signature_len = 0; + const char *ecc_key_pub_x = NULL; + size_t ecc_key_pub_x_len = 0; + const char *ecc_key_pub_y = NULL; + size_t ecc_key_pub_y_len = 0; + + aws_php_parse_parameters( + "llssss", + &php_signable, + &php_signing_config, + &expected_canonical_request, + &expected_canonical_request_len, + &signature, + &signature_len, + &ecc_key_pub_x, + &ecc_key_pub_x_len, + &ecc_key_pub_y, + &ecc_key_pub_y_len); + + const aws_crt_signable *signable = (void *)php_signable; + const aws_crt_signing_config *signing_config = (void *)php_signing_config; + + bool result = AWS_OP_SUCCESS == + aws_crt_test_verify_sigv4a_signing( + signable, signing_config, expected_canonical_request, signature, ecc_key_pub_x, ecc_key_pub_y); + + RETURN_BOOL(result); +} diff --git a/src/AWS/CRT/Auth/Signing.php b/src/AWS/CRT/Auth/Signing.php index a762590..d979db9 100644 --- a/src/AWS/CRT/Auth/Signing.php +++ b/src/AWS/CRT/Auth/Signing.php @@ -15,4 +15,8 @@ abstract class Signing extends NativeResource { $on_complete($signing_result, $error_code); }, null); } -} \ No newline at end of file + + static function testVerifySigV4ASigning($signable, $signing_config, $expected_canonical_request, $signature, $ecc_key_pub_x, $ecc_key_pub_y) { + return self::$crt->test_verify_sigv4a_signing($signable, $signing_config, $expected_canonical_request, $signature, $ecc_key_pub_x, $ecc_key_pub_y); + } +} diff --git a/src/AWS/CRT/CRT.php b/src/AWS/CRT/CRT.php index 0b7b676..f33b16c 100644 --- a/src/AWS/CRT/CRT.php +++ b/src/AWS/CRT/CRT.php @@ -378,6 +378,10 @@ final class CRT { return self::$impl->aws_crt_sign_request_aws($signable, $signing_config, $on_complete, $user_data); } + function test_verify_sigv4a_signing($signable, $signing_config, $expected_canonical_request, $signature, $ecc_key_pub_x, $ecc_key_pub_y) { + return self::$impl->aws_crt_test_verify_sigv4a_signing($signable, $signing_config, $expected_canonical_request, $signature, $ecc_key_pub_x, $ecc_key_pub_y); + } + public static function crc32($input, $previous = 0) { return self::$impl->aws_crt_crc32($input, $previous); }