24#include <seclabel_api.h>
27#include "ms_example.h"
30#define PCT_OID "1.2.840.113549.1.9.16.1.6"
32static char *optstr =
"u37m:d:p:w:M:D:P:W:r:o:O:r:g:G:c:l:R:y:C:iaqsAve:x:b:f:S:Y:Z4B:F:N:";
35static char *default_recip =
"/CN=lppt1/OU=lppt/O=attlee/PRMD=TestPRMD/ADMD=TestADMD/C=GB/";
37static char *content_id =
"030924.140212";
39static const char text[] =
"First line\r\nSecond line\r\n";
41static char *binary_data;
43static int setup_msg_sec_env = 0;
46int send_ia5_as_att = 0;
50static void usage(
void) ;
60 struct X400msSession *sp
63static int setup_default_new_sec_env(
64 struct X400msSession *sp,
65 char *identity_filename,
69static int setup_default_old_sec_env(
70 struct X400msSession *sp,
76static int setup_msg_new_sec_env(
77 struct X400msMessage *mp,
78 char *identity_filename,
82static int setup_msg_old_sec_env(
83 struct X400msMessage *mp,
90static int add_content(
91 struct X400msMessage *mp
107 char password[BUFSIZ];
109 if (get_args(argc, argv, optstr)) {
114 printf(
"Connection type (0 = P7, 1 = P3 submit only, 2 = P3 both directions) [%d]: ", x400_contype);
115 contype = ic_fgetc(x400_contype, stdin);
117 ic_fgetc(x400_contype, stdin);
119 if ( contype <
'0' ||
'2' < contype )
120 contype = x400_contype;
125 def_oraddr = x400_ms_user_addr;
126 def_dn = x400_ms_user_dn;
127 def_pa = x400_ms_presentation_address;
129 def_oraddr = x400_mta_user_addr;
130 def_dn = x400_mta_user_dn;
131 def_pa = x400_mta_presentation_address;
134 printf(
"Your ORAddress [%s] > ", def_oraddr);
135 ic_fgets (orn,
sizeof orn, stdin);
137 if ( orn[strlen(orn)-1] ==
'\n' )
138 orn[strlen(orn)-1] =
'\0';
141 strcpy(orn, def_oraddr);
144 printf (
"Password [%s]: ",
145 contype == 0 ? x400_p7_password : x400_p3_password);
146 if ( ic_fgets (password,
sizeof password, stdin) == NULL )
149 if (password[strlen(password)-1] ==
'\n' )
150 password[strlen(password)-1] =
'\0';
151 if (password[0] ==
'\0')
152 strcpy(password, contype == 0 ? x400_p7_password : x400_p3_password);
155 printf(
"Presentation Address [%s] > ", def_pa);
156 ic_fgets (pa,
sizeof pa, stdin);
158 if ( pa[strlen(pa)-1] ==
'\n' )
159 pa[strlen(pa)-1] =
'\0';
164 printf(
"sending message using session 1\n");
165 if ((status = send_msg(contype, orn, def_dn, pa, password))
167 fprintf (stderr,
"Error in sending message\n");
189 struct X400msSession *sp;
195 status =
X400msOpen (contype, orn, def_dn, password, pa, NULL, &sp);
197 fprintf (stderr,
"Error in Open: %s\n",
X400msError (status));
198 fprintf (stderr,
"%s %s %s\n", orn, def_dn, pa);
217 if (use_new_sec_env) {
218 status = setup_default_new_sec_env(sp, identity_filename, passphrase);
220 status = setup_default_old_sec_env(sp, security_id, identity_dn,
225 fprintf (stderr,
"Can't setup security environment\n");
229 printf(
"sending message 1\n");
230 status = submit_msg(orn, sp);
232 fprintf (stderr,
"Can't submit\n");
238 fprintf (stderr,
"X400msClose returned error: %s\n",
X400msError (status));
244static int submit_msg(
246 struct X400msSession *sp
249 struct X400msMessage *mp;
250 struct X400Recipient *rp;
256 if (x400_default_recipient != NULL)
257 recip = x400_default_recipient;
259 recip = default_recip;
261 printf(
"Message recipient [%s]: ", recip);
262 ic_fgets (tmp,
sizeof tmp, stdin);
264 if ( tmp[strlen(tmp)-1] ==
'\n' )
265 tmp[strlen(tmp)-1] =
'\0';
266 if (strlen(tmp) != 0)
269 printf(
"Subject [%s]: ", subject);
270 ic_fgets (tmp,
sizeof tmp, stdin);
272 if ( tmp[strlen(tmp)-1] ==
'\n' )
273 tmp[strlen(tmp)-1] =
'\0';
274 if (strlen(tmp) != 0)
275 subject = strdup(tmp);
279 fprintf (stderr,
"x400msMsgNew returned error: %s\n",
X400msError (status));
283 printf(
"\n\nPreparing Message\n");
286 if (x400_default_external_content_type != NULL) {
287 printf(
"Sending external content type %s\n",
288 x400_default_external_content_type);
290 x400_default_external_content_type, -1);
292 printf(
"Sending content type %d\n", x400_default_content_type);
294 x400_default_content_type);
297 fprintf (stderr,
"X400msMsgAddIntParam returned error: %s\n",
315 if (setup_msg_sec_env) {
316 if (use_new_sec_env) {
317 status = setup_msg_new_sec_env(mp, identity_filename, passphrase);
319 fprintf (stderr,
"Can't setup new security environment\n");
323 status = setup_msg_old_sec_env(mp, security_id, identity_dn2,
326 fprintf (stderr,
"Can't setup old security environment\n");
341 fprintf (stderr,
"x400msMsgAddIntParam returned error: %s\n",
355 printf(
"\nRequesting 4406 signature\n");
358 fprintf (stderr,
"x400msMsgAddIntParam returned error: %s\n",
365 printf(
"Sending external content type %s\n", PCT_OID);
367 printf(
"\nNot requesting 4406 signature\n");
370 status = add_sec_label (mp);
372 fprintf (stderr,
"Failed to add 4406 Security Label: %s\n",
379 fprintf (stderr,
"x400msRecipNew returned error: %s\n",
X400msError (status));
386 fprintf (stderr,
"x400msRecipAddIntParam returned error: %s\n",
393 fprintf (stderr,
"x400msRecipAddStrParam returned error: %s\n",
X400msError (status));
399 fprintf (stderr,
"x400msRecipAddStrParam returned error: %s\n",
X400msError (status));
405 fprintf (stderr,
"x400msMsgAddStrParam returned error: %s\n",
X400msError (status));
411 fprintf (stderr,
"x400msMsgAddStrParam returned error: %s\n",
X400msError (status));
418 fprintf (stderr,
"x400msRecipAddStrParam returned error: %s\n",
X400msError (status));
425 fprintf (stderr,
"x400msRecipAddStrParam returned error: %s\n",
X400msError (status));
432 fprintf (stderr,
"x400msMsgAddStrParam returned error: %s\n",
X400msError (status));
440 char tmp_buffer[255];
442 snprintf(tmp_buffer, 244,
"%s '%s' '%.19s'",
443 subject, get_x400_pty_str_from_4406(x400_default_priority), ctime(&t));
444 printf(
"Subject is '%s'\n", tmp_buffer);
447 fprintf (stderr,
"x400msMsgAddStrParam returned error: %s\n",
454 if (flot_string != NULL) {
457 fprintf (stderr,
"x400ms returned error: %s\n",
461 printf(
"Sent IA5 FLOT:\n%s\n", flot_string);
465 fprintf (stderr,
"add_content() returned error: %s\n",
472 fprintf (stderr,
"x400ms returned error: %s\n",
X400msError (status));
475 printf(
"Sent 8859 content:\n%s\n", text);
480 printf(
"failed to add X400_T_IA5TEXT BP\n");
483 printf(
"Sent IA5 content:\n%s\n", text);
486 if (filename_to_send != NULL) {
487 binary_data = (
char *) malloc(100000);
488 if ( binary_data == NULL )
490 fp = fopen(filename_to_send,
"r");
491 if (fp == (FILE *)NULL) {
492 printf(
"Cannot open binary file\n");
495 if ((fs = fread (binary_data,
sizeof(
char), 100000/
sizeof(
char), fp) ) == -1) {
496 printf(
"Cannot read from binary file\n");
503 printf(
"failed to add X400_T_BINARY BP\n");
507 printf(
"no binary file set - not sending X400_T_BINARY\n");
512 fprintf (stderr,
"x400msMsgSend returned error: %s\n",
X400msError (status));
515 printf(
"Message submitted successfully\n");
520 fprintf (stderr,
"x400msMsgDelete returned error: %s\n",
X400msError (status));
531static int setup_default_new_sec_env(
532 struct X400msSession *sp,
543 fprintf (stderr,
"X400msSetStrDefault returned error: %s\n",
551 fprintf (stderr,
"X400msSetStrDefault returned error: %s\n",
559 fprintf (stderr,
"X400msTestSecurityEnv returned error: %s\n",
564 printf (
"X400msTestSecurityEnv returned success\n");
569static int setup_default_old_sec_env(
570 struct X400msSession *sp,
587 fprintf (stderr,
"X400msSetStrDefault returned error: %s\n",
595 fprintf (stderr,
"X400msSetStrDefault returned error: %s\n",
603static int setup_msg_new_sec_env(
604 struct X400msMessage *mp,
615 fprintf (stderr,
"X400msMsgAddStrParam returned error: %s\n",
623 fprintf (stderr,
"x400msMsgAddStrParam returned error: %s\n",
630static int setup_msg_old_sec_env(
631 struct X400msMessage *mp,
645 fprintf (stderr,
"x400msMsgAddStrParam returned error: %s\n",
653 fprintf (stderr,
"x400msMsgAddStrParam returned error: %s\n",
661 fprintf (stderr,
"x400msMsgAddStrParam returned error: %s\n",
669static int add_content(
670 struct X400msMessage *mp
694 fprintf (stderr,
"x400ms returned error: %s\n",
X400msError (status));
697 printf(
"Sent 8859 attachment as string:\n%s\n", text);
699 if (send_ia5_as_att) {
704 printf(
"failed to add X400_T_IA5TEXT attachment\n");
707 printf(
"Sent IA5 as first attachment:\n%s\n", text);
712 printf(
"failed to add X400_T_IA5TEXT BP\n");
715 printf(
"Sent IA5 as string in message \n%s\n", text);
721 printf(
"failed to add X400_T_ISO8859_1, attachment\n");
724 printf(
"Sent 8859-1 as attachment:\n%s\n", text);
727 if (filename_to_send != NULL) {
728 binary_data = (
char *) malloc(100000);
729 if ( binary_data == NULL )
731 fp = fopen(filename_to_send,
"r");
732 if (fp == (FILE *)NULL) {
733 printf(
"Cannot open binary file\n");
736 if ((fs = fread (binary_data,
sizeof(
char), 100000/
sizeof(
char), fp))
738 printf(
"Cannot read from binary file\n");
745 printf(
"failed to add X400_T_BINARY BP\n");
752 printf(
"no binary file set - not sending X400_T_BINARY\n");
757static void usage(
void) {
758 printf(
"usage: %s\n", optstr);
759 printf(
"\t where:\n");
760 printf(
"\t -u : Don't prompt to override defaults \n");
761 printf(
"\t -3 : Use P3 connection \n");
762 printf(
"\t -7 : Use P7 connection \n");
763 printf(
"\t -m : OR Address in P7 bind arg \n");
764 printf(
"\t -d : DN in P7 bind arg \n");
765 printf(
"\t -p : Presentation Address of P7 Store \n");
766 printf(
"\t -w : P7 password of P7 user \n");
767 printf(
"\t -M : OR Address in P3 bind arg \n");
768 printf(
"\t -D : DN in P3 bind arg \n");
769 printf(
"\t -P : Presentation Address of P3 server\n");
770 printf(
"\t -W : P3 password of P3 user \n");
771 printf(
"\t -o : Originator \n");
772 printf(
"\t -O : Originator Return Address \n");
773 printf(
"\t -r : Recipient\n");
774 printf(
"\t -l : Logline\n");
775 printf(
"\t -y : Military Priority \n");
776 printf(
"\t\t 0 - deferred, 1 - routine, 2 - priority \n");
777 printf(
"\t\t 3 - immediate, 4 - flash, 5 - override \n");
778 printf(
"\t -C : Content Type (2/22/772/OID) \n");
779 printf(
"\t -i : Implicit conversion prohibited = TRUE \n");
780 printf(
"\t -a : Alternate Recipient Prohibited = TRUE \n");
781 printf(
"\t -q : Content Return Request = TRUE \n");
782 printf(
"\t -s : Disclosure of Recipient = FALSE \n");
783 printf(
"\t -A : Recipient Reassignment Prohibited = FALSE \n");
784 printf(
"\t -v : Conversion with Loss Prohibited = FALSE \n");
785 printf(
"\t -e : Security Environment (dir with x509 subdir): obsolete, use -Y <p12file>\n");
786 printf(
"\t -x : DN of X.509 Digital Identity\n");
787 printf(
"\t -b : Passphrase for private key in PKCS12 file\n");
788 printf(
"\t -f : Filename to transfer as binary bp\n");
789 printf(
"\t -Y : Filename of PKCS12 file containing Digital Identity\n");
790 printf(
"\t -Z : Generate MOAC Signature\n");
791 printf(
"\t -4 : Generate STANAG 4406 PCT Signatures\n");
792 printf(
"\t -B : Subject of message\n");
793 printf(
"\t -F : String to insert in first line of text (e.g. as FLOT)\n");
794 printf(
"\t -N : Insert Security Label in (e)nvelope or (4)406 signature\n");
int X400msMsgAddStrParam(struct X400msMessage *mp, int paramtype, const char *value, size_t length)
Add string-valued parameter to the message.
int X400msRecipAddIntParam(struct X400Recipient *rp, int paramtype, int value)
Add integer-valued parameter to the message.
int X400msMsgAddIntParam(struct X400msMessage *mp, int paramtype, int value)
Add integer-valued parameter to the message.
int X400msRecipNew(struct X400msMessage *mp, int type, struct X400Recipient **rpp)
Add new recipient to a message.
const char * X400msError(int error)
Obtain a string describing the meaning of the given error code.
int X400msRecipAddStrParam(struct X400Recipient *rp, int paramtype, const char *value, size_t length)
Add string-valued parameter to the message.
int X400msTestSecurityEnv(struct X400msSession *sp)
Test the default Security Environment.
int X400msMsgSend(struct X400msMessage *mp)
Send message object.
int X400msMsgDelete(struct X400msMessage *mp, int retain)
Delete message object.
int X400msMsgAddAttachment(struct X400msMessage *mp, int type, const char *string, size_t length)
Add attachment to the message.
int X400msMsgNew(struct X400msSession *sp, int type, struct X400msMessage **mpp)
Creates new message.
int X400msClose(struct X400msSession *sp)
Close a X400 Session.
int X400msSetStrDefault(struct X400msSession *sp, int paramtype, const char *value, size_t length)
Set a default string parameter value in a session.
int X400msOpen(int type, const char *oraddr, const char *dirname, const char *credentials, const char *pa, int *messages, struct X400msSession **spp)
Open a session to a Message Store (P7) or MTA (P3) in synchronous mode.
#define X400_S_DIRECTORY_NAME
#define X400_S_OR_ADDRESS
#define X400_S_LOG_CONFIGURATION_FILE
#define X400_S_CONTENT_IDENTIFIER
#define X400_N_CONTENT_TYPE
#define X400_S_EXTERNAL_CONTENT_TYPE
#define X400_N_REPORT_REQUEST
#define X400_N_NOTIFICATION_REQUEST
#define X400_N_PRECEDENCE
#define X400_RECIP_STANDARD
#define X400_S_SEC_IDENTITY_DN
#define X400_B_SEC_GEN_MOAC
#define X400_S_SEC_IDENTITY_FILE
#define X400_S_SEC_IDENTITY
#define X400_S_SEC_IDENTITY_PASSPHRASE
X400 MA/MS (P3/P7) Interface.