php 编译FFI

本文详细介绍了如何在PHP环境中安装和启用FFI扩展,以及通过FFI进行C库函数调用,如签名操作,以实现与服务器通信并处理安全相关任务。
摘要由CSDN通过智能技术生成
1、cd /www/server/php/80/src/ext/ffi 
2、phpize
3、./configure CFLAGS="-std=c99" --with-php-config=/www/server/php/80/bin/php-config
4、make 
5、make install

开启FFI
在 php.ini 中启用 extension=ffi
在 php.ini 中将 ffi.enable 选项设置为 true

以下是调用实例:

    private static $sendchannelcode ='';
    public static function attachSign($data) {
        $ffiPath = root_path().'vstk'.DIRECTORY_SEPARATOR.'libJITClientAPI64.so'; // 替换为库的实际路径
        $ffi =\FFI::cdef(<<<EOF
        unsigned char;
        typedef void* HANDLE;
        typedef unsigned char BYTE;
        typedef const char* LPCSTR;
        typedef char* LPSTR;
        void *memcpy(void *dest, const void *src, size_t n);
        long InitServerConnectEx(HANDLE* phContext, LPCSTR pszServerIP, long lServerPort);
        long SetConfigFilePath(HANDLE hContext, LPCSTR pszPaths);
        long AttachSignEx(HANDLE hContext, LPCSTR pszDN, BYTE* pSrcData, long lSrcLen, LPSTR* ppSignedData, long* plSignedDataLen);
        long GetDataEx(HANDLE hContext, BYTE* pData, long* plDataLen);
        long GetCertInfoEx(HANDLE hContext, LPCSTR pszType, long lIndex, LPCSTR pszParam, LPSTR pszInfo, long* plInfoLen);
        long AttachSignGEx(HANDLE hContext, const char* lpszDN, const char* lpszDigestAlg, const BYTE* pszOrgData, const long nOrgDataLen, BYTE* pszSignDataBuf, long* pSignDataBufLen);
        void FinalizeServerConnectEx(HANDLE* phContext);
        typedef struct {int array[10];} MyStruct;
        EOF,$ffiPath);
        $hContext =$ffi->new("HANDLE");
        $pszServerIP='117.73.19.167';
        $lServerPort = 8003;
        $norgDataLen=strlen($data);
        $signDatacontent =$ffi->new("BYTE[$norgDataLen]",0);
        $ffi->memcpy($signDatacontent,$data,$norgDataLen);//复制内容到内存地址
        $pDataBufLen =$ffi->new('long',0);
        $pDataBufLenAddr = \FFI::addr($pDataBufLen);
        // 初始化服务器连接
        $lRet =$ffi->InitServerConnectEx(\FFI::addr($hContext),$pszServerIP,$lServerPort);
        if ($lRet != 0) {
            echo "InitServerConnectEx error: " . $lRet;
            return $lRet;
        }
        // 设置配置文件路径
        $path=root_path().DIRECTORY_SEPARATOR."vstk";
        $lRet = $ffi->SetConfigFilePath($hContext, $path);
        if ($lRet != 0) {
            echo "SetConfigFilePath error: " . $lRet;
            $ffi->FinalizeServerConnectEx($hContext);
            return $lRet;
        }
        $lRet= $ffi->AttachSignGEx($hContext,self::$sendchannelcode,"SM3",$signDatacontent,$norgDataLen,NULL,$pDataBufLenAddr);
        if($lRet!=0){
            echo "AttachSignGEx error:";
            return $lRet;
        }
        // 申请 Base64 签名结果缓存
        // 获取结果数据
        $dataBuf =$ffi->new("BYTE[$pDataBufLen->cdata]",0);
        $lRet = $ffi->GetDataEx($hContext,$dataBuf,$pDataBufLenAddr);
        if($lRet!=0){
            echo "GetDataEx error:";
            return $lRet;
        }
        $ffi->FinalizeServerConnectEx(\FFI::addr($hContext));
        $sign=\FFI::string($dataBuf,$pDataBufLen->cdata);
        $base64=base64_encode($sign);
        return   $base64;
    }

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逍遥596607010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值