77
77
};
78
78
79
79
80
- const string banner = " \n opmsg: version=1.76 -- (C) 2017 opmsg-team: https://github.com/stealth/opmsg\n\n " ;
80
+ const string banner = " \n opmsg: version=1.77 -- (C) 2017 opmsg-team: https://github.com/stealth/opmsg\n\n " ;
81
81
82
82
/* The iostream lib works not very well wrt customized buffering and flushing
83
83
* (unlike C's setbuffer), so we use string streams and flush ourself when we need to.
@@ -582,7 +582,7 @@ int do_verify(const string &verify_file)
582
582
}
583
583
584
584
585
- int do_newpersona (const string &name, const string &type)
585
+ int do_newpersona (const string &name, const string &type, bool sign )
586
586
{
587
587
keystore ks (config::phash, config::cfgbase);
588
588
@@ -621,11 +621,35 @@ int do_newpersona(const string &name, const string &type)
621
621
estr<<" --deniable" ;
622
622
estr<<" \n\n " ;
623
623
eflush ();
624
+
624
625
ostr<<pub;
625
626
if (config::deniable)
626
627
ostr<<priv;
628
+
629
+ // (self-)sign output data shown to user with the freshly generated persona;
630
+ // output can be --imported and verified via --decrypt
631
+ if (sign) {
632
+ string s = ostr.str ();
633
+ message msg (config::version, config::cfgbase, config::phash, config::khash, config::shash, " null" );
634
+ msg.src_id (p->get_id ());
635
+ msg.dst_id (p->get_id ());
636
+
637
+ if (p->get_type () == marker::ec)
638
+ msg.kex_id (marker::ec_kex_id);
639
+ else
640
+ msg.kex_id (marker::rsa_kex_id);
641
+
642
+ if (msg.encrypt (s, p, p) < 0 ) {
643
+ estr<<prefix<<" ERROR: Signing freshly generated persona key: " <<msg.why ()<<endl; eflush ();
644
+ return -1 ;
645
+ }
646
+ ostr.str (" " );
647
+ ostr<<s;
648
+ }
649
+
627
650
ostr<<endl;
628
651
oflush ();
652
+
629
653
estr<<prefix<<" Check (by phone, otr, twitter, id-selfie etc.) that above id matches\n " ;
630
654
estr<<prefix<<" the import message from your peer.\n " ;
631
655
estr<<prefix<<" AFTER THAT, you can go ahead, safely exchanging op-messages.\n\n " ;
@@ -634,15 +658,15 @@ int do_newpersona(const string &name, const string &type)
634
658
}
635
659
636
660
637
- int do_new_rsa_persona (const string &name)
661
+ int do_new_rsa_persona (const string &name, bool sign )
638
662
{
639
- return do_newpersona (name, marker::rsa);
663
+ return do_newpersona (name, marker::rsa, sign );
640
664
}
641
665
642
666
643
- int do_new_ec_persona (const string &name)
667
+ int do_new_ec_persona (const string &name, bool sign )
644
668
{
645
- return do_newpersona (name, marker::ec);
669
+ return do_newpersona (name, marker::ec, sign );
646
670
}
647
671
648
672
@@ -995,7 +1019,7 @@ int main(int argc, char **argv)
995
1019
cmode = CMODE_DECRYPT;
996
1020
break ;
997
1021
case ' S' :
998
- cmode = CMODE_SIGN;
1022
+ cmode | = CMODE_SIGN;
999
1023
break ;
1000
1024
case ' P' :
1001
1025
config::my_id = optarg ;
@@ -1005,7 +1029,7 @@ int main(int argc, char **argv)
1005
1029
verify_file = optarg ;
1006
1030
break ;
1007
1031
case ' N' :
1008
- cmode = CMODE_NEWP;
1032
+ cmode | = CMODE_NEWP;
1009
1033
break ;
1010
1034
case ' I' :
1011
1035
cmode = CMODE_IMPORT;
@@ -1029,7 +1053,7 @@ int main(int argc, char **argv)
1029
1053
cmode = CMODE_NEWDHP;
1030
1054
break ;
1031
1055
case NEWECP:
1032
- cmode = CMODE_NEWECP;
1056
+ cmode | = CMODE_NEWECP;
1033
1057
break ;
1034
1058
case ID_FORMAT_LONG:
1035
1059
config::idformat = " long" ;
@@ -1130,16 +1154,18 @@ int main(int argc, char **argv)
1130
1154
r = do_verify (verify_file);
1131
1155
break ;
1132
1156
case CMODE_NEWP:
1157
+ case CMODE_NEWP|CMODE_SIGN:
1133
1158
estr<<prefix<<" creating new persona (RSA " <<config::rsa_len<<" , DH " <<config::dh_plen<<" )\n\n " ; eflush ();
1134
- r = do_new_rsa_persona (name);
1159
+ r = do_new_rsa_persona (name, (cmode & CMODE_SIGN) == CMODE_SIGN );
1135
1160
break ;
1136
1161
case CMODE_NEWDHP:
1137
1162
estr<<prefix<<" creating new DHparams for persona " <<idformat (config::my_id)<<" \n\n " ; eflush ();
1138
1163
r = do_newdhparams ();
1139
1164
break ;
1140
1165
case CMODE_NEWECP:
1166
+ case CMODE_NEWECP|CMODE_SIGN:
1141
1167
estr<<prefix<<" creating new EC persona (curve " <<config::curves[0 ]<<" )\n\n " ; eflush ();
1142
- r = do_new_ec_persona (name);
1168
+ r = do_new_ec_persona (name, (cmode & CMODE_SIGN) == CMODE_SIGN );
1143
1169
break ;
1144
1170
case CMODE_IMPORT:
1145
1171
estr<<prefix<<" importing persona\n " ; eflush ();
@@ -1156,6 +1182,8 @@ int main(int argc, char **argv)
1156
1182
case CMODE_PGPLIST:
1157
1183
r = do_pgplist (name);
1158
1184
break ;
1185
+ default :
1186
+ estr<<prefix<<" Invalid combination of options?\n " ;
1159
1187
}
1160
1188
1161
1189
if (cmode != CMODE_PGPLIST) {
0 commit comments