+ /*
+ * Our encoding is pretty simple, so this is easy.
+ */
+
+ case NETSEC_SASL_WRITE:
+ if (indatalen == 0) {
+ *outdata = (unsigned char *) getcpy("\r\n");
+ *outdatalen = strlen((char *) *outdata);
+ } else {
+ unsigned char *b64data;
+ b64data = mh_xmalloc(BASE64SIZE(indatalen) + 3);
+ writeBase64raw(indata, indatalen, b64data);
+ len = strlen((char *) b64data);
+ b64data[len++] = '\r';
+ b64data[len++] = '\n';
+ b64data[len++] = '\0';
+ *outdata = b64data;
+ *outdatalen = len - 1;
+ }
+
+ return OK;
+ break;
+
+ /*
+ * Finish the protocol; we're looking for an +OK
+ */
+
+ case NETSEC_SASL_FINISH:
+ line = netsec_readline(nsc, &len, errstr);
+ if (line == NULL)
+ return NOTOK;
+
+ if (strncmp(line, "+OK", 3) != 0) {
+ netsec_err(errstr, "Authentication failed: %s", line);
+ return NOTOK;
+ }
+ break;
+
+ /*
+ * Cancel the SASL exchange in the middle of the commands; for
+ * POP, that's a single "*".
+ */
+
+ case NETSEC_SASL_CANCEL:
+ *outdata = (unsigned char *) getcpy("*\r\n");
+ *outdatalen = strlen((char *) *outdata);
+ break;
+ }
+