【问题标题】:erlang elixir nif char* data to binary fails for OCSP requesterlang elixir nif char * 数据到二进制文件对于 OCSP 请求失败
【发布时间】:2019-01-02 00:44:07
【问题描述】:

我正在尝试使用从 nif 返回的数据向提供者创建 OCSP 请求 我想以这种方式提出请求:

HTTPoison.post!(
    oscp_info[:access],
    :unicode.characters_to_binary(oscp_info[:data], utf8),
    [{"Content-Type", "application/ocsp-request"}],
    timeout: 1000
  )

我在 C 中有一段代码,可以将数据从 c 转换为 erlang:

static ERL_NIF_TERM CreateElixirBinary(ErlNifEnv *env, const char *str, int strLength)
{
  ERL_NIF_TERM databytes = enif_make_list(env, 0);

  for (int i=0; i < strLength; i++)
  {
    databytes = enif_make_list_cell(env, enif_make_uint(env, str[i]), databytes);
  }

  return databytes;
}

并在 C 中形成映射密钥对

enif_make_map_put(env, osp, enif_make_atom(env, "data"), CreateElixirBinary(env, baseValidationResult.certsCheckInfo[i].data, baseValidationResult.certsCheckInfo[i].dataLen),  &osp);

我有地图 oscp_info

`oscp_info = %{
  access: "http://acsk.any.provider.ua/services/ocsp/",
  crl: "http://acsk.any.provider.ua/crl/PB-S9.crl",
  data: [0, 113, 4294967247, 69, 0, 34, 4294967231, 4294967213, 0, 0, 0, 4,
   4294967272, 4294967169, 4294967187, 4294967227, 4294967201, 4294967277,
   4294967172, 13, 20, 2, 87, 85, 24, 93, 4294967256, 87, 17, 55, 4294967224, 1,
   74, 4294967238, 4294967172, 4294967239, 4294967256, 4294967236, 63,
   4294967173, 4294967186, 4294967212, 4294967208, 4294967184, 17, 4294967235,
   4294967272, ...],
  delta_crl: "http://acsk.any.provider.ua/crldelta/PB-Delta-S9.crl"
}`

如果我使用 enif_make_int 而不是 enif_make_uint 数据看起来像:

data: [0, 113, -49, 69, 0, 34, -65, -83, 0, 0, 0, 4, -24, -127, -109, -69,
   -95, -19, -124, 13, 20, 2, 87, 85, 24, 93, -40, 87, 17, 55, -72, 1, 74, -58,
   -124, -57, -40, -60, 63, -123, -110, -84, -88, -112, 17, -61, -24, ...]

问题是数据既不能转换为 unicode 也不能转换为二进制,所以我不能发出 http 请求 我应该如何从 nif 返回数据 (char*) 才能发出请求?

【问题讨论】:

  • 你正在制作列表,而更糟的是相反的顺序。
  • 没有反转,但是是的,创建elixir二进制的方式是错误的
  • 绝对颠倒了。这是你实现lists:reverse/1,2的方式。
  • 不,enif_make_list_cell 添加列表头。反向不是 nif 或者我错过了什么? github.com/blackberry/Erlang-OTP/blob/master/lib/stdlib/src/…
  • 你把第 1 个字节作为头到空列表,所以你得到 [1|[]] = [1]。然后你把 2ns 字节作为前一个列表的头,所以你得到 [2|[1] = [2,1]。然后你把第 3 个字节作为前一个字节,这样你得到 [3,|[2,1]] = [3,2,1]。见。

标签: ssl erlang elixir ocsp httpoison


【解决方案1】:

从c中形成erlang二进制的正确方法:

ErlNifBinary derDataBin;

enif_alloc_binary(baseValidationResult.certsCheckInfo[i].dataLen, &derDataBin);

memcpy(derDataBin.data, baseValidationResult.certsCheckInfo[i].data, 

baseValidationResult.certsCheckInfo[i].dataLen);

ERL_NIF_TERM derData = enif_make_binary(env, &derDataBin);

【讨论】:

    猜你喜欢
    • 2012-03-20
    • 2012-07-04
    • 2014-11-22
    • 2014-12-17
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多