int test_tostr(testspec_t *t, FILE *ofp)
{
  mp_int    in[2];
  int       radix;
  mp_result res, len;

  if(!parse_int_values(t, in, NULL, NULL))
    return imath_errno = MP_BADARG, 0;

  if((res = mp_int_to_int(in[1], &radix)) != MP_OK)
    return imath_errno = MP_BADARG, 0;

  if(radix < MP_MIN_RADIX || radix > MP_MAX_RADIX)
    return imath_errno = MP_RANGE, 0;

  trim_line(t->output[0]);

  len = mp_int_string_len(in[0], radix);

  if((res = mp_int_to_string(in[0], radix, g_output, len)) != MP_OK)
    return imath_errno = res, 0;

  if(strcmp(t->output[0], g_output) != 0) 
    return imath_errno = OTHER_ERROR, 0;

  return 1;
}
Exemple #2
0
void      rsa_key_write(rsa_key *kp, FILE *ofp)
{
  int   len;
  char *obuf;

  len = mp_int_string_len(&(kp->n), 10);
  obuf = malloc(len);
  mp_int_to_string(&(kp->p), 10, obuf, len);
  fprintf(ofp, "p = %s\n", obuf);
  mp_int_to_string(&(kp->q), 10, obuf, len);
  fprintf(ofp, "q = %s\n", obuf);
  mp_int_to_string(&(kp->e), 10, obuf, len);
  fprintf(ofp, "e = %s\n", obuf);
  mp_int_to_string(&(kp->d), 10, obuf, len);
  fprintf(ofp, "d = %s\n", obuf);
  mp_int_to_string(&(kp->n), 10, obuf, len);
  fprintf(ofp, "n = %s\n", obuf);

  free(obuf);
}
Exemple #3
0
int main(int argc, char *argv[])
{
  mp_size   radix = 10;  /* Default output radix */
  mpq_t     value;
  mp_result res;
  char      *endp;

  if(argc < 2) {
    fprintf(stderr, "Usage: input <value> [output-base]\n");
    return 1;
  }
  if(argc > 2) {
    if((radix = atoi(argv[2])) < MP_MIN_RADIX ||
       (radix > MP_MAX_RADIX)) {
      fprintf(stderr, "Error:  Specified radix is out of range (%d)\n",
	      radix);
      return 1;
    }
  }

  /* Initialize a new value, initially zero; illustrates how to check
     for errors (e.g., out of memory) and display a message.  */
  if((res = mp_rat_init(&value)) != MP_OK) {
    fprintf(stderr, "Error in mp_rat_init(): %s\n", 
	    mp_error_string(res));
    return 1;
  }

  /* Read value in base 10 */
  if((res = mp_rat_read_ustring(&value, 0, argv[1], &endp)) != MP_OK) {
    fprintf(stderr, "Error in mp_rat_read_ustring(): %s\n",
	    mp_error_string(res));
    
    if(res == MP_TRUNC)
      fprintf(stderr, " -- remaining input is: %s\n", endp);
    
    mp_rat_clear(&value);
    return 1;
  }
  
  printf("Here is your value in base %d\n", radix);
  {
    mp_result buf_size, res;
    char *obuf;

    if(mp_rat_is_integer(&value)) {
      /* Allocate a buffer big enough to hold the given value, including
	 sign and zero terminator. */
      buf_size = mp_int_string_len(MP_NUMER_P(&value), radix);
      obuf = malloc(buf_size);

      /* Convert the value to a string in the desired radix. */
      if((res = mp_int_to_string(MP_NUMER_P(&value), radix, 
				 obuf, buf_size)) != MP_OK) {
	fprintf(stderr, "Converstion to base %d failed: %s\n",
		radix, mp_error_string(res));
	mp_rat_clear(&value);
	return 1;
      }
    } 
    else {
      /* Allocate a buffer big enough to hold the given value, including
	 sign and zero terminator. */
      buf_size = mp_rat_string_len(&value, radix);
      obuf = malloc(buf_size);

      /* Convert the value to a string in the desired radix. */
      if((res = mp_rat_to_string(&value, radix, obuf, buf_size)) != MP_OK) {
	fprintf(stderr, "Conversion to base %d failed: %s\n",
		radix, mp_error_string(res));
	mp_rat_clear(&value);
	return 1;
      }
    }
    fputs(obuf, stdout);
    fputc('\n', stdout);
    free(obuf);
  }

  /* When you are done with a value, it must be "cleared" to release
     the memory it occupies */
  mp_rat_clear(&value);
  return 0;
}
Exemple #4
0
int main(int argc, char *argv[])
{
  int       opt, modbits;
  FILE     *ofp = stdout;
  mp_result res;
  find_f    find_func = find_prime;
  char      tag = 'p';
  mpz_t     value;

  /* Process command-line arguments */
  while((opt = getopt(argc, argv, "s")) != EOF) {
    switch(opt) {
    case 's':
      find_func = find_strong_prime;
      tag = 'P';
      break;
    default:
      fprintf(stderr, "Usage: randprime [-s] <bits> [<outfile>]\n");
      return 1;
    }
  }
  
  if(optind >= argc) {
    fprintf(stderr, "Error:  You must specify the number of significant bits.\n");
    fprintf(stderr, "Usage: randprime [-s] <bits> [<outfile>]\n");
    return 1;
  }
  modbits = (int) strtol(argv[optind++], NULL, 0);
  if(modbits < CHAR_BIT) {
    fprintf(stderr, "Error:  Invalid value for number of significant bits.\n");
    return 1;
  }
  if(modbits % 2 == 1)
    ++modbits;

  /* Check if output file is specified */
  if(optind < argc) {
    if((ofp = fopen(argv[optind], "wt")) == NULL) {
      fprintf(stderr, "Error:  Unable to open output file for writing.\n"
	      " - Filename: %s\n"
	      " - Error:    %s\n", argv[optind], strerror(errno));
      return 1;
    }
  }
  
  mp_int_init(&value);
  if ((res = mp_int_randomize(&value, modbits - 1)) != MP_OK) {
    fprintf(stderr, "Error:  Unable to generate random start value.\n"
	    " - %s (%d)\n", mp_error_string(res), res);
    goto EXIT;
  }
  fprintf(stderr, "%c: ", tag);
  find_func(&value, stderr);
  fputc('\n', stderr);

  /* Write the completed value to the specified output file */
  {
    int len;
    char *obuf;

    len = mp_int_string_len(&value, 10);
    obuf = malloc(len);
    mp_int_to_string(&value, 10, obuf, len);
    fputs(obuf, ofp);
    fputc('\n', ofp);

    free(obuf);
  }

 EXIT:
  fclose(ofp);
  mp_int_clear(&value);
  return 0;
}