]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/filed/restore.c
Fix typo.
[bacula/bacula] / bacula / src / filed / restore.c
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2000-2012 Free Software Foundation Europe e.V.
5
6    The main author of Bacula is Kern Sibbald, with contributions from
7    many others, a complete list can be found in the file AUTHORS.
8    This program is Free Software; you can redistribute it and/or
9    modify it under the terms of version three of the GNU Affero General Public
10    License as published by the Free Software Foundation and included
11    in the file LICENSE.
12
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU Affero General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301, USA.
22
23    Bacula® is a registered trademark of Kern Sibbald.
24    The licensor of Bacula is the Free Software Foundation Europe
25    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26    Switzerland, email:ftf@fsfeurope.org.
27 */
28 /*
29  *  Bacula File Daemon  restore.c Restorefiles.
30  *
31  *    Kern Sibbald, November MM
32  *
33  */
34
35 #include "bacula.h"
36 #include "filed.h"
37 #include "ch.h"
38 #include "restore.h"
39
40 #ifdef HAVE_DARWIN_OS
41 #include <sys/attr.h>
42 const bool have_darwin_os = true;
43 #else
44 const bool have_darwin_os = false;
45 #endif
46
47 #if defined(HAVE_CRYPTO)
48 const bool have_crypto = true;
49 #else
50 const bool have_crypto = false;
51 #endif
52
53 #if defined(HAVE_ACL)
54 const bool have_acl = true;
55 #else
56 const bool have_acl = false;
57 #endif
58
59 #ifdef HAVE_SHA2
60 const bool have_sha2 = true;
61 #else
62 const bool have_sha2 = false;
63 #endif
64
65 #if defined(HAVE_XATTR)
66 const bool have_xattr = true;
67 #else
68 const bool have_xattr = false;
69 #endif
70
71 /*
72  * Data received from Storage Daemon
73  */
74 static char rec_header[] = "rechdr %ld %ld %ld %ld %ld";
75
76 /*
77  * Forward referenced functions
78  */
79 #if   defined(HAVE_LIBZ)
80 static const char *zlib_strerror(int stat);
81 const bool have_libz = true;
82 #else
83 const bool have_libz = false;
84 #endif
85 #ifdef HAVE_LZO
86 const bool have_lzo = true;
87 #else
88 const bool have_lzo = false;
89 #endif
90
91 static void deallocate_cipher(r_ctx &rctx);
92 static void deallocate_fork_cipher(r_ctx &rctx);
93 static void free_signature(r_ctx &rctx);
94 static void free_session(r_ctx &rctx);
95 static bool close_previous_stream(JCR *jcr, r_ctx &rctx);
96 static bool verify_signature(JCR *jcr, r_ctx &rctx);
97 int32_t extract_data(JCR *jcr, BFILE *bfd, POOLMEM *buf, int32_t buflen,
98                      uint64_t *addr, int flags, int32_t stream, RESTORE_CIPHER_CTX *cipher_ctx);
99 bool flush_cipher(JCR *jcr, BFILE *bfd, uint64_t *addr, int flags, int32_t stream,
100                   RESTORE_CIPHER_CTX *cipher_ctx);
101
102 /*
103  * Close a bfd check that we are at the expected file offset.
104  * Makes use of some code from set_attributes().
105  */
106 static int bclose_chksize(JCR *jcr, BFILE *bfd, boffset_t osize)
107 {
108    char ec1[50], ec2[50];
109    boffset_t fsize;
110
111    fsize = blseek(bfd, 0, SEEK_CUR);
112    bclose(bfd);
113    if (fsize > 0 && fsize != osize) {
114       Qmsg3(jcr, M_WARNING, 0, _("Size of data or stream of %s not correct. Original %s, restored %s.\n"),
115             jcr->last_fname, edit_uint64(osize, ec1),
116             edit_uint64(fsize, ec2));
117       return -1;
118    }
119    return 0;
120 }
121
122 #ifdef HAVE_DARWIN_OS
123 static bool restore_finderinfo(JCR *jcr, POOLMEM *buf, int32_t buflen)
124 {
125    struct attrlist attrList;
126
127    memset(&attrList, 0, sizeof(attrList));
128    attrList.bitmapcount = ATTR_BIT_MAP_COUNT;
129    attrList.commonattr = ATTR_CMN_FNDRINFO;
130
131    Dmsg0(130, "Restoring Finder Info\n");
132    jcr->ff->flags |= FO_HFSPLUS;
133    if (buflen != 32) {
134       Jmsg(jcr, M_WARNING, 0, _("Invalid length of Finder Info (got %d, not 32)\n"), buflen);
135       return false;
136    }
137
138    if (setattrlist(jcr->last_fname, &attrList, buf, buflen, 0) != 0) {
139       Jmsg(jcr, M_WARNING, 0, _("Could not set Finder Info on %s\n"), jcr->last_fname);
140       return false;
141    }
142
143    return true;
144 }
145 #else
146 static bool restore_finderinfo(JCR *jcr, POOLMEM *buf, int32_t buflen)
147 {
148    return true;
149 }
150 #endif
151
152 /*
153  * Cleanup of delayed restore stack with streams for later
154  * processing.
155  */
156 static inline void drop_delayed_restore_streams(r_ctx &rctx, bool reuse)
157 {
158    RESTORE_DATA_STREAM *rds;
159
160    if (!rctx.delayed_streams ||
161        rctx.delayed_streams->empty()) {
162       return;
163    }
164
165    foreach_alist(rds, rctx.delayed_streams) {
166       free(rds->content);
167    }
168
169    rctx.delayed_streams->destroy();
170    if (reuse) {
171       rctx.delayed_streams->init(10, owned_by_alist);
172    }
173 }
174
175 /*
176  * Push a data stream onto the delayed restore stack for
177  * later processing.
178  */
179 static inline void push_delayed_restore_stream(r_ctx &rctx, BSOCK *sd)
180 {
181    RESTORE_DATA_STREAM *rds;
182
183    if (!rctx.delayed_streams) {
184       rctx.delayed_streams = New(alist(10, owned_by_alist));
185    }
186
187    rds = (RESTORE_DATA_STREAM *)malloc(sizeof(RESTORE_DATA_STREAM));
188    rds->stream = rctx.stream;
189    rds->content = (char *)malloc(sd->msglen);
190    memcpy(rds->content, sd->msg, sd->msglen);
191    rds->content_length = sd->msglen;
192
193    rctx.delayed_streams->append(rds);
194 }
195
196 /*
197  * Perform a restore of an ACL using the stream received.
198  * This can either be a delayed restore or direct restore.
199  */
200 static inline bool do_restore_acl(JCR *jcr,
201                                   int stream,
202                                   char *content,
203                                   uint32_t content_length)
204
205 {
206    switch (parse_acl_streams(jcr, stream, content, content_length)) {
207    case bacl_exit_fatal:
208       return false;
209    case bacl_exit_error:
210       /*
211        * Non-fatal errors, count them and when the number is under ACL_REPORT_ERR_MAX_PER_JOB
212        * print the error message set by the lower level routine in jcr->errmsg.
213        */
214       if (jcr->acl_data->u.parse->nr_errors < ACL_REPORT_ERR_MAX_PER_JOB) {
215          Jmsg(jcr, M_WARNING, 0, "%s", jcr->errmsg);
216       }
217       jcr->acl_data->u.parse->nr_errors++;
218       break;
219    case bacl_exit_ok:
220       break;
221    }
222    return true;
223 }
224
225 /*
226  * Perform a restore of an XATTR using the stream received.
227  * This can either be a delayed restore or direct restore.
228  */
229 static inline bool do_restore_xattr(JCR *jcr,
230                                     int stream,
231                                     char *content,
232                                     uint32_t content_length)
233 {
234    switch (parse_xattr_streams(jcr, stream, content, content_length)) {
235    case bxattr_exit_fatal:
236       return false;
237    case bxattr_exit_error:
238       /*
239        * Non-fatal errors, count them and when the number is under XATTR_REPORT_ERR_MAX_PER_JOB
240        * print the error message set by the lower level routine in jcr->errmsg.
241        */
242       if (jcr->xattr_data->u.parse->nr_errors < XATTR_REPORT_ERR_MAX_PER_JOB) {
243          Jmsg(jcr, M_WARNING, 0, "%s", jcr->errmsg);
244       }
245       jcr->xattr_data->u.parse->nr_errors++;
246       break;
247    case bxattr_exit_ok:
248       break;
249    }
250    return true;
251 }
252
253 /*
254  * Restore any data streams that are restored after the file
255  * is fully restored and has its attributes restored. Things
256  * like acls and xattr are restored after we set the file
257  * attributes otherwise we might clear some security flags
258  * by setting the attributes.
259  */
260 static inline bool pop_delayed_data_streams(JCR *jcr, r_ctx &rctx)
261 {
262    RESTORE_DATA_STREAM *rds;
263
264    /*
265     * See if there is anything todo.
266     */
267    if (!rctx.delayed_streams ||
268         rctx.delayed_streams->empty()) {
269       return true;
270    }
271
272    /*
273     * Only process known delayed data streams here.
274     * If you start using more delayed data streams
275     * be sure to add them in this loop and add the
276     * proper calls here.
277     *
278     * Currently we support delayed data stream
279     * processing for the following type of streams:
280     * - *_ACL_*
281     * - *_XATTR_*
282     */
283    foreach_alist(rds, rctx.delayed_streams) {
284       switch (rds->stream) {
285       case STREAM_UNIX_ACCESS_ACL:
286       case STREAM_UNIX_DEFAULT_ACL:
287       case STREAM_ACL_AIX_TEXT:
288       case STREAM_ACL_DARWIN_ACCESS_ACL:
289       case STREAM_ACL_FREEBSD_DEFAULT_ACL:
290       case STREAM_ACL_FREEBSD_ACCESS_ACL:
291       case STREAM_ACL_HPUX_ACL_ENTRY:
292       case STREAM_ACL_IRIX_DEFAULT_ACL:
293       case STREAM_ACL_IRIX_ACCESS_ACL:
294       case STREAM_ACL_LINUX_DEFAULT_ACL:
295       case STREAM_ACL_LINUX_ACCESS_ACL:
296       case STREAM_ACL_TRU64_DEFAULT_ACL:
297       case STREAM_ACL_TRU64_DEFAULT_DIR_ACL:
298       case STREAM_ACL_TRU64_ACCESS_ACL:
299       case STREAM_ACL_SOLARIS_ACLENT:
300       case STREAM_ACL_SOLARIS_ACE:
301       case STREAM_ACL_AFS_TEXT:
302       case STREAM_ACL_AIX_AIXC:
303       case STREAM_ACL_AIX_NFS4:
304       case STREAM_ACL_FREEBSD_NFS4_ACL:
305          if (!do_restore_acl(jcr, rds->stream, rds->content, rds->content_length)) {
306             goto bail_out;
307          }
308          free(rds->content);
309          break;
310       case STREAM_XATTR_IRIX:
311       case STREAM_XATTR_TRU64:
312       case STREAM_XATTR_AIX:
313       case STREAM_XATTR_OPENBSD:
314       case STREAM_XATTR_SOLARIS_SYS:
315       case STREAM_XATTR_DARWIN:
316       case STREAM_XATTR_FREEBSD:
317       case STREAM_XATTR_LINUX:
318       case STREAM_XATTR_NETBSD:
319          if (!do_restore_xattr(jcr, rds->stream, rds->content, rds->content_length)) {
320             goto bail_out;
321          }
322          free(rds->content);
323          break;
324       default:
325          Jmsg(jcr, M_WARNING, 0, _("Unknown stream=%d ignored. This shouldn't happen!\n"),
326               rds->stream);
327          break;
328       }
329    }
330
331    /*
332     * We processed the stack so we can destroy it.
333     */
334    rctx.delayed_streams->destroy();
335
336    /*
337     * (Re)Initialize the stack for a new use.
338     */
339    rctx.delayed_streams->init(10, owned_by_alist);
340
341    return true;
342
343 bail_out:
344
345    /*
346     * Destroy the content of the stack and (re)initialize it for a new use.
347     */
348    drop_delayed_restore_streams(rctx, true);
349
350    return false;
351 }
352
353 /*
354  * Restore the requested files.
355  */
356 void do_restore(JCR *jcr)
357 {
358    BSOCK *sd;
359    uint32_t VolSessionId, VolSessionTime;
360    int32_t file_index;
361    char ec1[50];                      /* Buffer printing huge values */
362    uint32_t buf_size;                 /* client buffer size */
363    int stat;
364    int64_t rsrc_len = 0;              /* Original length of resource fork */
365    r_ctx rctx;
366    ATTR *attr;
367    /* ***FIXME*** make configurable */
368    crypto_digest_t signing_algorithm = have_sha2 ? 
369                                        CRYPTO_DIGEST_SHA256 : CRYPTO_DIGEST_SHA1;
370    memset(&rctx, 0, sizeof(rctx));
371    rctx.jcr = jcr;
372
373    /*
374     * The following variables keep track of "known unknowns"
375     */
376    int non_support_data = 0;
377    int non_support_attr = 0;
378    int non_support_rsrc = 0;
379    int non_support_finfo = 0;
380    int non_support_acl = 0;
381    int non_support_progname = 0;
382    int non_support_crypto = 0;
383    int non_support_xattr = 0;
384
385    sd = jcr->store_bsock;
386    jcr->setJobStatus(JS_Running);
387
388    LockRes();
389    CLIENT *client = (CLIENT *)GetNextRes(R_CLIENT, NULL);
390    UnlockRes();
391    if (client) {
392       buf_size = client->max_network_buffer_size;
393    } else {
394       buf_size = 0;                   /* use default */
395    }
396    if (!bnet_set_buffer_size(sd, buf_size, BNET_SETBUF_WRITE)) {
397       jcr->setJobStatus(JS_ErrorTerminated);
398       return;
399    }
400    jcr->buf_size = sd->msglen;
401
402    /*
403     * St Bernard code goes here if implemented -- see end of file
404     */
405
406    /* use the same buffer size to decompress both gzip and lzo */
407    if (have_libz || have_lzo) {
408       uint32_t compress_buf_size = jcr->buf_size + 12 + ((jcr->buf_size+999) / 1000) + 100;
409       jcr->compress_buf = get_memory(compress_buf_size);
410       jcr->compress_buf_size = compress_buf_size;
411    }
412
413 #ifdef HAVE_LZO
414    if (lzo_init() != LZO_E_OK) {
415       Jmsg(jcr, M_FATAL, 0, _("LZO init failed\n"));
416       goto bail_out;
417    }
418 #endif
419
420    if (have_crypto) {
421       rctx.cipher_ctx.buf = get_memory(CRYPTO_CIPHER_MAX_BLOCK_SIZE);
422       if (have_darwin_os) {
423          rctx.fork_cipher_ctx.buf = get_memory(CRYPTO_CIPHER_MAX_BLOCK_SIZE);
424       }
425    }
426    
427    /*
428     * Get a record from the Storage daemon. We are guaranteed to
429     *   receive records in the following order:
430     *   1. Stream record header
431     *   2. Stream data (one or more of the following in the order given)
432     *        a. Attributes (Unix or Win32)
433     *        b. Possibly stream encryption session data (e.g., symmetric session key)
434     *        c. File data for the file
435     *        d. Alternate data stream (e.g. Resource Fork)
436     *        e. Finder info
437     *        f. ACLs
438     *        g. XATTRs
439     *        h. Possibly a cryptographic signature
440     *        i. Possibly MD5 or SHA1 record
441     *   3. Repeat step 1
442     *
443     * NOTE: We keep track of two bacula file descriptors:
444     *   1. bfd for file data.
445     *      This fd is opened for non empty files when an attribute stream is
446     *      encountered and closed when we find the next attribute stream.
447     *   2. fork_bfd for alternate data streams
448     *      This fd is opened every time we encounter a new alternate data
449     *      stream for the current file. When we find any other stream, we
450     *      close it again.
451     *      The expected size of the stream, fork_len, should be set when
452     *      opening the fd.
453     *   3. Not all the stream data records are required -- e.g. if there
454     *      is no fork, there is no alternate data stream, no ACL, ...
455     */
456    binit(&rctx.bfd);
457    binit(&rctx.forkbfd);
458    attr = rctx.attr = new_attr(jcr);
459    if (have_acl) {
460       jcr->acl_data = (acl_data_t *)malloc(sizeof(acl_data_t));
461       memset(jcr->acl_data, 0, sizeof(acl_data_t));
462       jcr->acl_data->u.parse = (acl_parse_data_t *)malloc(sizeof(acl_parse_data_t));
463       memset(jcr->acl_data->u.parse, 0, sizeof(acl_parse_data_t));
464    }
465    if (have_xattr) {
466       jcr->xattr_data = (xattr_data_t *)malloc(sizeof(xattr_data_t));
467       memset(jcr->xattr_data, 0, sizeof(xattr_data_t));
468       jcr->xattr_data->u.parse = (xattr_parse_data_t *)malloc(sizeof(xattr_parse_data_t));
469       memset(jcr->xattr_data->u.parse, 0, sizeof(xattr_parse_data_t));
470    }
471
472    while (bget_msg(sd) >= 0 && !job_canceled(jcr)) {
473       /*
474        * Remember previous stream type
475        */
476       rctx.prev_stream = rctx.stream;
477
478       /*
479        * First we expect a Stream Record Header
480        */
481       if (sscanf(sd->msg, rec_header, &VolSessionId, &VolSessionTime, &file_index,
482           &rctx.full_stream, &rctx.size) != 5) {
483          Jmsg1(jcr, M_FATAL, 0, _("Record header scan error: %s\n"), sd->msg);
484          goto bail_out;
485       }
486       /* Strip off new stream high bits */
487       rctx.stream = rctx.full_stream & STREAMMASK_TYPE;
488       Dmsg5(150, "Got hdr: Files=%d FilInx=%d size=%d Stream=%d, %s.\n", 
489             jcr->JobFiles, file_index, rctx.size, rctx.stream, stream_to_ascii(rctx.stream));
490
491       /*
492        * Now we expect the Stream Data
493        */
494       if (bget_msg(sd) < 0) {
495          Jmsg1(jcr, M_FATAL, 0, _("Data record error. ERR=%s\n"), sd->bstrerror());
496          goto bail_out;
497       }
498       if (rctx.size != (uint32_t)sd->msglen) {
499          Jmsg2(jcr, M_FATAL, 0, _("Actual data size %d not same as header %d\n"), 
500                sd->msglen, rctx.size);
501          Dmsg2(50, "Actual data size %d not same as header %d\n",
502                sd->msglen, rctx.size);
503          goto bail_out;
504       }
505       Dmsg3(130, "Got stream: %s len=%d extract=%d\n", stream_to_ascii(rctx.stream), 
506             sd->msglen, rctx.extract);
507
508       /*
509        * If we change streams, close and reset alternate data streams
510        */
511       if (rctx.prev_stream != rctx.stream) {
512          if (is_bopen(&rctx.forkbfd)) {
513             deallocate_fork_cipher(rctx);
514             bclose_chksize(jcr, &rctx.forkbfd, rctx.fork_size);
515          }
516          /*
517           * Use an impossible value and set a proper one below
518           */
519          rctx.fork_size = -1;
520          rctx.fork_addr = 0;
521       }
522
523       /*
524        * File Attributes stream
525        */
526       switch (rctx.stream) {
527       case STREAM_UNIX_ATTRIBUTES:
528       case STREAM_UNIX_ATTRIBUTES_EX:
529          /*
530           * if any previous stream open, close it
531           */
532          if (!close_previous_stream(jcr, rctx)) {
533             goto bail_out;
534          }
535
536          /*
537           * TODO: manage deleted files
538           */
539          if (rctx.type == FT_DELETED) { /* deleted file */
540             continue;
541          }
542          /*
543           * Restore objects should be ignored here -- they are
544           * returned at the beginning of the restore. 
545           */
546          if (IS_FT_OBJECT(rctx.type)) {
547             continue;
548          }
549
550          /*
551           * Unpack attributes and do sanity check them
552           */
553          if (!unpack_attributes_record(jcr, rctx.stream, sd->msg, sd->msglen, attr)) {
554             goto bail_out;
555          }
556
557          Dmsg3(100, "File %s\nattrib=%s\nattribsEx=%s\n", attr->fname,
558                attr->attr, attr->attrEx);
559          Dmsg3(100, "=== msglen=%d attrExlen=%d msg=%s\n", sd->msglen,
560                strlen(attr->attrEx), sd->msg);
561
562          attr->data_stream = decode_stat(attr->attr, &attr->statp, sizeof(attr->statp), &attr->LinkFI);
563
564          if (!is_restore_stream_supported(attr->data_stream)) {
565             if (!non_support_data++) {
566                Jmsg(jcr, M_WARNING, 0, _("%s stream not supported on this Client.\n"),
567                     stream_to_ascii(attr->data_stream));
568             }
569             continue;
570          }
571
572          build_attr_output_fnames(jcr, attr);
573
574          /*
575           * Try to actually create the file, which returns a status telling
576           * us if we need to extract or not.
577           */
578          jcr->num_files_examined++;
579          rctx.extract = false;
580          stat = CF_CORE;        /* By default, let Bacula's core handle it */
581
582          if (jcr->plugin) {
583             stat = plugin_create_file(jcr, attr, &rctx.bfd, jcr->replace);
584          } 
585          
586          if (stat == CF_CORE) {
587             stat = create_file(jcr, attr, &rctx.bfd, jcr->replace);
588          }
589          jcr->lock();  
590          pm_strcpy(jcr->last_fname, attr->ofname);
591          jcr->last_type = attr->type;
592          jcr->unlock();
593          Dmsg2(130, "Outfile=%s create_file stat=%d\n", attr->ofname, stat);
594          switch (stat) {
595          case CF_ERROR:
596          case CF_SKIP:
597             jcr->JobFiles++;
598             break;
599          case CF_EXTRACT:
600             /*
601              * File created and we expect file data
602              */
603             rctx.extract = true;
604             /*
605              * FALLTHROUGH
606              */
607          case CF_CREATED:
608             /*
609              * File created, but there is no content
610              */
611             rctx.fileAddr = 0;
612             print_ls_output(jcr, attr);
613
614             if (have_darwin_os) {
615                /*
616                 * Only restore the resource fork for regular files
617                 */
618                from_base64(&rsrc_len, attr->attrEx);
619                if (attr->type == FT_REG && rsrc_len > 0) {
620                   rctx.extract = true;
621                }
622
623                /*
624                 * Do not count the resource forks as regular files being restored.
625                 */
626                if (rsrc_len == 0) {
627                   jcr->JobFiles++;
628                }
629             } else {
630                jcr->JobFiles++;
631             }
632
633             if (!rctx.extract) {
634                /*
635                 * set attributes now because file will not be extracted
636                 */
637                if (jcr->plugin) {
638                   plugin_set_attributes(jcr, attr, &rctx.bfd);
639                } else {
640                   set_attributes(jcr, attr, &rctx.bfd);
641                }
642             }
643             break;
644          }
645          break;
646
647       /*
648        * Data stream
649        */
650       case STREAM_ENCRYPTED_SESSION_DATA:
651          crypto_error_t cryptoerr;
652
653          /*
654           * Is this an unexpected session data entry?
655           */
656          if (rctx.cs) {
657             Jmsg0(jcr, M_ERROR, 0, _("Unexpected cryptographic session data stream.\n"));
658             rctx.extract = false;
659             bclose(&rctx.bfd);
660             continue;
661          }
662
663          /*
664           * Do we have any keys at all?
665           */
666          if (!jcr->crypto.pki_recipients) {
667             Jmsg(jcr, M_ERROR, 0, _("No private decryption keys have been defined to decrypt encrypted backup data.\n"));
668             rctx.extract = false;
669             bclose(&rctx.bfd);
670             break;
671          }
672
673          if (jcr->crypto.digest) {
674             crypto_digest_free(jcr->crypto.digest);
675          }  
676          jcr->crypto.digest = crypto_digest_new(jcr, signing_algorithm);
677          if (!jcr->crypto.digest) {
678             Jmsg0(jcr, M_FATAL, 0, _("Could not create digest.\n"));
679             rctx.extract = false;
680             bclose(&rctx.bfd);
681             break;
682          }
683
684          /*
685           * Decode and save session keys.
686           */
687          cryptoerr = crypto_session_decode((uint8_t *)sd->msg, (uint32_t)sd->msglen, 
688                         jcr->crypto.pki_recipients, &rctx.cs);
689          switch(cryptoerr) {
690          case CRYPTO_ERROR_NONE:
691             /*
692              * Success
693              */
694             break;
695          case CRYPTO_ERROR_NORECIPIENT:
696             Jmsg(jcr, M_ERROR, 0, _("Missing private key required to decrypt encrypted backup data.\n"));
697             break;
698          case CRYPTO_ERROR_DECRYPTION:
699             Jmsg(jcr, M_ERROR, 0, _("Decrypt of the session key failed.\n"));
700             break;
701          default:
702             /*
703              * Shouldn't happen
704              */
705             Jmsg1(jcr, M_ERROR, 0, _("An error occurred while decoding encrypted session data stream: %s\n"), crypto_strerror(cryptoerr));
706             break;
707          }
708
709          if (cryptoerr != CRYPTO_ERROR_NONE) {
710             rctx.extract = false;
711             bclose(&rctx.bfd);
712             continue;
713          }
714
715          break;
716
717       case STREAM_FILE_DATA:
718       case STREAM_SPARSE_DATA:
719       case STREAM_WIN32_DATA:
720       case STREAM_GZIP_DATA:
721       case STREAM_SPARSE_GZIP_DATA:
722       case STREAM_WIN32_GZIP_DATA:
723       case STREAM_COMPRESSED_DATA:
724       case STREAM_SPARSE_COMPRESSED_DATA:
725       case STREAM_WIN32_COMPRESSED_DATA:
726       case STREAM_ENCRYPTED_FILE_DATA:
727       case STREAM_ENCRYPTED_WIN32_DATA:
728       case STREAM_ENCRYPTED_FILE_GZIP_DATA:
729       case STREAM_ENCRYPTED_WIN32_GZIP_DATA:
730       case STREAM_ENCRYPTED_FILE_COMPRESSED_DATA:
731       case STREAM_ENCRYPTED_WIN32_COMPRESSED_DATA:
732          /*
733           * Force an expected, consistent stream type here
734           */
735          if (rctx.extract && (rctx.prev_stream == rctx.stream 
736                          || rctx.prev_stream == STREAM_UNIX_ATTRIBUTES
737                          || rctx.prev_stream == STREAM_UNIX_ATTRIBUTES_EX
738                          || rctx.prev_stream == STREAM_ENCRYPTED_SESSION_DATA)) {
739             rctx.flags = 0;
740
741             if (rctx.stream == STREAM_SPARSE_DATA
742                   || rctx.stream == STREAM_SPARSE_COMPRESSED_DATA
743                   || rctx.stream == STREAM_SPARSE_GZIP_DATA) {
744                rctx.flags |= FO_SPARSE;
745             }
746
747             if (rctx.stream == STREAM_GZIP_DATA 
748                   || rctx.stream == STREAM_SPARSE_GZIP_DATA
749                   || rctx.stream == STREAM_WIN32_GZIP_DATA
750                   || rctx.stream == STREAM_ENCRYPTED_FILE_GZIP_DATA
751                   || rctx.stream == STREAM_COMPRESSED_DATA
752                   || rctx.stream == STREAM_SPARSE_COMPRESSED_DATA
753                   || rctx.stream == STREAM_WIN32_COMPRESSED_DATA
754                   || rctx.stream == STREAM_ENCRYPTED_FILE_COMPRESSED_DATA
755                   || rctx.stream == STREAM_ENCRYPTED_WIN32_COMPRESSED_DATA
756                   || rctx.stream == STREAM_ENCRYPTED_WIN32_GZIP_DATA) {
757                rctx.flags |= FO_COMPRESS;
758                rctx.comp_stream = rctx.stream;
759             }
760
761             if (rctx.stream == STREAM_ENCRYPTED_FILE_DATA
762                   || rctx.stream == STREAM_ENCRYPTED_FILE_GZIP_DATA
763                   || rctx.stream == STREAM_ENCRYPTED_WIN32_DATA
764                   || rctx.stream == STREAM_ENCRYPTED_FILE_COMPRESSED_DATA
765                   || rctx.stream == STREAM_ENCRYPTED_WIN32_COMPRESSED_DATA
766                   || rctx.stream == STREAM_ENCRYPTED_WIN32_GZIP_DATA) {               
767                /*
768                 * Set up a decryption context
769                 */
770                if (!rctx.cipher_ctx.cipher) {
771                   if (!rctx.cs) {
772                      Jmsg1(jcr, M_ERROR, 0, _("Missing encryption session data stream for %s\n"), jcr->last_fname);
773                      rctx.extract = false;
774                      bclose(&rctx.bfd);
775                      continue;
776                   }
777
778                   if ((rctx.cipher_ctx.cipher = crypto_cipher_new(rctx.cs, false, 
779                            &rctx.cipher_ctx.block_size)) == NULL) {
780                      Jmsg1(jcr, M_ERROR, 0, _("Failed to initialize decryption context for %s\n"), jcr->last_fname);
781                      free_session(rctx);
782                      rctx.extract = false;
783                      bclose(&rctx.bfd);
784                      continue;
785                   }
786                }
787                rctx.flags |= FO_ENCRYPT;
788             }
789
790             if (is_win32_stream(rctx.stream) && !have_win32_api()) {
791                set_portable_backup(&rctx.bfd);
792                /*
793                 * "decompose" BackupWrite data
794                 */
795                rctx.flags |= FO_WIN32DECOMP;
796             }
797
798             if (extract_data(jcr, &rctx.bfd, sd->msg, sd->msglen, &rctx.fileAddr,
799                              rctx.flags, rctx.stream, &rctx.cipher_ctx) < 0) {
800                rctx.extract = false;
801                bclose(&rctx.bfd);
802                continue;
803             }
804          }
805          break;
806
807       /*
808        * Resource fork stream - only recorded after a file to be restored
809        * Silently ignore if we cannot write - we already reported that
810        */
811       case STREAM_ENCRYPTED_MACOS_FORK_DATA:
812       case STREAM_MACOS_FORK_DATA:
813          if (have_darwin_os) {
814             rctx.fork_flags = 0;
815             jcr->ff->flags |= FO_HFSPLUS;
816
817             if (rctx.stream == STREAM_ENCRYPTED_MACOS_FORK_DATA) {
818                rctx.fork_flags |= FO_ENCRYPT;
819
820                /*
821                 * Set up a decryption context
822                 */
823                if (rctx.extract && !rctx.fork_cipher_ctx.cipher) {
824                   if (!rctx.cs) {
825                      Jmsg1(jcr, M_ERROR, 0, _("Missing encryption session data stream for %s\n"), jcr->last_fname);
826                      rctx.extract = false;
827                      bclose(&rctx.bfd);
828                      continue;
829                   }
830
831                   if ((rctx.fork_cipher_ctx.cipher = crypto_cipher_new(rctx.cs, false, &rctx.fork_cipher_ctx.block_size)) == NULL) {
832                      Jmsg1(jcr, M_ERROR, 0, _("Failed to initialize decryption context for %s\n"), jcr->last_fname);
833                      free_session(rctx);
834                      rctx.extract = false;
835                      bclose(&rctx.bfd);
836                      continue;
837                   }
838                }
839             }
840
841             if (rctx.extract) {
842                if (rctx.prev_stream != rctx.stream) {
843                   if (bopen_rsrc(&rctx.forkbfd, jcr->last_fname, O_WRONLY | O_TRUNC | O_BINARY, 0) < 0) {
844                      Jmsg(jcr, M_WARNING, 0, _("Cannot open resource fork for %s.\n"), jcr->last_fname);
845                      rctx.extract = false;
846                      continue;
847                   }
848
849                   rctx.fork_size = rsrc_len;
850                   Dmsg0(130, "Restoring resource fork\n");
851                }
852
853                if (extract_data(jcr, &rctx.forkbfd, sd->msg, sd->msglen, &rctx.fork_addr, rctx.fork_flags,
854                                 rctx.stream, &rctx.fork_cipher_ctx) < 0) {
855                   rctx.extract = false;
856                   bclose(&rctx.forkbfd);
857                   continue;
858                }
859             }
860          } else {
861             non_support_rsrc++;
862          }
863          break;
864
865       case STREAM_HFSPLUS_ATTRIBUTES:
866          if (have_darwin_os) {
867             if (!restore_finderinfo(jcr, sd->msg, sd->msglen)) {
868                continue;
869             }
870          } else {
871             non_support_finfo++;
872          }
873          break;
874
875       case STREAM_UNIX_ACCESS_ACL:
876       case STREAM_UNIX_DEFAULT_ACL:
877       case STREAM_ACL_AIX_TEXT:
878       case STREAM_ACL_DARWIN_ACCESS_ACL:
879       case STREAM_ACL_FREEBSD_DEFAULT_ACL:
880       case STREAM_ACL_FREEBSD_ACCESS_ACL:
881       case STREAM_ACL_HPUX_ACL_ENTRY:
882       case STREAM_ACL_IRIX_DEFAULT_ACL:
883       case STREAM_ACL_IRIX_ACCESS_ACL:
884       case STREAM_ACL_LINUX_DEFAULT_ACL:
885       case STREAM_ACL_LINUX_ACCESS_ACL:
886       case STREAM_ACL_TRU64_DEFAULT_ACL:
887       case STREAM_ACL_TRU64_DEFAULT_DIR_ACL:
888       case STREAM_ACL_TRU64_ACCESS_ACL:
889       case STREAM_ACL_SOLARIS_ACLENT:
890       case STREAM_ACL_SOLARIS_ACE:
891       case STREAM_ACL_AFS_TEXT:
892       case STREAM_ACL_AIX_AIXC:
893       case STREAM_ACL_AIX_NFS4:
894       case STREAM_ACL_FREEBSD_NFS4_ACL:
895          /*
896           * Do not restore ACLs when
897           * a) The current file is not extracted
898           * b)     and it is not a directory (they are never "extracted")
899           * c) or the file name is empty
900           */
901          if ((!rctx.extract &&
902                jcr->last_type != FT_DIREND) ||
903              (*jcr->last_fname == 0)) {
904             break;
905          }
906          if (have_acl) {
907             /*
908              * For anything that is not a directory we delay
909              * the restore of acls till a later stage.
910              */
911             if (jcr->last_type != FT_DIREND) {
912                push_delayed_restore_stream(rctx, sd);
913             } else {
914                if (!do_restore_acl(jcr, rctx.stream, sd->msg, sd->msglen)) {
915                   goto bail_out;
916                }
917             }
918          } else {
919             non_support_acl++;
920          }
921          break;
922
923       case STREAM_XATTR_IRIX:
924       case STREAM_XATTR_TRU64:
925       case STREAM_XATTR_AIX:
926       case STREAM_XATTR_OPENBSD:
927       case STREAM_XATTR_SOLARIS_SYS:
928       case STREAM_XATTR_DARWIN:
929       case STREAM_XATTR_FREEBSD:
930       case STREAM_XATTR_LINUX:
931       case STREAM_XATTR_NETBSD:
932          /*
933           * Do not restore Extended Attributes when
934           * a) The current file is not extracted
935           * b)     and it is not a directory (they are never "extracted")
936           * c) or the file name is empty
937           */
938          if ((!rctx.extract &&
939                jcr->last_type != FT_DIREND) ||
940              (*jcr->last_fname == 0)) {
941             break;
942          }
943          if (have_xattr) {
944             /*
945              * For anything that is not a directory we delay
946              * the restore of xattr till a later stage.
947              */
948             if (jcr->last_type != FT_DIREND) {
949                push_delayed_restore_stream(rctx, sd);
950             } else {
951                if (!do_restore_xattr(jcr, rctx.stream, sd->msg, sd->msglen)) {
952                   goto bail_out;
953                }
954             }
955          } else {
956             non_support_xattr++;
957          }
958          break;
959
960       case STREAM_XATTR_SOLARIS:
961          /*
962           * Do not restore Extended Attributes when
963           * a) The current file is not extracted
964           * b)     and it is not a directory (they are never "extracted")
965           * c) or the file name is empty
966           */
967          if ((!rctx.extract &&
968                jcr->last_type != FT_DIREND) ||
969              (*jcr->last_fname == 0)) {
970             break;
971          }
972          if (have_xattr) {
973             if (!do_restore_xattr(jcr, rctx.stream, sd->msg, sd->msglen)) {
974                goto bail_out;
975             }
976          } else {
977             non_support_xattr++;
978          }
979          break;
980
981       case STREAM_SIGNED_DIGEST:
982          /*
983           * Is this an unexpected signature?
984           */
985          if (rctx.sig) {
986             Jmsg0(jcr, M_ERROR, 0, _("Unexpected cryptographic signature data stream.\n"));
987             free_signature(rctx);
988             continue;
989          }
990          /*
991           * Save signature.
992           */
993          if (rctx.extract && (rctx.sig = crypto_sign_decode(jcr, (uint8_t *)sd->msg, (uint32_t)sd->msglen)) == NULL) {
994             Jmsg1(jcr, M_ERROR, 0, _("Failed to decode message signature for %s\n"), jcr->last_fname);
995          }
996          break;
997
998       case STREAM_MD5_DIGEST:
999       case STREAM_SHA1_DIGEST:
1000       case STREAM_SHA256_DIGEST:
1001       case STREAM_SHA512_DIGEST:
1002          break;
1003
1004       case STREAM_PROGRAM_NAMES:
1005       case STREAM_PROGRAM_DATA:
1006          if (!non_support_progname) {
1007             Pmsg0(000, "Got Program Name or Data Stream. Ignored.\n");
1008             non_support_progname++;
1009          }
1010          break;
1011
1012       case STREAM_PLUGIN_NAME:
1013          if (!close_previous_stream(jcr, rctx)) {
1014             goto bail_out;
1015          }
1016          Dmsg1(50, "restore stream_plugin_name=%s\n", sd->msg);
1017          plugin_name_stream(jcr, sd->msg);
1018          break;
1019
1020       case STREAM_RESTORE_OBJECT:
1021          break;                    /* these are sent by Director */
1022
1023       default:
1024          if (!close_previous_stream(jcr, rctx)) {
1025             goto bail_out;
1026          }
1027          Jmsg(jcr, M_WARNING, 0, _("Unknown stream=%d ignored. This shouldn't happen!\n"),
1028               rctx.stream);
1029          Dmsg2(0, "Unknown stream=%d data=%s\n", rctx.stream, sd->msg);
1030          break;
1031       } /* end switch(stream) */
1032    } /* end while get_msg() */
1033
1034    /*
1035     * If output file is still open, it was the last one in the
1036     * archive since we just hit an end of file, so close the file.
1037     */
1038    if (is_bopen(&rctx.forkbfd)) {
1039       bclose_chksize(jcr, &rctx.forkbfd, rctx.fork_size);
1040    }
1041
1042    if (!close_previous_stream(jcr, rctx)) {
1043       goto bail_out;
1044    }
1045    jcr->setJobStatus(JS_Terminated);
1046    goto ok_out;
1047
1048 bail_out:
1049    jcr->setJobStatus(JS_ErrorTerminated);
1050
1051 ok_out:
1052    /*
1053     * First output the statistics.
1054     */
1055    Dmsg2(10, "End Do Restore. Files=%d Bytes=%s\n", jcr->JobFiles,
1056       edit_uint64(jcr->JobBytes, ec1));
1057    if (have_acl && jcr->acl_data->u.parse->nr_errors > 0) {
1058       Jmsg(jcr, M_WARNING, 0, _("Encountered %ld acl errors while doing restore\n"),
1059            jcr->acl_data->u.parse->nr_errors);
1060    }
1061    if (have_xattr && jcr->xattr_data->u.parse->nr_errors > 0) {
1062       Jmsg(jcr, M_WARNING, 0, _("Encountered %ld xattr errors while doing restore\n"),
1063            jcr->xattr_data->u.parse->nr_errors);
1064    }
1065    if (non_support_data > 1 || non_support_attr > 1) {
1066       Jmsg(jcr, M_WARNING, 0, _("%d non-supported data streams and %d non-supported attrib streams ignored.\n"),
1067          non_support_data, non_support_attr);
1068    }
1069    if (non_support_rsrc) {
1070       Jmsg(jcr, M_INFO, 0, _("%d non-supported resource fork streams ignored.\n"), non_support_rsrc);
1071    }
1072    if (non_support_finfo) {
1073       Jmsg(jcr, M_INFO, 0, _("%d non-supported Finder Info streams ignored.\n"), non_support_finfo);
1074    }
1075    if (non_support_acl) {
1076       Jmsg(jcr, M_INFO, 0, _("%d non-supported acl streams ignored.\n"), non_support_acl);
1077    }
1078    if (non_support_crypto) {
1079       Jmsg(jcr, M_INFO, 0, _("%d non-supported crypto streams ignored.\n"), non_support_acl);
1080    }
1081    if (non_support_xattr) {
1082       Jmsg(jcr, M_INFO, 0, _("%d non-supported xattr streams ignored.\n"), non_support_xattr);
1083    }
1084
1085    /*
1086     * Free Signature & Crypto Data
1087     */
1088    free_signature(rctx);
1089    free_session(rctx);
1090    if (jcr->crypto.digest) {
1091       crypto_digest_free(jcr->crypto.digest);
1092       jcr->crypto.digest = NULL;
1093    }
1094
1095    /*
1096     * Free file cipher restore context
1097     */
1098    if (rctx.cipher_ctx.cipher) {
1099       crypto_cipher_free(rctx.cipher_ctx.cipher);
1100       rctx.cipher_ctx.cipher = NULL;
1101    }
1102
1103    if (rctx.cipher_ctx.buf) {
1104       free_pool_memory(rctx.cipher_ctx.buf);
1105       rctx.cipher_ctx.buf = NULL;
1106    }
1107
1108    /*
1109     * Free alternate stream cipher restore context
1110     */
1111    if (rctx.fork_cipher_ctx.cipher) {
1112       crypto_cipher_free(rctx.fork_cipher_ctx.cipher);
1113       rctx.fork_cipher_ctx.cipher = NULL;
1114    }
1115    if (rctx.fork_cipher_ctx.buf) {
1116       free_pool_memory(rctx.fork_cipher_ctx.buf);
1117       rctx.fork_cipher_ctx.buf = NULL;
1118    }
1119
1120    if (jcr->compress_buf) {
1121       free_pool_memory(jcr->compress_buf);
1122       jcr->compress_buf = NULL;
1123       jcr->compress_buf_size = 0;
1124    }
1125
1126    if (have_acl && jcr->acl_data) {
1127       free(jcr->acl_data->u.parse);
1128       free(jcr->acl_data);
1129       jcr->acl_data = NULL;
1130    }
1131
1132    if (have_xattr && jcr->xattr_data) {
1133       free(jcr->xattr_data->u.parse);
1134       free(jcr->xattr_data);
1135       jcr->xattr_data = NULL;
1136    }
1137
1138    /*
1139     * Free the delayed stream stack list.
1140     */
1141    if (rctx.delayed_streams) {
1142       drop_delayed_restore_streams(rctx, false);
1143       delete rctx.delayed_streams;
1144    }
1145
1146    bclose(&rctx.forkbfd);
1147    bclose(&rctx.bfd);
1148    free_attr(rctx.attr);
1149 }
1150
1151 #ifdef HAVE_LIBZ
1152 /*
1153  * Convert ZLIB error code into an ASCII message
1154  */
1155 static const char *zlib_strerror(int stat)
1156 {
1157    if (stat >= 0) {
1158       return _("None");
1159    }
1160    switch (stat) {
1161    case Z_ERRNO:
1162       return _("Zlib errno");
1163    case Z_STREAM_ERROR:
1164       return _("Zlib stream error");
1165    case Z_DATA_ERROR:
1166       return _("Zlib data error");
1167    case Z_MEM_ERROR:
1168       return _("Zlib memory error");
1169    case Z_BUF_ERROR:
1170       return _("Zlib buffer error");
1171    case Z_VERSION_ERROR:
1172       return _("Zlib version error");
1173    default:
1174       return _("*none*");
1175    }
1176 }
1177 #endif
1178
1179 static int do_file_digest(JCR *jcr, FF_PKT *ff_pkt, bool top_level) 
1180 {
1181    Dmsg1(50, "do_file_digest jcr=%p\n", jcr);
1182    return (digest_file(jcr, ff_pkt, jcr->crypto.digest));
1183 }
1184
1185 /*
1186  * Verify the signature for the last restored file
1187  * Return value is either true (signature correct)
1188  * or false (signature could not be verified).
1189  * TODO landonf: Implement without using find_one_file and
1190  * without re-reading the file.
1191  */
1192 static bool verify_signature(JCR *jcr, r_ctx &rctx)
1193 {
1194    X509_KEYPAIR *keypair;
1195    DIGEST *digest = NULL;
1196    crypto_error_t err;
1197    uint64_t saved_bytes;
1198    crypto_digest_t signing_algorithm = have_sha2 ? 
1199                                        CRYPTO_DIGEST_SHA256 : CRYPTO_DIGEST_SHA1;
1200    crypto_digest_t algorithm;
1201    SIGNATURE *sig = rctx.sig;
1202
1203
1204    if (!jcr->crypto.pki_sign) {
1205       /*
1206        * no signature OK
1207        */
1208       return true;
1209    }
1210    if (!sig) {
1211       if (rctx.type == FT_REGE || rctx.type == FT_REG || rctx.type == FT_RAW) { 
1212          Jmsg1(jcr, M_ERROR, 0, _("Missing cryptographic signature for %s\n"), 
1213                jcr->last_fname);
1214          goto bail_out;
1215       }
1216       return true;
1217    }
1218
1219    /*
1220     * Iterate through the trusted signers
1221     */
1222    foreach_alist(keypair, jcr->crypto.pki_signers) {
1223       err = crypto_sign_get_digest(sig, jcr->crypto.pki_keypair, algorithm, &digest);
1224       switch (err) {
1225       case CRYPTO_ERROR_NONE:
1226          Dmsg0(50, "== Got digest\n");
1227          /*
1228           * We computed jcr->crypto.digest using signing_algorithm while writing
1229           * the file. If it is not the same as the algorithm used for 
1230           * this file, punt by releasing the computed algorithm and 
1231           * computing by re-reading the file.
1232           */
1233          if (algorithm != signing_algorithm) {
1234             if (jcr->crypto.digest) {
1235                crypto_digest_free(jcr->crypto.digest);
1236                jcr->crypto.digest = NULL;
1237             }  
1238          }
1239          if (jcr->crypto.digest) {
1240              /*
1241               * Use digest computed while writing the file to verify the signature
1242               */
1243             if ((err = crypto_sign_verify(sig, keypair, jcr->crypto.digest)) != CRYPTO_ERROR_NONE) {
1244                Dmsg1(50, "Bad signature on %s\n", jcr->last_fname);
1245                Jmsg2(jcr, M_ERROR, 0, _("Signature validation failed for file %s: ERR=%s\n"), 
1246                      jcr->last_fname, crypto_strerror(err));
1247                goto bail_out;
1248             }
1249          } else {   
1250             /*
1251              * Signature found, digest allocated.  Old method, 
1252              * re-read the file and compute the digest
1253              */
1254             jcr->crypto.digest = digest;
1255
1256             /*
1257              * Checksum the entire file
1258              * Make sure we don't modify JobBytes by saving and restoring it
1259              */
1260             saved_bytes = jcr->JobBytes;                     
1261             if (find_one_file(jcr, jcr->ff, do_file_digest, jcr->last_fname, (dev_t)-1, 1) != 0) {
1262                Jmsg(jcr, M_ERROR, 0, _("Digest one file failed for file: %s\n"), 
1263                     jcr->last_fname);
1264                jcr->JobBytes = saved_bytes;
1265                goto bail_out;
1266             }
1267             jcr->JobBytes = saved_bytes;
1268
1269             /*
1270              * Verify the signature
1271              */
1272             if ((err = crypto_sign_verify(sig, keypair, digest)) != CRYPTO_ERROR_NONE) {
1273                Dmsg1(50, "Bad signature on %s\n", jcr->last_fname);
1274                Jmsg2(jcr, M_ERROR, 0, _("Signature validation failed for file %s: ERR=%s\n"), 
1275                      jcr->last_fname, crypto_strerror(err));
1276                goto bail_out;
1277             }
1278             jcr->crypto.digest = NULL;
1279          }
1280
1281          /*
1282           * Valid signature
1283           */
1284          Dmsg1(50, "Signature good on %s\n", jcr->last_fname);
1285          crypto_digest_free(digest);
1286          return true;
1287
1288       case CRYPTO_ERROR_NOSIGNER:
1289          /*
1290           * Signature not found, try again
1291           */
1292          if (digest) {
1293             crypto_digest_free(digest);
1294             digest = NULL;
1295          }
1296          continue;
1297       default:
1298          /*
1299           * Something strange happened (that shouldn't happen!)...
1300           */
1301          Qmsg2(jcr, M_ERROR, 0, _("Signature validation failed for %s: %s\n"), jcr->last_fname, crypto_strerror(err));
1302          goto bail_out;
1303       }
1304    }
1305
1306    /*
1307     * No signer
1308     */
1309    Dmsg1(50, "Could not find a valid public key for signature on %s\n", jcr->last_fname);
1310
1311 bail_out:
1312    if (digest) {
1313       crypto_digest_free(digest);
1314    }
1315    return false;
1316 }
1317
1318 bool sparse_data(JCR *jcr, BFILE *bfd, uint64_t *addr, char **data, uint32_t *length)
1319 {
1320       unser_declare;
1321       uint64_t faddr;
1322       char ec1[50];
1323       unser_begin(*data, OFFSET_FADDR_SIZE);
1324       unser_uint64(faddr);
1325       if (*addr != faddr) {
1326          *addr = faddr;
1327          if (blseek(bfd, (boffset_t)*addr, SEEK_SET) < 0) {
1328             berrno be;
1329             Jmsg3(jcr, M_ERROR, 0, _("Seek to %s error on %s: ERR=%s\n"),
1330                   edit_uint64(*addr, ec1), jcr->last_fname, 
1331                   be.bstrerror(bfd->berrno));
1332             return false;
1333          }
1334       }
1335       *data += OFFSET_FADDR_SIZE;
1336       *length -= OFFSET_FADDR_SIZE;
1337       return true;
1338 }
1339
1340 bool decompress_data(JCR *jcr, int32_t stream, char **data, uint32_t *length)
1341 {
1342 #if defined(HAVE_LZO) || defined(HAVE_LIBZ)
1343    char ec1[50]; /* Buffer printing huge values */
1344 #endif
1345
1346    Dmsg1(200, "Stream found in decompress_data(): %d\n", stream);
1347    if(stream == STREAM_COMPRESSED_DATA || stream == STREAM_SPARSE_COMPRESSED_DATA || stream == STREAM_WIN32_COMPRESSED_DATA
1348        || stream == STREAM_ENCRYPTED_FILE_COMPRESSED_DATA || stream == STREAM_ENCRYPTED_WIN32_COMPRESSED_DATA)
1349    {
1350       uint32_t comp_magic, comp_len;
1351       uint16_t comp_level, comp_version;
1352 #ifdef HAVE_LZO
1353       lzo_uint compress_len;
1354       const unsigned char *cbuf;
1355       int r, real_compress_len;
1356 #endif
1357
1358       /* read compress header */
1359       unser_declare;
1360       unser_begin(*data, sizeof(comp_stream_header));
1361       unser_uint32(comp_magic);
1362       unser_uint32(comp_len);
1363       unser_uint16(comp_level);
1364       unser_uint16(comp_version);
1365       Dmsg4(200, "Compressed data stream found: magic=0x%x, len=%d, level=%d, ver=0x%x\n", comp_magic, comp_len,
1366                               comp_level, comp_version);
1367
1368       /* version check */
1369       if (comp_version != COMP_HEAD_VERSION) {
1370          Qmsg(jcr, M_ERROR, 0, _("Compressed header version error. version=0x%x\n"), comp_version);
1371          return false;
1372       }
1373       /* size check */
1374       if (comp_len + sizeof(comp_stream_header) != *length) {
1375          Qmsg(jcr, M_ERROR, 0, _("Compressed header size error. comp_len=%d, msglen=%d\n"),
1376               comp_len, *length);
1377          return false;
1378       }
1379       switch(comp_magic) {
1380 #ifdef HAVE_LZO
1381          case COMPRESS_LZO1X:
1382             compress_len = jcr->compress_buf_size;
1383             cbuf = (const unsigned char*)*data + sizeof(comp_stream_header);
1384             real_compress_len = *length - sizeof(comp_stream_header);
1385             Dmsg2(200, "Comp_len=%d msglen=%d\n", compress_len, *length);
1386             while ((r=lzo1x_decompress_safe(cbuf, real_compress_len,
1387                                             (unsigned char *)jcr->compress_buf, &compress_len, NULL)) == LZO_E_OUTPUT_OVERRUN)
1388             {
1389                /*
1390                 * The buffer size is too small, try with a bigger one
1391                 */
1392                compress_len = jcr->compress_buf_size = jcr->compress_buf_size + (jcr->compress_buf_size >> 1);
1393                Dmsg2(200, "Comp_len=%d msglen=%d\n", compress_len, *length);
1394                jcr->compress_buf = check_pool_memory_size(jcr->compress_buf,
1395                                                     compress_len);
1396             }
1397             if (r != LZO_E_OK) {
1398                Qmsg(jcr, M_ERROR, 0, _("LZO uncompression error on file %s. ERR=%d\n"),
1399                     jcr->last_fname, r);
1400                return false;
1401             }
1402             *data = jcr->compress_buf;
1403             *length = compress_len;
1404             Dmsg2(200, "Write uncompressed %d bytes, total before write=%s\n", compress_len, edit_uint64(jcr->JobBytes, ec1));
1405             return true;
1406 #endif
1407          default:
1408             Qmsg(jcr, M_ERROR, 0, _("Compression algorithm 0x%x found, but not supported!\n"), comp_magic);
1409             return false;
1410       }
1411     } else {
1412 #ifdef HAVE_LIBZ
1413       uLong compress_len;
1414       int stat;
1415
1416       /* 
1417        * NOTE! We only use uLong and Byte because they are
1418        * needed by the zlib routines, they should not otherwise
1419        * be used in Bacula.
1420        */
1421       compress_len = jcr->compress_buf_size;
1422       Dmsg2(200, "Comp_len=%d msglen=%d\n", compress_len, *length);
1423       while ((stat=uncompress((Byte *)jcr->compress_buf, &compress_len,
1424                               (const Byte *)*data, (uLong)*length)) == Z_BUF_ERROR)
1425       {
1426          /*
1427           * The buffer size is too small, try with a bigger one
1428           */
1429          compress_len = jcr->compress_buf_size = jcr->compress_buf_size + (jcr->compress_buf_size >> 1);
1430          Dmsg2(200, "Comp_len=%d msglen=%d\n", compress_len, *length);
1431          jcr->compress_buf = check_pool_memory_size(jcr->compress_buf,
1432                                                     compress_len);
1433       }
1434       if (stat != Z_OK) {
1435          Qmsg(jcr, M_ERROR, 0, _("Uncompression error on file %s. ERR=%s\n"),
1436               jcr->last_fname, zlib_strerror(stat));
1437          return false;
1438       }
1439       *data = jcr->compress_buf;
1440       *length = compress_len;
1441       Dmsg2(200, "Write uncompressed %d bytes, total before write=%s\n", compress_len, edit_uint64(jcr->JobBytes, ec1));
1442       return true;
1443 #else
1444       Qmsg(jcr, M_ERROR, 0, _("GZIP data stream found, but GZIP not configured!\n"));
1445       return false;
1446 #endif
1447    }
1448 }
1449
1450 static void unser_crypto_packet_len(RESTORE_CIPHER_CTX *ctx)
1451 {
1452    unser_declare;
1453    if (ctx->packet_len == 0 && ctx->buf_len >= CRYPTO_LEN_SIZE) {
1454       unser_begin(&ctx->buf[0], CRYPTO_LEN_SIZE);
1455       unser_uint32(ctx->packet_len);
1456       ctx->packet_len += CRYPTO_LEN_SIZE;
1457    }
1458 }
1459
1460 bool store_data(JCR *jcr, BFILE *bfd, char *data, const int32_t length, bool win32_decomp)
1461 {
1462    if (jcr->crypto.digest) {
1463       crypto_digest_update(jcr->crypto.digest, (uint8_t *)data, length);
1464    }
1465    if (win32_decomp) {
1466       if (!processWin32BackupAPIBlock(bfd, data, length)) {
1467          berrno be;
1468          Jmsg2(jcr, M_ERROR, 0, _("Write error in Win32 Block Decomposition on %s: %s\n"), 
1469                jcr->last_fname, be.bstrerror(bfd->berrno));
1470          return false;
1471       }
1472    } else if (bwrite(bfd, data, length) != (ssize_t)length) {
1473       berrno be;
1474       Jmsg2(jcr, M_ERROR, 0, _("Write error on %s: %s\n"), 
1475             jcr->last_fname, be.bstrerror(bfd->berrno));
1476       return false;
1477    }
1478
1479    return true;
1480 }
1481
1482 /*
1483  * In the context of jcr, write data to bfd.
1484  * We write buflen bytes in buf at addr. addr is updated in place.
1485  * The flags specify whether to use sparse files or compression.
1486  * Return value is the number of bytes written, or -1 on errors.
1487  */
1488 int32_t extract_data(JCR *jcr, BFILE *bfd, POOLMEM *buf, int32_t buflen,
1489                      uint64_t *addr, int flags, int32_t stream, RESTORE_CIPHER_CTX *cipher_ctx)
1490 {
1491    char *wbuf;                 /* write buffer */
1492    uint32_t wsize;             /* write size */
1493    uint32_t rsize;             /* read size */
1494    uint32_t decrypted_len = 0; /* Decryption output length */
1495    char ec1[50];               /* Buffer printing huge values */
1496
1497    rsize = buflen;
1498    jcr->ReadBytes += rsize;
1499    wsize = rsize;
1500    wbuf = buf;
1501
1502    if (flags & FO_ENCRYPT) {
1503       ASSERT(cipher_ctx->cipher);
1504
1505       /*
1506        * NOTE: We must implement block preserving semantics for the
1507        * non-streaming compression and sparse code.
1508        *
1509        * Grow the crypto buffer, if necessary.
1510        * crypto_cipher_update() will process only whole blocks,
1511        * buffering the remaining input.
1512        */
1513       cipher_ctx->buf = check_pool_memory_size(cipher_ctx->buf, 
1514                         cipher_ctx->buf_len + wsize + cipher_ctx->block_size);
1515
1516       /*
1517        * Decrypt the input block
1518        */
1519       if (!crypto_cipher_update(cipher_ctx->cipher, 
1520                                 (const u_int8_t *)wbuf, 
1521                                 wsize, 
1522                                 (u_int8_t *)&cipher_ctx->buf[cipher_ctx->buf_len], 
1523                                 &decrypted_len)) {
1524          /*
1525           * Decryption failed. Shouldn't happen.
1526           */
1527          Jmsg(jcr, M_FATAL, 0, _("Decryption error\n"));
1528          goto bail_out;
1529       }
1530
1531       if (decrypted_len == 0) {
1532          /*
1533           * No full block of encrypted data available, write more data
1534           */
1535          return 0;
1536       }
1537
1538       Dmsg2(200, "decrypted len=%d encrypted len=%d\n", decrypted_len, wsize);
1539
1540       cipher_ctx->buf_len += decrypted_len;
1541       wbuf = cipher_ctx->buf;
1542
1543       /*
1544        * If one full preserved block is available, write it to disk,
1545        * and then buffer any remaining data. This should be effecient
1546        * as long as Bacula's block size is not significantly smaller than the
1547        * encryption block size (extremely unlikely!)
1548        */
1549       unser_crypto_packet_len(cipher_ctx);
1550       Dmsg1(500, "Crypto unser block size=%d\n", cipher_ctx->packet_len - CRYPTO_LEN_SIZE);
1551
1552       if (cipher_ctx->packet_len == 0 || cipher_ctx->buf_len < cipher_ctx->packet_len) {
1553          /*
1554           * No full preserved block is available.
1555           */
1556          return 0;
1557       }
1558
1559       /*
1560        * We have one full block, set up the filter input buffers
1561        */
1562       wsize = cipher_ctx->packet_len - CRYPTO_LEN_SIZE;
1563       wbuf = &wbuf[CRYPTO_LEN_SIZE]; /* Skip the block length header */
1564       cipher_ctx->buf_len -= cipher_ctx->packet_len;
1565       Dmsg2(130, "Encryption writing full block, %u bytes, remaining %u bytes in buffer\n", wsize, cipher_ctx->buf_len);
1566    }
1567
1568    if ((flags & FO_SPARSE) || (flags & FO_OFFSETS)) {
1569       if (!sparse_data(jcr, bfd, addr, &wbuf, &wsize)) {
1570          goto bail_out;
1571       }
1572    }
1573
1574    if (flags & FO_COMPRESS) {
1575       if (!decompress_data(jcr, stream, &wbuf, &wsize)) {
1576          goto bail_out;
1577       }
1578    }
1579
1580    if (!store_data(jcr, bfd, wbuf, wsize, (flags & FO_WIN32DECOMP) != 0)) {
1581       goto bail_out;
1582    }
1583    jcr->JobBytes += wsize;
1584    *addr += wsize;
1585    Dmsg2(130, "Write %u bytes, JobBytes=%s\n", wsize, edit_uint64(jcr->JobBytes, ec1));
1586
1587    /*
1588     * Clean up crypto buffers
1589     */
1590    if (flags & FO_ENCRYPT) {
1591       /* Move any remaining data to start of buffer */
1592       if (cipher_ctx->buf_len > 0) {
1593          Dmsg1(130, "Moving %u buffered bytes to start of buffer\n", cipher_ctx->buf_len);
1594          memmove(cipher_ctx->buf, &cipher_ctx->buf[cipher_ctx->packet_len], 
1595             cipher_ctx->buf_len);
1596       }
1597       /*
1598        * The packet was successfully written, reset the length so that the next
1599        * packet length may be re-read by unser_crypto_packet_len()
1600        */
1601       cipher_ctx->packet_len = 0;
1602    }
1603    return wsize;
1604
1605 bail_out:
1606    return -1;
1607 }
1608
1609 /*
1610  * If extracting, close any previous stream
1611  */
1612 static bool close_previous_stream(JCR *jcr, r_ctx &rctx)
1613 {
1614    /*
1615     * If extracting, it was from previous stream, so
1616     * close the output file and validate the signature.
1617     */
1618    if (rctx.extract) {
1619       if (rctx.size > 0 && !is_bopen(&rctx.bfd)) {
1620          Jmsg0(rctx.jcr, M_ERROR, 0, _("Logic error: output file should be open\n"));
1621          Dmsg2(000, "=== logic error size=%d bopen=%d\n", rctx.size, 
1622             is_bopen(&rctx.bfd));
1623       }
1624
1625       if (rctx.prev_stream != STREAM_ENCRYPTED_SESSION_DATA) {
1626          deallocate_cipher(rctx);
1627          deallocate_fork_cipher(rctx);
1628       }
1629
1630       if (rctx.jcr->plugin) {
1631          plugin_set_attributes(rctx.jcr, rctx.attr, &rctx.bfd);
1632       } else {
1633          set_attributes(rctx.jcr, rctx.attr, &rctx.bfd);
1634       }
1635       rctx.extract = false;
1636
1637       /*
1638        * Now perform the delayed restore of some specific data streams.
1639        */
1640       if (!pop_delayed_data_streams(jcr, rctx)) {
1641          return false;
1642       }
1643
1644       /*
1645        * Verify the cryptographic signature, if any
1646        */
1647       rctx.type = rctx.attr->type;
1648       verify_signature(rctx.jcr, rctx);
1649
1650       /*
1651        * Free Signature
1652        */
1653       free_signature(rctx);
1654       free_session(rctx);
1655       rctx.jcr->ff->flags = 0;
1656       Dmsg0(130, "Stop extracting.\n");
1657    } else if (is_bopen(&rctx.bfd)) {
1658       Jmsg0(rctx.jcr, M_ERROR, 0, _("Logic error: output file should not be open\n"));
1659       Dmsg0(000, "=== logic error !open\n");
1660       bclose(&rctx.bfd);
1661    }
1662
1663    return true;
1664 }
1665
1666 /*
1667  * In the context of jcr, flush any remaining data from the cipher context,
1668  * writing it to bfd.
1669  * Return value is true on success, false on failure.
1670  */
1671 bool flush_cipher(JCR *jcr, BFILE *bfd, uint64_t *addr, int flags, int32_t stream,
1672                   RESTORE_CIPHER_CTX *cipher_ctx)
1673 {
1674    uint32_t decrypted_len = 0;
1675    char *wbuf;                        /* write buffer */
1676    uint32_t wsize;                    /* write size */
1677    char ec1[50];                      /* Buffer printing huge values */
1678    bool second_pass = false;
1679
1680 again:
1681    /*
1682     * Write out the remaining block and free the cipher context
1683     */
1684    cipher_ctx->buf = check_pool_memory_size(cipher_ctx->buf, cipher_ctx->buf_len + 
1685                                             cipher_ctx->block_size);
1686
1687    if (!crypto_cipher_finalize(cipher_ctx->cipher, (uint8_t *)&cipher_ctx->buf[cipher_ctx->buf_len],
1688         &decrypted_len)) {
1689       /*
1690        * Writing out the final, buffered block failed. Shouldn't happen.
1691        */
1692       Jmsg3(jcr, M_ERROR, 0, _("Decryption error. buf_len=%d decrypt_len=%d on file %s\n"), 
1693             cipher_ctx->buf_len, decrypted_len, jcr->last_fname);
1694    }
1695
1696    Dmsg2(130, "Flush decrypt len=%d buf_len=%d\n", decrypted_len, cipher_ctx->buf_len);
1697    /*
1698     * If nothing new was decrypted, and our output buffer is empty, return
1699     */
1700    if (decrypted_len == 0 && cipher_ctx->buf_len == 0) {
1701       return true;
1702    }
1703
1704    cipher_ctx->buf_len += decrypted_len;
1705
1706    unser_crypto_packet_len(cipher_ctx);
1707    Dmsg1(500, "Crypto unser block size=%d\n", cipher_ctx->packet_len - CRYPTO_LEN_SIZE);
1708    wsize = cipher_ctx->packet_len - CRYPTO_LEN_SIZE;
1709    /*
1710     * Decrypted, possibly decompressed output here.
1711     */
1712    wbuf = &cipher_ctx->buf[CRYPTO_LEN_SIZE];
1713    cipher_ctx->buf_len -= cipher_ctx->packet_len;
1714    Dmsg2(130, "Encryption writing full block, %u bytes, remaining %u bytes in buffer\n", wsize, cipher_ctx->buf_len);
1715
1716    if ((flags & FO_SPARSE) || (flags & FO_OFFSETS)) {
1717       if (!sparse_data(jcr, bfd, addr, &wbuf, &wsize)) {
1718          return false;
1719       }
1720    }
1721
1722    if (flags & FO_COMPRESS) {
1723       if (!decompress_data(jcr, stream, &wbuf, &wsize)) {
1724          return false;
1725       }
1726    }
1727
1728    Dmsg0(130, "Call store_data\n");
1729    if (!store_data(jcr, bfd, wbuf, wsize, (flags & FO_WIN32DECOMP) != 0)) {
1730       return false;
1731    }
1732    jcr->JobBytes += wsize;
1733    Dmsg2(130, "Flush write %u bytes, JobBytes=%s\n", wsize, edit_uint64(jcr->JobBytes, ec1));
1734
1735    /*
1736     * Move any remaining data to start of buffer
1737     */
1738    if (cipher_ctx->buf_len > 0) {
1739       Dmsg1(130, "Moving %u buffered bytes to start of buffer\n", cipher_ctx->buf_len);
1740       memmove(cipher_ctx->buf, &cipher_ctx->buf[cipher_ctx->packet_len], 
1741          cipher_ctx->buf_len);
1742    }
1743    /*
1744     * The packet was successfully written, reset the length so that the next
1745     * packet length may be re-read by unser_crypto_packet_len()
1746     */
1747    cipher_ctx->packet_len = 0;
1748
1749    if (cipher_ctx->buf_len >0 && !second_pass) {
1750       second_pass = true;
1751       goto again;
1752    }
1753
1754    /*
1755     * Stop decryption
1756     */
1757    cipher_ctx->buf_len = 0;
1758    cipher_ctx->packet_len = 0;
1759
1760    return true;
1761 }
1762
1763 static void deallocate_cipher(r_ctx &rctx)
1764 {
1765    /*
1766     * Flush and deallocate previous stream's cipher context
1767     */
1768    if (rctx.cipher_ctx.cipher) {
1769       flush_cipher(rctx.jcr, &rctx.bfd, &rctx.fileAddr, rctx.flags, rctx.comp_stream, &rctx.cipher_ctx);
1770       crypto_cipher_free(rctx.cipher_ctx.cipher);
1771       rctx.cipher_ctx.cipher = NULL;
1772    }
1773 }
1774
1775 static void deallocate_fork_cipher(r_ctx &rctx)
1776 {
1777
1778    /*
1779     * Flush and deallocate previous stream's fork cipher context
1780     */
1781    if (rctx.fork_cipher_ctx.cipher) {
1782       flush_cipher(rctx.jcr, &rctx.forkbfd, &rctx.fork_addr, rctx.fork_flags, rctx.comp_stream, &rctx.fork_cipher_ctx);
1783       crypto_cipher_free(rctx.fork_cipher_ctx.cipher);
1784       rctx.fork_cipher_ctx.cipher = NULL;
1785    }
1786 }
1787
1788 static void free_signature(r_ctx &rctx)
1789 {
1790    if (rctx.sig) {
1791       crypto_sign_free(rctx.sig);
1792       rctx.sig = NULL;
1793    }
1794 }
1795
1796 static void free_session(r_ctx &rctx)
1797 {
1798    if (rctx.cs) {
1799       crypto_session_free(rctx.cs);
1800       rctx.cs = NULL;
1801    }
1802 }
1803
1804
1805 /*
1806  * This code if implemented goes above
1807  */
1808 #ifdef stbernard_implemented
1809 /  #if defined(HAVE_WIN32)
1810    bool        bResumeOfmOnExit = FALSE;
1811    if (isOpenFileManagerRunning()) {
1812        if ( pauseOpenFileManager() ) {
1813           Jmsg(jcr, M_INFO, 0, _("Open File Manager paused\n") );
1814           bResumeOfmOnExit = TRUE;
1815        }
1816        else {
1817           Jmsg(jcr, M_ERROR, 0, _("FAILED to pause Open File Manager\n") );
1818        }
1819    }
1820    {
1821        char username[UNLEN+1];
1822        DWORD usize = sizeof(username);
1823        int privs = enable_backup_privileges(NULL, 1);
1824        if (GetUserName(username, &usize)) {
1825           Jmsg2(jcr, M_INFO, 0, _("Running as '%s'. Privmask=%#08x\n"), username,
1826        } else {
1827           Jmsg(jcr, M_WARNING, 0, _("Failed to retrieve current UserName\n"));
1828        }
1829    }
1830 #endif