Результаты вывода SPIN

Я написал код Promela для проверки протокола Needham-Schroeder с использованием SPIN. После запуска случайного моделирования кода я получаю этот вывод:

  0:    proc  - (:root:) creates proc  0 (:init:)
Starting PIni with pid 1
  1:    proc  0 (:init:) creates proc  1 (PIni)
0 :init ini run PIni(A,I,N 
Starting PRes with pid 2
  3:    proc  0 (:init:) creates proc  2 (PRes)
0 :init ini run PRes(B,Nb) 
Starting PI with pid 3
  4:    proc  0 (:init:) creates proc  3 (PI)
0 :init ini run PI()       
1 PIni  62  else           
1 PIni  63  1              
1 PIni  64  ca!self,nonce, 
3 PI    128 ca?,x1,x2,x3   
1 PIni  64  values: 1!A,Na 
3 PI    128 values: 1?0,Na 
Process Statement          PI(3):kNa  PI(3):x1   PI(3):x2   PI(3):x3   
3 PI    135 x3 = 0         1          0          0          I          
3 PI    101 ca!B,gD,A,B    1          0          0          0          
2 PRes  79  ca?eval(self), 1          0          0          0          
3 PI    101 values: 1!B,gD 1          0          0          0          
2 PRes  79  values: 1?B,gD 1          0          0          0          
Process Statement          PI(3):kNa  PI(3):x1   PI(3):x2   PI(3):x3   PRes(2):g2 PRes(2):g3 
2 PRes  80  g3==A)&&(self= 1          0          0          0          gD         A          
2 PRes  80  ResRunningAB = 1          0          0          0          gD         A          
Process Statement          PI(3):kNa  PI(3):x1   PI(3):x2   PI(3):x3   PRes(2):g2 PRes(2):g3 ResRunning 
2 PRes  82  ca!self,g2,non 1          0          0          0          gD         A          1          
3 PI    128 ca?,x1,x2,x3   1          0          0          0          gD         A          1          
2 PRes  82  values: 1!B,gD 1          0          0          0          gD         A          1          
3 PI    128 values: 1?0,gD 1          0          0          0          gD         A          1          
3 PI    135 x3 = 0         1          0          0          A          gD         A          1          
3 PI    113 ca!( (kNa) ->  1          0          0          0          gD         A          1          
1 PIni  68  ca?eval(self), 1          0          0          0          gD         A          1          
3 PI    113 values: 1!A,Na 1          0          0          0          gD         A          1          
1 PIni  68  values: 1?A,Na 1          0          0          0          gD         A          1          
Process Statement          PI(3):kNa  PI(3):x1   PI(3):x2   PI(3):x3   PIni(1):g1 PRes(2):g2 PRes(2):g3 ResRunning 
1 PIni  69  else           1          0          0          0          Na         gD         A          1          
1 PIni  69  1              1          0          0          0          Na         gD         A          1          
1 PIni  71  cb!self,g1,par 1          0          0          0          Na         gD         A          1          
3 PI    139 cb?,x1,x2      1          0          0          0          Na         gD         A          1          
1 PIni  71  values: 2!A,Na 1          0          0          0          Na         gD         A          1          
3 PI    139 values: 2?0,Na 1          0          0          0          Na         gD         A          1          
3 PI    145 x2 = 0         1          0          I          0          Na         gD         A          1          
timeout
#processes: 4
 34:    proc  3 (PI) needhamNew.pml:100 (state 81)
 34:    proc  2 (PRes) needhamNew.pml:86 (state 10)
 34:    proc  1 (PIni) needhamNew.pml:73 (state 18)
 34:    proc  0 (:init:) needhamNew.pml:58 (state 8)
4 processes created

Я вижу, что созданные процессы предназначены для Инициатора, Ответчика и Злоумышленника. Мне трудно понять, как именно это доказывает, что протокол Нидхема-Шредера может быть взломан, хотя я понимаю его теорию.

Может ли кто-нибудь понять этот вывод и, возможно, направить меня туда, где я должен искать? Если вы хотите просмотреть мой код Promela, сообщите мне об этом! Любые отзывы приветствуются!


person Ishy    schedule 24.11.2015    source источник
comment
Мой ответ не достоин даже голосования? Или лучше поставить «галочку» в качестве правильного ответа?   -  person GoZoner    schedule 09.01.2016


Ответы (1)


Ближе к концу вывода вы видите timeout - это означает, что дальнейший прогресс невозможен, что обычно указывает на какой-то тупик. В списке процессов (в конце) вы видите номера строк, и ни одна из них не помечена как допустимое состояние end. Поэтому либо у вас есть настоящий тупик, либо ваша модель неверна, потому что она не может определить свое действительное конечное состояние (я).

person GoZoner    schedule 16.12.2015
comment
Большое спасибо за ваш отзыв! Что вы предлагаете мне делать? Я не могу понять, есть ли в коде, который я написал, ошибка или он должен дать мне этот вывод. Похоже, никаких признаков атаки злоумышленника на протокол нет. Какой следующий шаг я могу сделать? - person Ishy; 18.12.2015
comment
Во-первых, убедитесь, что вы отметили допустимые конечные состояния в каждом proctype. См. документацию SPIN о а) значении конечных состояний и б) о том, как их пометить (меткой, начинающейся с end‹AnythingElse›:). По сути, если тестируемый протокол не содержит ошибок, все процессы должны многократно проходить через допустимые конечные состояния ( или достичь конца proctype, что неявно является допустимым конечным состоянием). - person GoZoner; 18.12.2015
comment
Во-вторых, отметив конечные состояния, если происходит тайм-аут, вам нужно проанализировать, по сути, вручную, что вызвало взаимоблокировку. Это означает отслеживание выходных данных и понимание каждого шага, предпринятого каждым процессом. Распечатка показывает предпринятые шаги. - person GoZoner; 18.12.2015
comment
В-третьих, вы запустили SPIN в режиме «симуляции». Альтернативой является запуск SPIN в режиме «проверки»; при возникновении ошибки вы повторно запускаете SPIN с меньшей глубиной, чтобы найти наименьшее возможное количество шагов до взаимоблокировки. См. флаги '-I' и '-i' (думаю, память угасает); также необходим флаг компиляции. - person GoZoner; 18.12.2015