@@ -70,7 +70,7 @@ int pipe_open(char *unique_id, int is_write, int flag_dir)
70
70
else
71
71
flag |= O_RDONLY ;
72
72
73
- int fd = open (name_buf , 40 , flag );
73
+ int fd = open (name_buf , flag );
74
74
75
75
if (fd == -1 )
76
76
{
@@ -755,6 +755,11 @@ char address[INET_NTOA_BUF_LEN+32];
755
755
int addr_success ;
756
756
int months_lifetime ;
757
757
758
+ char * vote_sig = NULL ;
759
+ char * consensus_sig = NULL ;
760
+ char * consensus_sig2 = NULL ;
761
+ int consensus_sig_count = 0 ;
762
+
758
763
/* For exit node */
759
764
int exit_node_num ;
760
765
crypto_pk_t * secret_id_key = NULL ;
@@ -1122,6 +1127,353 @@ static int generate_certificate()
1122
1127
return 0 ;
1123
1128
}
1124
1129
1130
+ int directory_configure (int fd_te , int fd_et )
1131
+ {
1132
+ /* routine for directory authority */
1133
+ // addr_success = 0;
1134
+ // months_lifetime = 0;
1135
+
1136
+ int buf_len ;
1137
+ char * tmp_buf ;
1138
+
1139
+ puts ("Directory authority initialization.\n" );
1140
+
1141
+ // identity key process
1142
+ read (fd_te , & buf_len , sizeof (int ));
1143
+ tmp_buf = (char * )malloc (buf_len + 1 );
1144
+ read (fd_te , tmp_buf , buf_len + 1 );
1145
+
1146
+ if (!strncmp (tmp_buf , "CR_IDENTITY_KEY" , buf_len )) {
1147
+ puts ("Creating identity key.\n" );
1148
+
1149
+ if (create_identity_key ()) {
1150
+ puts ("creating identity_key fail" );
1151
+ buf_len = strlen ("CR_IDENTITY_KEY_ERROR" );
1152
+ write (fd_et , & buf_len , sizeof (int ));
1153
+ write (fd_et , "CR_IDENTITY_KEY_ERROR" , buf_len + 1 );
1154
+ return 0 ;
1155
+ }
1156
+
1157
+ buf_len = strlen ("CR_IDENTITY_KEY_DONE" );
1158
+ write (fd_et , & buf_len , sizeof (int ));
1159
+ write (fd_et , "CR_IDENTITY_KEY_DONE" , buf_len + 1 );
1160
+ }
1161
+ else if (!strncmp (tmp_buf , "LD_IDENTITY_KEY" , buf_len )) {
1162
+ puts ("Load identity key.\n" );
1163
+ if (load_identity_key ()) {
1164
+ puts ("loading identity_key fail" );
1165
+ buf_len = strlen ("LD_IDENTITY_KEY_ERROR" );
1166
+ write (fd_et , & buf_len , sizeof (int ));
1167
+ write (fd_et , "LD_IDENTITY_KEY_ERROR" , buf_len + 1 );
1168
+ return 0 ;
1169
+ }
1170
+
1171
+ buf_len = strlen ("LD_IDENTITY_KEY_DONE" );
1172
+ write (fd_et , & buf_len , sizeof (int ));
1173
+ write (fd_et , "LD_IDENTITY_KEY_DONE" , buf_len + 1 );
1174
+ }
1175
+
1176
+ free (tmp_buf );
1177
+
1178
+ // signing key process
1179
+ read (fd_te , & buf_len , sizeof (int ));
1180
+ tmp_buf = (char * )malloc (buf_len + 1 );
1181
+ read (fd_te , tmp_buf , buf_len + 1 );
1182
+
1183
+ if (!strncmp (tmp_buf , "CR_SIGNING_KEY" , buf_len )) {
1184
+ // printf("Creating signing key of %d.\n", authority_num);
1185
+ puts ("Creating signing key.\n" );
1186
+ if (create_signing_key ()) {
1187
+ buf_len = strlen ("CR_SIGNING_KEY_ERROR" );
1188
+ write (fd_et , & buf_len , sizeof (int ));
1189
+ write (fd_et , "CR_IDENTITY_KEY_ERROR" , buf_len + 1 );
1190
+ return 0 ;
1191
+ }
1192
+
1193
+ buf_len = strlen ("CR_SIGNING_KEY_DONE" );
1194
+ write (fd_et , & buf_len , sizeof (int ));
1195
+ write (fd_et , "CR_SIGNING_KEY_DONE" , buf_len + 1 );
1196
+ }
1197
+ else if (!strncmp (tmp_buf , "LD_SIGNING_KEY" , buf_len )) {
1198
+ // printf("Load signing key of %d.\n", authority_num);
1199
+ puts ("Load signing key.\n" );
1200
+
1201
+ if (load_signing_key ()) {
1202
+ buf_len = strlen ("LD_SIGNING_KEY_ERROR" );
1203
+ write (fd_et , & buf_len , sizeof (int ));
1204
+ write (fd_et , "LD_SIGNING_KEY_ERROR" , buf_len + 1 );
1205
+ return 0 ;
1206
+ }
1207
+
1208
+ buf_len = strlen ("LD_SIGNING_KEY_DONE" );
1209
+ write (fd_et , & buf_len , sizeof (int ));
1210
+ write (fd_et , "LD_SIGNING_KEY_DONE" , buf_len + 1 );
1211
+ }
1212
+
1213
+ free (tmp_buf );
1214
+ // recv data related to certificate
1215
+ // printf("Receiving global variables for certificate.\n");
1216
+ puts ("Receiving global variables for certificate.\n" );
1217
+ read (fd_te , & buf_len , sizeof (int ));
1218
+ read (fd_te , address , buf_len + 1 );
1219
+ addr_success = 1 ;
1220
+ int temp_var ;
1221
+ read (fd_te , & temp_var , sizeof (int ));
1222
+ months_lifetime = temp_var ;
1223
+
1224
+ // printf("Creating certificate of %d.\n", authority_num);
1225
+ puts ("Creating certificate.\n" );
1226
+ if (generate_certificate ()) {
1227
+ buf_len = strlen ("CR_CERTIFICATE_ERROR" );
1228
+ write (fd_et , & buf_len , sizeof (int ));
1229
+ write (fd_et , "CR_CERTIFICATE_ERROR" , buf_len + 1 );
1230
+ return 0 ;
1231
+ }
1232
+
1233
+ buf_len = strlen ("CR_CERTIFICATE_DONE" );
1234
+ write (fd_et , & buf_len , sizeof (int ));
1235
+ write (fd_et , "CR_CERTIFICATE_DONE" , buf_len + 1 );
1236
+
1237
+ // sgx_printf("cert len = %d\n", strlen(certificate));
1238
+
1239
+ for (int i = 0 ;i < 8 ;i ++ )
1240
+ write (fd_et , certificate + i * 512 , 512 );
1241
+ puts ("Send successfully!\n" );
1242
+
1243
+ return 1 ;
1244
+ }
1245
+
1246
+ int directory_request (int fd_et , int fd_te )
1247
+ {
1248
+ int buf_len ;
1249
+ char * tmp_buf = NULL ;
1250
+
1251
+ while (1 ) {
1252
+ read (fd_te , & buf_len , sizeof (int ));
1253
+ tmp_buf = (char * )malloc (buf_len + 1 );
1254
+ read (fd_te , tmp_buf , buf_len + 1 );
1255
+
1256
+ // CERTIFICATE VERIFICATION.
1257
+ if (!strncmp (tmp_buf , "CERTIFICATE_VERIFY" , buf_len )) {
1258
+ printf ("Certificate verification for directory authority %d\n" ,
1259
+ authority_num );
1260
+ size_t len ;
1261
+ char * tmp_signing_key_str = NULL ;
1262
+ read (fd_te , & len , sizeof (size_t ));
1263
+ tmp_signing_key_str = (char * )malloc (len + 1 );
1264
+ read (fd_te , tmp_signing_key_str , len + 1 );
1265
+
1266
+ // char *tmp_ori_str = key_to_string_priv(&signing_key_set);
1267
+ char * tmp_ori_str = key_to_string_priv (signing_key );
1268
+
1269
+ if (!memcmp (tmp_signing_key_str , tmp_ori_str , len )) {
1270
+ printf ("Verification Failed!\n" );
1271
+ buf_len = strlen ("CERTFICATE_VERIFY_ERROR" );
1272
+ write (fd_et , & buf_len , sizeof (int ));
1273
+ write (fd_et , "CERIFICATE_VERIFY_ERROR" , buf_len + 1 );
1274
+ return 0 ;
1275
+ }
1276
+ buf_len = strlen ("CERTFICATE_VERIFY_DONE" );
1277
+ write (fd_et , & buf_len , sizeof (int ));
1278
+ write (fd_et , "CERIFICATE_VERIFY_DONE" , buf_len + 1 );
1279
+
1280
+ free (tmp_signing_key_str );
1281
+ free (tmp_ori_str );
1282
+
1283
+ free (tmp_buf );
1284
+ continue ;
1285
+ }
1286
+
1287
+ // Voting
1288
+ if (!strncmp (tmp_buf , "VOTING_START" , buf_len )) {
1289
+ printf ("Voting of %d is started!\n" , authority_num );
1290
+
1291
+ // DIGEST COMPUTING
1292
+ // char *tmp_ori_str = key_to_string_priv(&signing_key_set);
1293
+ char * tmp_ori_str = key_to_string_priv (signing_key );
1294
+ crypto_pk_t * tmp_signing_key = crypto_pk_new ();
1295
+ crypto_pk_read_private_key_from_string (tmp_signing_key ,
1296
+ tmp_ori_str , -1 );
1297
+ char signing_key_digest [DIGEST_LEN ];
1298
+
1299
+ if (crypto_pk_get_digest (tmp_signing_key , signing_key_digest ) < 0 ) {
1300
+ puts ("Error computing signing key digest\n" );
1301
+ buf_len = strlen ("GET_DIGEST_ERROR" );
1302
+ write (fd_et , & buf_len , sizeof (int ));
1303
+ write (fd_et , "GET_DIGEST_ERROR" , buf_len + 1 );
1304
+ return 0 ;
1305
+ }
1306
+
1307
+ buf_len = strlen ("GET_DIGEST_DONE" );
1308
+ write (fd_et , & buf_len , sizeof (int ));
1309
+ write (fd_et , "GET_DIGEST_DONE" , buf_len + 1 );
1310
+
1311
+ // Fingerprint
1312
+ char fingerprint [FINGERPRINT_LEN + 1 ];
1313
+
1314
+ if (crypto_pk_get_fingerprint (tmp_signing_key , fingerprint , 0 ) < 0 ) {
1315
+ puts ("Error getting fingerprint for signing key\n" );
1316
+ buf_len = strlen ("GET_FINGERPRINT_ERROR" );
1317
+ write (fd_et , & buf_len , sizeof (int ));
1318
+ write (fd_et , "GET_FINGERPRINT_ERROR" , buf_len + 1 );
1319
+ return 0 ;
1320
+ }
1321
+
1322
+ buf_len = strlen ("GET_FINGERPRINT_DONE" );
1323
+ write (fd_et , & buf_len , sizeof (int ));
1324
+ write (fd_et , "GET_FINGERPRINT_DONE" , buf_len + 1 );
1325
+
1326
+ write (fd_et , fingerprint , FINGERPRINT_LEN + 1 );
1327
+
1328
+ // Vote signing
1329
+ char * sig = NULL ;
1330
+ char digest [DIGEST_LEN ];
1331
+
1332
+ read (fd_te , digest , DIGEST_LEN );
1333
+ sig = router_get_dirobj_signature (digest , DIGEST_LEN ,
1334
+ tmp_signing_key );
1335
+
1336
+ if (!sig ) {
1337
+ puts ("Unable to sign networkstatus vote!\n" );
1338
+ buf_len = strlen ("VOTE_SIGN_ERROR" );
1339
+ write (fd_et , & buf_len , sizeof (int ));
1340
+ write (fd_et , "VOTE_SIGN_ERROR" , buf_len + 1 );
1341
+ return 0 ;
1342
+ }
1343
+
1344
+ buf_len = strlen ("VOTE_SIGN_DONE" );
1345
+ write (fd_et , & buf_len , sizeof (int ));
1346
+ write (fd_et , "VOTE_SIGN_DONE" , buf_len + 1 );
1347
+
1348
+ vote_sig = malloc (strlen (sig )+ 1 );
1349
+ memcpy (vote_sig , sig , strlen (sig )+ 1 );
1350
+
1351
+ free (sig );
1352
+ free (tmp_signing_key );
1353
+ free (tmp_ori_str );
1354
+ free (tmp_buf );
1355
+ continue ;
1356
+ }
1357
+
1358
+ // Concensus
1359
+ if (!strncmp (tmp_buf , "CONSENSUS_START" , buf_len )) {
1360
+ printf ("Computing consensus of %d is started!\n" , authority_num );
1361
+
1362
+ // fingerprint
1363
+ // char *tmp_ori_str = key_to_string_priv(&signing_key_set);
1364
+ char * tmp_ori_str = key_to_string_priv (signing_key );
1365
+ crypto_pk_t * tmp_signing_key = crypto_pk_new ();
1366
+ crypto_pk_read_private_key_from_string (tmp_signing_key , tmp_ori_str , -1 );
1367
+
1368
+ char fingerprint [HEX_DIGEST_LEN + 1 ];
1369
+ if (crypto_pk_get_fingerprint (tmp_signing_key , fingerprint , 0 ) < 0 ) {
1370
+ puts ("Error getting fingerprint for signing key\n" );
1371
+ buf_len = strlen ("GET_FINGERPRINT_ERROR" );
1372
+ write (fd_et , & buf_len , sizeof (int ));
1373
+ write (fd_et , "GET_FINGERPRINT_ERROR" , buf_len + 1 );
1374
+ return 0 ;
1375
+ }
1376
+
1377
+ puts ("Consensus - Getting fingerprint finished!\n" );
1378
+ buf_len = strlen ("GET_FINGERPRINT_DONE" );
1379
+ write (fd_et , & buf_len , sizeof (int ));
1380
+ write (fd_et , "GET_FINGERPRINT_DONE" , buf_len + 1 );
1381
+ write (fd_et , fingerprint , HEX_DIGEST_LEN + 1 );
1382
+
1383
+ // Consensus signing
1384
+ char * sig = NULL ;
1385
+ char digest [DIGEST256_LEN ];
1386
+ int digest_len ;
1387
+
1388
+ read (fd_te , & digest_len , sizeof (int ));
1389
+ read (fd_te , digest , digest_len );
1390
+
1391
+ sig = router_get_dirobj_signature (digest ,
1392
+ digest_len , tmp_signing_key );
1393
+
1394
+ if (!sig ) {
1395
+ puts ("Couldn't sign consensus networkstatus\n" );
1396
+ buf_len = strlen ("CONSENSUS_SIGN_ERROR" );
1397
+ write (fd_et , & buf_len , sizeof (int ));
1398
+ write (fd_et , "CONSENSUS_SIGN_ERROR" , buf_len + 1 );
1399
+ return 0 ;
1400
+ }
1401
+
1402
+ puts ("Consensus signing finished!\n" );
1403
+ buf_len = strlen ("CONSENSUS_SIGN_DONE" );
1404
+ write (fd_et , & buf_len , sizeof (int ));
1405
+ write (fd_et , "CONSENSUS_SIGN_DONE" , buf_len + 1 );
1406
+
1407
+ int sig_len = strlen (sig );
1408
+ write (fd_et , & sig_len , sizeof (int ));
1409
+ write (fd_et , sig , sig_len + 1 );
1410
+
1411
+ if (consensus_sig_count == 0 ) {
1412
+ if (consensus_sig != NULL )
1413
+ free (consensus_sig2 );
1414
+ consensus_sig2 = malloc (strlen (sig )+ 1 );
1415
+ memcpy (consensus_sig2 , sig , strlen (sig )+ 1 );
1416
+ consensus_sig_count ++ ;
1417
+ }
1418
+ else {
1419
+ if (consensus_sig != NULL )
1420
+ free (consensus_sig );
1421
+ consensus_sig = malloc (strlen (sig )+ 1 );
1422
+ memcpy (consensus_sig , sig , strlen (sig )+ 1 );
1423
+ consensus_sig_count = 0 ;
1424
+ }
1425
+
1426
+ free (sig );
1427
+ free (tmp_ori_str );
1428
+ free (tmp_signing_key );
1429
+ free (tmp_buf );
1430
+
1431
+ continue ;
1432
+ }
1433
+
1434
+ // Concensus sig verify
1435
+ if (!strncmp (tmp_buf , "CONSENSUS_SIG_VERIFY" , buf_len )) {
1436
+ puts ("Consensus verification\n" );
1437
+
1438
+ int sig_len ;
1439
+ char signature [1536 ];
1440
+
1441
+ read (fd_te , & sig_len , sizeof (int ));
1442
+
1443
+ int i ;
1444
+ for (i = 0 ;i < 3 ;i ++ )
1445
+ read (fd_te , signature + i * 512 , 512 );
1446
+
1447
+ char * tmp_str1 = memchr (signature + 280 , '-' , 500 );
1448
+ printf ("%s\n" , tmp_str1 );
1449
+
1450
+ char * tmp_str2 = memchr (signature + 800 , '-' , 500 );
1451
+ printf ("%s\n" , tmp_str2 );
1452
+
1453
+ if (strncmp (tmp_str1 , consensus_sig , strlen (consensus_sig ))) {
1454
+ buf_len = strlen ("CONSENSUS_SIG_VERIFY_ERROR" );
1455
+ write (fd_et , & buf_len , sizeof (int ));
1456
+ write (fd_et , "CONSENSUS_SIG_VERIFY_ERROR" , buf_len + 1 );
1457
+ }
1458
+
1459
+ if (strncmp (tmp_str2 , consensus_sig2 , strlen (consensus_sig2 ))) {
1460
+ buf_len = strlen ("CONSENSUS_SIG_VERIFY_ERROR" );
1461
+ write (fd_et , & buf_len , sizeof (int ));
1462
+ write (fd_et , "CONSENSUS_SIG_VERIFY_ERROR" , buf_len + 1 );
1463
+ }
1464
+
1465
+ buf_len = strlen ("CONSENSUS_SIG_VERIFY_DONE" );
1466
+ write (fd_et , & buf_len , sizeof (int ));
1467
+ write (fd_et , "CONSENSUS_SIG_VERIFY_DONE" , buf_len + 1 );
1468
+
1469
+ free (tmp_buf );
1470
+ continue ;
1471
+ }
1472
+ }
1473
+
1474
+ return 1 ;
1475
+ }
1476
+
1125
1477
int exit_node_handling (int fd_te , int fd_et , int flags )
1126
1478
{
1127
1479
int buf_len ;
@@ -1998,7 +2350,14 @@ void enclave_main(int argc, char **argv)
1998
2350
1999
2351
int retval = 0 ;
2000
2352
2001
- retval = exit_node_handling (fd_te , fd_et , 0 );
2353
+ puts (key_enc_to_tor );
2354
+ puts (key_tor_to_enc );
2355
+ printf ("%d %d\n" , authority_num , exit_node_num );
2356
+
2357
+ if (exit_node_num == 3 )
2358
+ retval = exit_node_handling (fd_te , fd_et , 0 );
2359
+ else
2360
+ retval = directory_configure (fd_te , fd_et );
2002
2361
2003
2362
if (retval == 0 ) {
2004
2363
puts ("Error occurred. Quit program\n" );
@@ -2043,7 +2402,11 @@ void enclave_main(int argc, char **argv)
2043
2402
}
2044
2403
2045
2404
client_id_key = NULL ; // for key loading
2046
- retval = exit_node_handling (fd_te , fd_et , 1 );
2405
+
2406
+ if (exit_node_num == 3 )
2407
+ retval = exit_node_handling (fd_te , fd_et , 0 );
2408
+ else
2409
+ retval = directory_request (fd_et , fd_te );
2047
2410
2048
2411
if (retval == 0 )
2049
2412
printf ("Error occurred, Quit program\n" );
0 commit comments