-rw-r--r-- 4980 cryptattacktester-20231020/isd0_params.cpp raw
#include <cassert>
#include "selection.h"
#include "isd0_params.h"
using namespace std;
bool isd0_params_valid(const vector<bigint> ¶ms,const vector<bigint> &attackparams)
{
  bigint N = params.at(0);
  bigint K_orig = params.at(1);
  bigint W = params.at(2);
  bigint pos = 0;
  bigint ITERS = attackparams.at(pos++);
  bigint RESET = attackparams.at(pos++);
  bigint X = attackparams.at(pos++);
  bigint YX = attackparams.at(pos++); auto Y = X+YX;
  bigint P = attackparams.at(pos++);
  bigint L = attackparams.at(pos++);
  bigint Z = attackparams.at(pos++);
  bigint QUEUE_SIZE = attackparams.at(pos++);
  bigint QF = attackparams.at(pos++); auto PERIOD = QF*QUEUE_SIZE;
  bigint FW = attackparams.at(pos++);
  if (attackparams.size() != pos) return 0;
  bigint K = K_orig-FW;
  if (ITERS < 1) return 0;
  if (RESET < 1) return 0;
  if (ITERS%RESET != 0) return 0;
  if (P < 0) return 0;
  if (P > W) return 0;
  if (L < 0) return 0;
  if (L > N-K-(W-P)) return 0;
  if (X < 1) return 0;
  if (X > N-K-L) return 0;
  if (Y < X) return 0;
  if (Y > K+L) return 0;
  if (Z < 0) return 0;
  if (Z > K+L-P) return 0;
  if (QUEUE_SIZE < 1) return 0;
  if (PERIOD < 1) return 0;
  if (P > 0 && L > 0 && QF*QUEUE_SIZE >= 2*binomial(K+L-Z,P)) return 0;
  if (FW < 0) return 0;
  if (FW > 1) return 0;
  return 1;
}
void isd0_params(const vector<bigint> ¶ms,map<string,string> &S,int (*callback)(const vector<bigint> &))
{
  bigint N = params.at(0);
  bigint K_orig = params.at(1);
  bigint W = params.at(2);
  bigint FWmin = 0;
  bigint FWmax = 1;
  selection_constrain(S,"FW",FWmin,FWmax);
  for (bigint FW = 0;FW <= 1;++FW) {
    if (FW < FWmin) continue;
    if (FW > FWmax) continue;
    bigint K = K_orig-FW;
    bigint Pmin = 1;
    bigint Pmax = 3;
    selection_constrain(S,"P",Pmin,Pmax);
    for (bigint P = Pmin;P <= Pmax;++P) {
      if (P < 0) continue;
      if (P > W) continue;
      bigint Lmin = 10;
      bigint Lmax = 20;
      selection_constrain(S,"L",Lmin,Lmax);
      for (bigint L = Lmin;L <= Lmax;++L) {
        if (L < 0) continue;
        if (L > N-K-(W-P)) continue;
        bigint ITERSmin = 1;
        bigint ITERSmax = (16*binomial(N,W))/(binomial(K,P)*binomial(N-K-L,W-P));
        if (ITERSmax > 1024) ITERSmax = 1024;
        selection_constrain(S,"I",ITERSmin,ITERSmax);
        if (ITERSmin < 1) continue;
        for (bigint ITERS = ITERSmin;ITERS <= ITERSmax;ITERS *= 2) {
          if (ITERS < 1) break;
          bigint Zmin = 0;
          bigint Zmax = L;
          selection_constrain(S,"Z",Zmin,Zmax);
          for (bigint Z = Zmin;Z <= Zmax;Z += (L > 0 ? L : bigint(1))) {
            if (Z < 0) continue;
            if (Z > K+L-P) continue;
            bigint Xmin = 1;
            bigint Xmax = 8;
            selection_constrain(S,"X",Xmin,Xmax);
            if (Xmin < 1) continue;
            for (bigint X = Xmin;X <= Xmax;X *= 2) {
              if (X < 1) break;
              if (X > N-K-L) continue;
              bigint RESETmin = 1;
              bigint RESETmax = 1024;
              if (X > 1) RESETmin = 2;
              selection_constrain(S,"RE",RESETmin,RESETmax);
              if (RESETmin < 1) continue;
              for (bigint RESET = RESETmin;RESET <= RESETmax;RESET *= 2) {
                if (RESET < 1) break;
                if (ITERS%RESET != 0) continue;
                bigint YXdiffmin = 1;
                while ((RESET>>YXdiffmin) > 0) ++YXdiffmin;
                bigint YXdiffmax = YXdiffmin+5;
                if (RESET == 1) YXdiffmin = YXdiffmax = 1;
                selection_constrain(S,"YX",YXdiffmin,YXdiffmax);
                if (YXdiffmin < 0) continue;
                for (bigint YXdiff = YXdiffmin;YXdiff <= YXdiffmax;++YXdiff) {
                  bigint Y = X+YXdiff;
                  if (Y < X) continue;
                  if (Y > K+L) continue;
                  bigint QFmin = 1;
                  bigint QFmax = 1024;
                  if (P == 0 || L == 0) QFmax = 1;
                  selection_constrain(S,"QF",QFmin,QFmax);
                  if (QFmin < 1) continue;
                  for (bigint QF = QFmin;QF <= QFmax;QF *= 2) {
                    if (QF < 1) break;
                    bigint QUEUE_SIZEmin = 1;
                    bigint QUEUE_SIZEmax = 8;
                    if (P == 0 || L == 0) QUEUE_SIZEmax = 1;
                    selection_constrain(S,"QU",QUEUE_SIZEmin,QUEUE_SIZEmax);
                    if (QUEUE_SIZEmin < 1) continue;
                    for (bigint QUEUE_SIZE = QUEUE_SIZEmin;QUEUE_SIZE <= QUEUE_SIZEmax;QUEUE_SIZE *= 2) {
                      if (QUEUE_SIZE < 1) break;
                      if (P > 0 && L > 0 && QF*QUEUE_SIZE >= 2*binomial(K+L-Z,P)) continue;
                      vector<bigint> Q{ITERS,RESET,X,Y-X,P,L,Z,QUEUE_SIZE,QF,FW};
                      if (callback(Q) < 0) return;
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}