Ejemplo n.º 1
0
int main()
{
    Cnt = 0;
    MakePrime();
    int N, M, i, j, Min, Sum;
    scanf("%d %d", &N, &M);
    for(i = 0; i < N; ++i) {
        for(j = 0; j < M; ++j) {
            scanf("%d", &Map[i][j]);
            Map[i][j] = Fun(Map[i][j]);
        }
    }
    Min = 0x7fffffff;
    for(i = 0; i < N; ++i) {
        for(Sum = j = 0; j < M; ++j) {
            Sum += Map[i][j];
        }
        if(Sum < Min) {
            Min = Sum;
        }
    }
    for(j = 0; j < M; ++j) {
        for(Sum = i = 0; i < N; ++i) {
            Sum += Map[i][j];
        }
        if(Sum < Min) {
            Min = Sum;
        }
    }
    printf("%d\n", Min);
    return 0;
}
BOOL CALLBACK MainDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
  WORD wmId;
  WORD wmEvent;

  MakePrimeParams Params;
 //----------------------------------------------------------------------------
 //-- WM_INITDIALOG -----------------------------------------------------------
 //----------------------------------------------------------------------------
  if(wMsg==WM_INITDIALOG)
  {
    //
    ::SetWindowText(hDlg, TEXT(PROGRAM_NAME));
    // IDC_BASE_LIST
    SendMessage(GetDlgItem(hDlg,IDC_BASE_LIST), LB_ADDSTRING, 0, (LPARAM)TEXT("10"));
    SendMessage(GetDlgItem(hDlg,IDC_BASE_LIST), LB_ADDSTRING, 1, (LPARAM)TEXT("16L"));
    SendMessage(GetDlgItem(hDlg,IDC_BASE_LIST), LB_ADDSTRING, 2, (LPARAM)TEXT("16U"));
    SendMessage(GetDlgItem(hDlg,IDC_BASE_LIST), LB_ADDSTRING, 3, (LPARAM)TEXT("32"));
    SendMessage(GetDlgItem(hDlg,IDC_BASE_LIST), LB_ADDSTRING, 4, (LPARAM)TEXT("62"));
    //
    //
    SendMessage(GetDlgItem(hDlg,IDC_BASE_LIST), LB_SETCURSEL, 1, (LPARAM)0);
    // IDC_EDIT1
    SendMessage(GetDlgItem(hDlg, IDC_EDIT1), EM_LIMITTEXT, 1023, (LPARAM)0);
    SendMessage(GetDlgItem(hDlg, IDC_EDIT1), WM_SETTEXT, 0, (LPARAM)TEXT(EDIT1_DEFAULT_VALUE_STR));
    // IDC_BLUME_CHECK
    SendMessage(GetDlgItem(hDlg, IDC_BLUME_CHECK), BM_SETCHECK, BST_CHECKED, 0);
    // IDC_SAFE_CHECK
    SendMessage(GetDlgItem(hDlg, IDC_SAFE_CHECK), BM_SETCHECK, BST_UNCHECKED, 0);
    //
    SetLabelUI(hDlg, IDC_BITS_STT, 0xFFFFFFFF);
    SetLabelUI(hDlg, IDC_TRUES_STT, 0xFFFFFFFF);

    return TRUE;
  }
//----------------------------------------------------------------------------
//-- WM_CLOSE ----------------------------------------------------------------
//----------------------------------------------------------------------------
  else if(wMsg==WM_CLOSE)
  {
   if(!Busy)
   {
    EndDialog(hDlg, 0);
   }
   // PostQuitMessage(0);//if (wmId == IDOK || wmId == IDCANCEL){EndDialog(hDlg, wmId);}
   return !Busy;
  }
//----------------------------------------------------------------------------
//-- WM_COMMAND --------------------------------------------------------------
//----------------------------------------------------------------------------
  else if(wMsg==WM_COMMAND)
  {
   wmId    = LOWORD(wParam);
   wmEvent = HIWORD(wParam);
//----------------------------------------------------------------------------
//-- WM_COMMAND:IDC_BASE_LIST:LBN_SELCHANGE ------------------------------------
//----------------------------------------------------------------------------
   if(wmId==IDC_BASE_LIST&&(wmEvent==LBN_SELCHANGE))
   {
    if(!Busy)
    {
     INT SLen=::SendMessage(GetDlgItem(hDlg, IDC_EDIT1), EM_LINELENGTH, 0, 0);
       if((SLen>0)&&GetEdit1TextAsMPZ(hDlg, Params.mpzP))
       {
        mpz_clear(Params.mpzP);
       }
    }
   }
//----------------------------------------------------------------------------
//-- WM_COMMAND:IDC_SAFE_CHECK:BN_CLICKED ------------------------------------
//----------------------------------------------------------------------------
   else if(wmId==IDC_SAFE_CHECK&&(wmEvent==BN_CLICKED))
   {
     if(BST_CHECKED==
         (SendMessage(GetDlgItem(hDlg, IDC_SAFE_CHECK), BM_GETCHECK, 0, 0))
       )
     {
      SendMessage(GetDlgItem(hDlg, IDC_BLUME_CHECK), BM_SETCHECK, 1, 0);
      EnableWindow(GetDlgItem(hDlg, IDC_BLUME_CHECK), 0);
     }
     else
     {
      EnableWindow(GetDlgItem(hDlg, IDC_BLUME_CHECK), 1);
     }
   }
//----------------------------------------------------------------------------
//-- WM_COMMAND:IDC_EDIT1:EN_CHANGE ------------------------------------------
//----------------------------------------------------------------------------
   else if(wmId==IDC_EDIT1&&(wmEvent==EN_CHANGE))
   {
    if(!Busy)
    {
     INT SLen=::SendMessage(GetDlgItem(hDlg, IDC_EDIT1), EM_LINELENGTH, 0, 0);
       if((SLen>0)&&GetEdit1TextAsMPZ(hDlg, Params.mpzP))
       {
        mpz_clear(Params.mpzP);
       }
       else if(SLen>0)
       {
        ::MessageBox(hDlg,TEXT(ERR_BAD_INPUT_001_STR),TEXT(PROGRAM_NAME),MB_OK); 
       }
    }
   }
//----------------------------------------------------------------------------
//-- IDC_NEXT_PRIME_BUTTON ---------------------------------------------------
//----------------------------------------------------------------------------
   else if(wmId==IDC_NEXT_PRIME_BUTTON)
   {
    if(!Busy)
    {
     ::SetWindowText(GetDlgItem(hDlg, IDC_NEXT_PRIME_BUTTON), TEXT("Abort"));
     Busy=TRUE;
     SetLabelUI(hDlg, IDC_TEST1N_STT, 0xFFFFFFFF);
     SetLabelUI(hDlg, IDC_TEST2N_STT, 0xFFFFFFFF);
     SetLabelUI(hDlg, IDC_TEST3N_STT, 0xFFFFFFFF);

     EnableElements(hDlg, &InputGBList[0], ARRAYSIZE(InputGBList), 0);
     EnableElements(hDlg, &BaseGBList[0], ARRAYSIZE(BaseGBList), 0);
     EnableElements(hDlg, &OptsGBList[0], ARRAYSIZE(OptsGBList), 0);
     EnableElements(hDlg, &ParamsGBList[0], ARRAYSIZE(ParamsGBList), 0);

     memset(&Params, 0, sizeof(Params));
     Params.Blum=IsChecked(hDlg, IDC_BLUME_CHECK);
     Params.hWnd=hDlg;
       if(GetEdit1TextAsMPZ(hDlg, Params.mpzP))
       {
         if(mpz_sizeinbase(Params.mpzP, 2)>MAX_BITS)
         {
          ::MessageBox(hDlg,TEXT(ERR_TOO_BIG_001_STR),TEXT(PROGRAM_NAME),MB_OK);
         }
         else
         {
          if(IsChecked(hDlg, IDC_SAFE_CHECK))
          {
           if(mpz_sizeinbase(Params.mpzP, 2)>MAX_BITS_FOR_SAFE)
           {
            ::MessageBox(hDlg,TEXT(ERR_TOO_BIG_002_STR),TEXT(PROGRAM_NAME),MB_OK);
           }
           else MakeSafePrime(&Params);
          }                   
           else
             {MakePrime(&Params);}

          SetEdit1TextFromMPZ(hDlg, Params.mpzP);
         }
        mpz_clear(Params.mpzP);
       }
       else
       {
        ::MessageBox(hDlg,TEXT(ERR_BAD_INPUT_001_STR),TEXT(PROGRAM_NAME),MB_OK); 
       }
      if(Busy==FALSE)
      {
       ::MessageBox(hDlg,TEXT(ERR_ABORTED_001_STR),TEXT(PROGRAM_NAME),MB_OK);
      }
     EnableElements(hDlg, &InputGBList[0], ARRAYSIZE(InputGBList), 1);
     EnableElements(hDlg, &BaseGBList[0], ARRAYSIZE(BaseGBList), 1);
     EnableElements(hDlg, &OptsGBList[0], ARRAYSIZE(OptsGBList), 1);
     EnableElements(hDlg, &ParamsGBList[0], ARRAYSIZE(ParamsGBList), 1);
     SendMessage(GetDlgItem(hDlg, IDC_SAFE_CHECK), BM_SETCHECK, 0, 0);

     SetLabelUI(hDlg, IDC_TEST1N_STT, Params.Cnt[0]);
     SetLabelUI(hDlg, IDC_TEST2N_STT, Params.Cnt[1]);
     SetLabelUI(hDlg, IDC_TEST3N_STT, Params.Cnt[2]);
     SetLabelUI(hDlg, IDC_SECS_STT,   Params.mSecs);
     ::SetWindowText(GetDlgItem(hDlg, IDC_NEXT_PRIME_BUTTON), TEXT("Make prime"));
     ::FlashWindow(hDlg, 1);
     Busy=FALSE;
    }
    else
    {
     Busy=FALSE;
    }

   }
   return TRUE; 
  }
 return FALSE; 
}//--//
Ejemplo n.º 3
0
bool RsaDevice_GenEaSigningRequest(RsaDevice d,
    X509_REQ* req, BIGNUM* delta_x, BIGNUM* delta_y,
    BIGNUM* rand_n, ProductEvidence* ev)
{
  BN_zero(delta_x);
  BN_zero(delta_y);

  PrintTime("Calculating x+x' and y+y'");
  // p = x + x'
  CHECK_CALL(d->p = BN_dup(d->x));
  CHECK_CALL(BN_add(d->p, d->p, d->x_prime));

  // q = y + y'
  CHECK_CALL(d->q = BN_dup(d->y));
  CHECK_CALL(BN_add(d->q, d->q, d->y_prime));
  PrintTime("...done");

  PrintTime("Making finding deltas to make p and q prime");
  if(!MakePrime(d->params, d->p, &delta_x, RsaParams_GetCtx(d->params)))
    return false;

  if(!MakePrime(d->params, d->q, &delta_y, RsaParams_GetCtx(d->params)))
    return false;
  PrintTime("...done");

  PrintTime("Adding deltas to p and q");
  // p = x + x' + delta_x
  CHECK_CALL(BN_add(d->p, d->p, delta_x));

  // q = y + y' + delta_y
  CHECK_CALL(BN_add(d->q, d->q, delta_y));
  PrintTime("...done");

  PrintTime("Calculating n");
  // n = p*q
  CHECK_CALL(d->n = BN_new());
  CHECK_CALL(BN_mul(d->n, d->p, d->q, RsaParams_GetCtx(d->params)));
  ASSERT(BN_cmp(d->n, IntegerGroup_GetQ(RsaParams_GetGroup(d->params))) == -1);
  PrintTime("...done");

  const_IntegerGroup group = RsaParams_GetGroup(d->params);

  // Get randomness for commitment to n
  PrintTime("Picking r_n");
  BIGNUM* r_n = IntegerGroup_RandomExponent(group);
  CHECK_CALL(r_n);
  CHECK_CALL(BN_copy(rand_n, r_n));
  BN_clear_free(r_n);
  PrintTime("...done");

  PrintTime("Generating commits to p,q,n");
  // Commit to p
  BIGNUM* commit_p = IntegerGroup_Commit(group, d->p, d->rand_p);
  CHECK_CALL(commit_p);

  // Commit to q
  BIGNUM* commit_q = IntegerGroup_Commit(group, d->q, d->rand_q);

  // Commit to n
  BIGNUM* commit_n = IntegerGroup_Commit(group, d->n, rand_n);
  PrintTime("...done");

  /*
  printf("C(p) = "); BN_print_fp(stdout, commit_p); puts("");
  printf("C(q) = "); BN_print_fp(stdout, commit_q); puts("");
  printf("C(n) = "); BN_print_fp(stdout, commit_n); puts("");
  */
 
  PrintTime("Generating prodproof");
  ProductStatement st = ProductStatement_New(RsaParams_GetGroup(d->params),
      commit_p, commit_q, commit_n);
  PrintTime("...done");

  // Generate proof that n = p*q
  PrintTime("Generating prodevidence");
  *ev = ProductEvidence_New(st, d->p, d->rand_p, d->rand_q, rand_n);
  PrintTime("...done");

  ProductStatement_Free(st);

  BN_clear_free(commit_p);
  BN_clear_free(commit_q);
  BN_clear_free(commit_n);

  CHECK_CALL(req);
  PrintTime("Generating certificate");
  CHECK_CALL(GenerateCertRequest(d, req));
  PrintTime("...done");

  return true;
}