【问题标题】:How to pass C NULL to XS based function?如何将 C NULL 传递给基于 XS 的函数?
【发布时间】:2017-09-28 01:52:39
【问题描述】:

我正在尝试使用 Crypt::OpenSSL::EC 模块中的 Crypt::OpenSSL::EC::EC_POINT::mul() 函数。它有这样的C原型:

int EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, const EC_POINT *q, const BIGNUM *m, BN_CTX *ctx)

我需要传递 NULL,NULL 而不是 EC_POINT *qconst BIGNUM *m,因为它在这里制作:https://stackoverflow.com/a/12482384/3090865

但是这个模块有这样的类型映射:

INPUT
BIGNUM
    if( ! SvROK( $arg ) ) { croak( \"argument is not an object\" ); }
    $var = (${type}) SvIV( SvRV( $arg ) );

EC_METHOD
    if( ! SvROK( $arg ) ) { croak( \"argument is not an object\" ); }
    $var = (${type}) SvIV( SvRV( $arg ) );

EC_GROUP
    if( ! SvROK( $arg ) ) { croak( \"argument is not an object\" ); }
    $var = (${type}) SvIV( SvRV( $arg ) );

EC_POINT
    if( ! SvROK( $arg ) ) { croak( \"argument is not an object\" ); }
    $var = (${type}) SvIV( SvRV( $arg ) );

EC_KEY
    if( ! SvROK( $arg ) ) { croak( \"argument is not an object\" ); }
    $var = (${type}) SvIV( SvRV( $arg ) );

所以,如果我传递 undef 或 0,我会得到“argument is not an object”错误。 是否可以在不更改此模块的情况下制作我想要的东西?也许我可以以某种方式创建基于 NULL 的对象?

【问题讨论】:

  • “我需要传递 NULL,NULL 而不是 EC_POINT *q, const BIGNUM *m”——这没有意义。 NULL q 在 EC 术语中对应的想法是什么?无穷远点? m 也有同样的问题? NULL是否对应0?我问是因为可能有更好的方法来尝试做任何你想做的事情。

标签: perl xs


【解决方案1】:

根据 typemap,将引用传递给零 \0 应该可以工作:

Crypt::OpenSSL::EC::EC_POINT::mul($group, $r, $n, \0, \0, $ctx);

【讨论】:

  • 添加 use constant NULL => \0; 会让事情变得更好:)
  • 谢谢你,这行得通!如果消息是“参数不是参考”,我可以猜到:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 2018-08-13
  • 2016-04-20
  • 1970-01-01
  • 2014-03-07
  • 2015-05-13
相关资源
最近更新 更多