@@ -133,6 +133,11 @@ ZEND_BEGIN_ARG_INFO(arginfo_secp256k1_ec_pubkey_create, 0)
133
133
ZEND_ARG_INFO (0 , secretKey )
134
134
ZEND_END_ARG_INFO ();
135
135
136
+ ZEND_BEGIN_ARG_INFO (arginfo_secp256k1_ec_privkey_negate , 0 )
137
+ ZEND_ARG_INFO (0 , context )
138
+ ZEND_ARG_INFO (1 , secKey )
139
+ ZEND_END_ARG_INFO ();
140
+
136
141
ZEND_BEGIN_ARG_INFO (arginfo_secp256k1_ec_privkey_tweak_add , 0 )
137
142
ZEND_ARG_INFO (0 , context )
138
143
ZEND_ARG_INFO (1 , seckey )
@@ -185,6 +190,7 @@ const zend_function_entry secp256k1_functions[] = {
185
190
PHP_FE (secp256k1_ec_seckey_verify , arginfo_secp256k1_ec_seckey_verify )
186
191
187
192
PHP_FE (secp256k1_ec_pubkey_create , arginfo_secp256k1_ec_pubkey_create )
193
+ PHP_FE (secp256k1_ec_privkey_negate , arginfo_secp256k1_ec_privkey_negate )
188
194
PHP_FE (secp256k1_ec_pubkey_parse , arginfo_secp256k1_ec_pubkey_parse )
189
195
PHP_FE (secp256k1_ec_pubkey_combine , arginfo_secp256k1_ec_pubkey_combine )
190
196
PHP_FE (secp256k1_ec_pubkey_serialize , arginfo_secp256k1_ec_pubkey_serialize )
@@ -747,6 +753,45 @@ PHP_FUNCTION(secp256k1_ec_pubkey_create)
747
753
}
748
754
/* }}} */
749
755
756
+ /** Negates a private key in place.
757
+ * Returns: 1 always
758
+ * Args: ctx: pointer to a context object
759
+ * In/Out: pubkey: pointer to the public key to be negated (cannot be NULL)
760
+ */
761
+ PHP_FUNCTION (secp256k1_ec_privkey_negate )
762
+ {
763
+ zval * zCtx , * zPrivKey ;
764
+ secp256k1_context * ctx ;
765
+ unsigned char * newseckey ;
766
+ int result ;
767
+
768
+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "rz/" , & zCtx , & zPrivKey ) == FAILURE ) {
769
+ RETURN_FALSE ;
770
+ }
771
+
772
+ if ((ctx = (secp256k1_context * )zend_fetch_resource2_ex (zCtx , SECP256K1_CTX_RES_NAME , le_secp256k1_ctx , -1 )) == NULL ) {
773
+ RETURN_FALSE ;
774
+ }
775
+
776
+ if (Z_TYPE_P (zPrivKey ) != IS_STRING ) {
777
+ zend_throw_exception_ex (spl_ce_InvalidArgumentException , 0 TSRMLS_CC , "secp256k1_ec_privkey_negate(): Parameter 2 should be string" );
778
+ return ;
779
+ }
780
+
781
+ if (Z_STRLEN_P (zPrivKey ) != SECRETKEY_LENGTH ) {
782
+ zend_throw_exception_ex (spl_ce_InvalidArgumentException , 0 TSRMLS_CC , "secp256k1_ec_privkey_negate(): Parameter 2 should be 32 bytes" );
783
+ return ;
784
+ }
785
+
786
+ newseckey = (unsigned char * ) emalloc (SECRETKEY_LENGTH );
787
+ memcpy (newseckey , Z_STRVAL_P (zPrivKey ), SECRETKEY_LENGTH );
788
+ result = secp256k1_ec_privkey_negate (ctx , newseckey );
789
+ zval_dtor (zPrivKey );
790
+ ZVAL_STRINGL (zPrivKey , newseckey , SECRETKEY_LENGTH );
791
+
792
+ RETURN_LONG (result );
793
+ }
794
+
750
795
/* Parse a variable length public key into a public key resource */
751
796
/** {{{ proto int secp256k1_ec_pubkey_parse(resource secp256k1_context, string publicKey)
752
797
* In: ctx: a secp256k1_context resource
0 commit comments