我正在为 contiki os 移植椭圆曲线密码学(基于纯 c)。我收到分段错误的错误。我使用 xxgdb 进行调试,但仍然找不到原因。而且我对c中的调试没有明确的想法。请帮助如何始终摆脱 c 中的这些分段错误(如何找出发生此分段错误的原因)。
这是我的源代码。
#include <stdio.h>
#include <stdint.h>
typedef uint32_t NN_DIGIT;
typedef uint64_t NN_DOUBLE_DIGIT;
/* Types for length */
typedef uint8_t NN_UINT;
typedef uint16_t NN_UINT2;
#if defined (SECP128R1) || defined (SECP128R2)
#define KEY_BIT_LEN 128
#else 
#if defined (SECP160K1) || defined (SECP160R1) || defined (SECP160R2) 
#define KEY_BIT_LEN 160
#else 
#if defined (SECP192K1) || defined (SECP192R1)
#define KEY_BIT_LEN 192
#else
#define KEY_BIT_LEN 128
#endif /* 192 */
#endif /* 160 */
#endif /* 128 */
/* Length of digit in bits */
#define NN_DIGIT_BITS 32
/* Length of digit in bytes */
#define NN_DIGIT_LEN (NN_DIGIT_BITS/8)
/* Maximum value of digit */
#define MAX_NN_DIGIT 0xffffffff
/* Number of digits in key
 * used by optimized mod multiplication (ModMultOpt) and optimized mod square (ModSqrOpt)
 *
 */
#define KEYDIGITS (KEY_BIT_LEN/NN_DIGIT_BITS) //5
/* Maximum length in digits */
#define MAX_NN_DIGITS (KEYDIGITS+1)
/* buffer size
 *should be large enough to hold order of base point
 */
#define NUMWORDS MAX_NN_DIGITS
/* the mask for ModSqrOpt */
#define MOD_SQR_MASK1 0x8000000000000000ll
#define MOD_SQR_MASK2 0x0000000100000000ll
typedef struct Point
{
    // point's coordinates
    NN_DIGIT x[NUMWORDS];
    NN_DIGIT y[NUMWORDS];
} Point;
Point pbkey_alice;
void 
NN_Encode(unsigned char *a, NN_UINT len, NN_DIGIT *b, NN_UINT digits)
{
  NN_DIGIT t;
  int j;
  unsigned int i, u;
  for(i = 0, j = len - 1; i < digits && j >= 0; i++) {
    t = b[i];
    for(u = 0; j >= 0 && u < NN_DIGIT_BITS; j--, u += 8) {
      a[j] = (unsigned char)(t >> u);
    }
  }
  for(; j >= 0; j--) {
    a[j] = 0;
  }
}
int ecc_point2octet(uint8_t *octet, NN_UINT octet_len, Point *P, int compress)
{
    if (compress){
        if(octet_len < KEYDIGITS*NN_DIGIT_LEN+1)
      {//too small octet
        return -1;
    }
    else
    {
          //compressed point representation
            if((1 & P->y[0]) == 0){
        octet[0] = 0x02;
            }
            else
                {
                octet[0] = 0x03;
                }
            NN_Encode(octet+1, KEYDIGITS*NN_DIGIT_LEN, P->x, KEYDIGITS);
            return KEYDIGITS*NN_DIGIT_LEN+1;
      }
    }
  else
  {//non compressed
     if(octet_len < 2*KEYDIGITS*NN_DIGIT_LEN+1)
    {
        return -1;
    }
    else
    {
            //octet[0] = 0x04;
            NN_Encode(octet+1, KEYDIGITS*NN_DIGIT_LEN, P->x, KEYDIGITS);
            NN_Encode(octet+1+KEYDIGITS*NN_DIGIT_LEN, KEYDIGITS*NN_DIGIT_LEN, P->y, KEYDIGITS);
            return 2*KEYDIGITS*NN_DIGIT_LEN+1;
        }
  }
}
int main()
{
pbkey_alice.x[5] = 0x00000000;
  pbkey_alice.x[4] = 0x21961f69;
  pbkey_alice.x[3] = 0xf02d202b;
  pbkey_alice.x[2] = 0xa4b41f1a;
  pbkey_alice.x[1] = 0x0aa08a86;
  pbkey_alice.x[0] = 0xdf27908d;
  pbkey_alice.y[5] = 0x00000000;
  pbkey_alice.y[4] = 0x378e1278;
  pbkey_alice.y[3] = 0x62836d75;
  pbkey_alice.y[2] = 0x7acb7ca4;
  pbkey_alice.y[1] = 0x0dc0ad13;
  pbkey_alice.y[0] = 0x741e287c;
uint8_t *C;
int C_len = 2*KEYDIGITS*NN_DIGIT_LEN + 1 + 20 + 20;
int oct_len = ecc_point2octet(C, C_len, &pbkey_alice, 0);
}