1#!./perl -w
2
3# ID: %I%, %G%   
4
5use strict ;
6
7use lib 't' ;
8use BerkeleyDB; 
9use util ;
10
11BEGIN
12{
13    if ($BerkeleyDB::db_version < 4.1) {
14        print "1..0 # Skip: this needs Berkeley DB 4.1.x or better\n" ;
15        exit 0 ;
16    }
17
18    # Is encryption available?
19    my $env = new BerkeleyDB::Env @StdErrFile,
20             -Encrypt => {Password => "abc",
21	                  Flags    => DB_ENCRYPT_AES
22	                 };
23
24    if ($BerkeleyDB::Error =~ /Operation not supported/)
25    {
26        print "1..0 # Skip: encryption support not present\n" ;
27        exit 0 ;
28    }
29}     
30
31umask(0);
32
33print "1..80\n";        
34
35{    
36    eval
37    {
38        my $env = new BerkeleyDB::Env @StdErrFile,
39             -Encrypt => 1,
40             -Flags => DB_CREATE ;
41     };
42     ok 1, $@ =~ /^Encrypt parameter must be a hash reference at/;
43
44    eval
45    {
46        my $env = new BerkeleyDB::Env @StdErrFile,
47             -Encrypt => {},
48             -Flags => DB_CREATE ;
49     };
50     ok 2, $@ =~ /^Must specify Password and Flags with Encrypt parameter at/;
51
52    eval
53    {
54        my $env = new BerkeleyDB::Env @StdErrFile,
55             -Encrypt => {Password => "fred"},
56             -Flags => DB_CREATE ;
57     };
58     ok 3, $@ =~ /^Must specify Password and Flags with Encrypt parameter at/;
59
60    eval
61    {
62        my $env = new BerkeleyDB::Env @StdErrFile,
63             -Encrypt => {Flags => 1},
64             -Flags => DB_CREATE ;
65     };
66     ok 4, $@ =~ /^Must specify Password and Flags with Encrypt parameter at/;
67
68    eval
69    {
70        my $env = new BerkeleyDB::Env @StdErrFile,
71             -Encrypt => {Fred => 1},
72             -Flags => DB_CREATE ;
73     };
74     ok 5, $@ =~ /^\Qunknown key value(s) Fred at/;
75
76}
77
78{
79    # new BerkeleyDB::Env -Encrypt =>
80
81    # create an environment with a Home
82    my $home = "./fred" ;
83    #mkdir $home;
84    ok 6, my $lexD = new LexDir($home) ;
85    ok 7, my $env = new BerkeleyDB::Env @StdErrFile,
86             -Home => $home,
87             -Encrypt => {Password => "abc",
88	                  Flags    => DB_ENCRYPT_AES
89	                 },
90             -Flags => DB_CREATE | DB_INIT_MPOOL ;
91
92
93
94    my $Dfile = "abc.enc";
95    my $lex = new LexFile $Dfile ;
96    my %hash ;
97    my ($k, $v) ;
98    ok 8, my $db = new BerkeleyDB::Hash -Filename => $Dfile, 
99	                             -Env         => $env,
100				     -Flags       => DB_CREATE, 
101				     -Property    => DB_ENCRYPT ;
102
103    # create some data
104    my %data =  (
105		"red"	=> 2,
106		"green"	=> "house",
107		"blue"	=> "sea",
108		) ;
109
110    my $ret = 0 ;
111    while (($k, $v) = each %data) {
112        $ret += $db->db_put($k, $v) ;
113    }
114    ok 9, $ret == 0 ;
115
116    # check there are three records
117    ok 10, countRecords($db) == 3 ;
118
119    undef $db;
120
121    # once the database is created, do not need to specify DB_ENCRYPT
122    ok 11, my $db1 = new BerkeleyDB::Hash -Filename => $Dfile, 
123	                              -Env      => $env,
124				      -Flags    => DB_CREATE ;
125    $v = '';				      
126    ok 12, ! $db1->db_get("red", $v) ;
127    ok 13, $v eq $data{"red"},
128    undef $db1;
129    undef $env;
130
131    # open a database without specifying encryption
132    ok 14,  ! new BerkeleyDB::Hash -Filename => "$home/$Dfile"; 
133
134    ok 15,  ! new BerkeleyDB::Env 
135             -Home => $home,
136             -Encrypt => {Password => "def",
137	                  Flags    => DB_ENCRYPT_AES
138	                 },
139             -Flags => DB_CREATE | DB_INIT_MPOOL ;
140}
141
142{    
143    eval
144    {
145        my $env = new BerkeleyDB::Hash 
146             -Encrypt => 1,
147             -Flags => DB_CREATE ;
148     };
149     ok 16, $@ =~ /^Encrypt parameter must be a hash reference at/;
150
151    eval
152    {
153        my $env = new BerkeleyDB::Hash 
154             -Encrypt => {},
155             -Flags => DB_CREATE ;
156     };
157     ok 17, $@ =~ /^Must specify Password and Flags with Encrypt parameter at/;
158
159    eval
160    {
161        my $env = new BerkeleyDB::Hash 
162             -Encrypt => {Password => "fred"},
163             -Flags => DB_CREATE ;
164     };
165     ok 18, $@ =~ /^Must specify Password and Flags with Encrypt parameter at/;
166
167    eval
168    {
169        my $env = new BerkeleyDB::Hash 
170             -Encrypt => {Flags => 1},
171             -Flags => DB_CREATE ;
172     };
173     ok 19, $@ =~ /^Must specify Password and Flags with Encrypt parameter at/;
174
175    eval
176    {
177        my $env = new BerkeleyDB::Hash 
178             -Encrypt => {Fred => 1},
179             -Flags => DB_CREATE ;
180     };
181     ok 20, $@ =~ /^\Qunknown key value(s) Fred at/;
182
183}
184
185{    
186    eval
187    {
188        my $env = new BerkeleyDB::Btree 
189             -Encrypt => 1,
190             -Flags => DB_CREATE ;
191     };
192     ok 21, $@ =~ /^Encrypt parameter must be a hash reference at/;
193
194    eval
195    {
196        my $env = new BerkeleyDB::Btree 
197             -Encrypt => {},
198             -Flags => DB_CREATE ;
199     };
200     ok 22, $@ =~ /^Must specify Password and Flags with Encrypt parameter at/;
201
202    eval
203    {
204        my $env = new BerkeleyDB::Btree 
205             -Encrypt => {Password => "fred"},
206             -Flags => DB_CREATE ;
207     };
208     ok 23, $@ =~ /^Must specify Password and Flags with Encrypt parameter at/;
209
210    eval
211    {
212        my $env = new BerkeleyDB::Btree 
213             -Encrypt => {Flags => 1},
214             -Flags => DB_CREATE ;
215     };
216     ok 24, $@ =~ /^Must specify Password and Flags with Encrypt parameter at/;
217
218    eval
219    {
220        my $env = new BerkeleyDB::Btree 
221             -Encrypt => {Fred => 1},
222             -Flags => DB_CREATE ;
223     };
224     ok 25, $@ =~ /^\Qunknown key value(s) Fred at/;
225
226}
227
228{    
229    eval
230    {
231        my $env = new BerkeleyDB::Queue 
232             -Encrypt => 1,
233             -Flags => DB_CREATE ;
234     };
235     ok 26, $@ =~ /^Encrypt parameter must be a hash reference at/;
236
237    eval
238    {
239        my $env = new BerkeleyDB::Queue 
240             -Encrypt => {},
241             -Flags => DB_CREATE ;
242     };
243     ok 27, $@ =~ /^Must specify Password and Flags with Encrypt parameter at/;
244
245    eval
246    {
247        my $env = new BerkeleyDB::Queue 
248             -Encrypt => {Password => "fred"},
249             -Flags => DB_CREATE ;
250     };
251     ok 28, $@ =~ /^Must specify Password and Flags with Encrypt parameter at/;
252
253    eval
254    {
255        my $env = new BerkeleyDB::Queue 
256             -Encrypt => {Flags => 1},
257             -Flags => DB_CREATE ;
258     };
259     ok 29, $@ =~ /^Must specify Password and Flags with Encrypt parameter at/;
260
261    eval
262    {
263        my $env = new BerkeleyDB::Queue 
264             -Encrypt => {Fred => 1},
265             -Flags => DB_CREATE ;
266     };
267     ok 30, $@ =~ /^\Qunknown key value(s) Fred at/;
268
269}
270
271{    
272    eval
273    {
274        my $env = new BerkeleyDB::Recno 
275             -Encrypt => 1,
276             -Flags => DB_CREATE ;
277     };
278     ok 31, $@ =~ /^Encrypt parameter must be a hash reference at/;
279
280    eval
281    {
282        my $env = new BerkeleyDB::Recno 
283             -Encrypt => {},
284             -Flags => DB_CREATE ;
285     };
286     ok 32, $@ =~ /^Must specify Password and Flags with Encrypt parameter at/;
287
288    eval
289    {
290        my $env = new BerkeleyDB::Recno 
291             -Encrypt => {Password => "fred"},
292             -Flags => DB_CREATE ;
293     };
294     ok 33, $@ =~ /^Must specify Password and Flags with Encrypt parameter at/;
295
296    eval
297    {
298        my $env = new BerkeleyDB::Recno 
299             -Encrypt => {Flags => 1},
300             -Flags => DB_CREATE ;
301     };
302     ok 34, $@ =~ /^Must specify Password and Flags with Encrypt parameter at/;
303
304    eval
305    {
306        my $env = new BerkeleyDB::Recno 
307             -Encrypt => {Fred => 1},
308             -Flags => DB_CREATE ;
309     };
310     ok 35, $@ =~ /^\Qunknown key value(s) Fred at/;
311
312}
313
314
315{
316    # new BerkeleyDB::Hash -Encrypt =>
317
318    my $Dfile = "abcd.enc";
319    my $lex = new LexFile $Dfile ;
320    my %hash ;
321    my ($k, $v) ;
322    ok 36, my $db = new BerkeleyDB::Hash 
323                           -Filename => $Dfile, 
324		           -Flags    => DB_CREATE, 
325                           -Encrypt  => {Password => "beta",
326	                                 Flags    => DB_ENCRYPT_AES
327	                                },
328		           -Property => DB_ENCRYPT ;
329
330    # create some data
331    my %data =  (
332		"red"	=> 2,
333		"green"	=> "house",
334		"blue"	=> "sea",
335		) ;
336
337    my $ret = 0 ;
338    while (($k, $v) = each %data) {
339        $ret += $db->db_put($k, $v) ;
340    }
341    ok 37, $ret == 0 ;
342
343    # check there are three records
344    ok 38, countRecords($db) == 3 ;
345
346    undef $db;
347
348    # attempt to open a database without specifying encryption
349    ok 39, ! new BerkeleyDB::Hash -Filename => $Dfile, 
350				      -Flags    => DB_CREATE ;
351
352
353    # try opening with the wrong password				      
354    ok 40, ! new BerkeleyDB::Hash -Filename => $Dfile, 
355                           -Filename => $Dfile, 
356                           -Encrypt => {Password => "def",
357	                                Flags    => DB_ENCRYPT_AES
358	                               },
359		           -Property    => DB_ENCRYPT ;
360
361
362    # read the encrypted data				      
363    ok 41, my $db1 = new BerkeleyDB::Hash -Filename => $Dfile, 
364                           -Filename => $Dfile, 
365                           -Encrypt => {Password => "beta",
366	                                Flags    => DB_ENCRYPT_AES
367	                               },
368		           -Property    => DB_ENCRYPT ;
369
370
371    $v = '';				      
372    ok 42, ! $db1->db_get("red", $v) ;
373    ok 43, $v eq $data{"red"};
374    # check there are three records
375    ok 44, countRecords($db1) == 3 ;
376    undef $db1;
377}
378
379{
380    # new BerkeleyDB::Btree -Encrypt =>
381
382    my $Dfile = "abcd.enc";
383    my $lex = new LexFile $Dfile ;
384    my %hash ;
385    my ($k, $v) ;
386    ok 45, my $db = new BerkeleyDB::Btree 
387                           -Filename => $Dfile, 
388		           -Flags    => DB_CREATE, 
389                           -Encrypt  => {Password => "beta",
390	                                 Flags    => DB_ENCRYPT_AES
391	                                },
392		           -Property => DB_ENCRYPT ;
393
394    # create some data
395    my %data =  (
396		"red"	=> 2,
397		"green"	=> "house",
398		"blue"	=> "sea",
399		) ;
400
401    my $ret = 0 ;
402    while (($k, $v) = each %data) {
403        $ret += $db->db_put($k, $v) ;
404    }
405    ok 46, $ret == 0 ;
406
407    # check there are three records
408    ok 47, countRecords($db) == 3 ;
409
410    undef $db;
411
412    # attempt to open a database without specifying encryption
413    ok 48, ! new BerkeleyDB::Btree -Filename => $Dfile, 
414				      -Flags    => DB_CREATE ;
415
416
417    # try opening with the wrong password				      
418    ok 49, ! new BerkeleyDB::Btree -Filename => $Dfile, 
419                           -Filename => $Dfile, 
420                           -Encrypt => {Password => "def",
421	                                Flags    => DB_ENCRYPT_AES
422	                               },
423		           -Property    => DB_ENCRYPT ;
424
425
426    # read the encrypted data				      
427    ok 50, my $db1 = new BerkeleyDB::Btree -Filename => $Dfile, 
428                           -Filename => $Dfile, 
429                           -Encrypt => {Password => "beta",
430	                                Flags    => DB_ENCRYPT_AES
431	                               },
432		           -Property    => DB_ENCRYPT ;
433
434
435    $v = '';				      
436    ok 51, ! $db1->db_get("red", $v) ;
437    ok 52, $v eq $data{"red"};
438    # check there are three records
439    ok 53, countRecords($db1) == 3 ;
440    undef $db1;
441}
442
443{
444    # new BerkeleyDB::Queue -Encrypt =>
445
446    my $Dfile = "abcd.enc";
447    my $lex = new LexFile $Dfile ;
448    my %hash ;
449    my ($k, $v) ;
450    ok 54, my $db = new BerkeleyDB::Queue 
451                           -Filename => $Dfile, 
452                           -Len      => 5,
453                           -Pad      => "x",
454		           -Flags    => DB_CREATE, 
455                           -Encrypt  => {Password => "beta",
456	                                 Flags    => DB_ENCRYPT_AES
457	                                },
458		           -Property => DB_ENCRYPT ;
459
460    # create some data
461    my %data =  (
462		1	=> 2,
463		2	=> "house",
464		3	=> "sea",
465		) ;
466
467    my $ret = 0 ;
468    while (($k, $v) = each %data) {
469        $ret += $db->db_put($k, $v) ;
470    }
471    ok 55, $ret == 0 ;
472
473    # check there are three records
474    ok 56, countRecords($db) == 3 ;
475
476    undef $db;
477
478    # attempt to open a database without specifying encryption
479    ok 57, ! new BerkeleyDB::Queue -Filename => $Dfile, 
480                                   -Len      => 5,
481                                   -Pad      => "x",
482				   -Flags    => DB_CREATE ;
483
484
485    # try opening with the wrong password				      
486    ok 58, ! new BerkeleyDB::Queue -Filename => $Dfile, 
487                                   -Len      => 5,
488                                   -Pad      => "x",
489                                   -Encrypt => {Password => "def",
490	                                        Flags    => DB_ENCRYPT_AES
491	                                       },
492		                   -Property    => DB_ENCRYPT ;
493
494
495    # read the encrypted data				      
496    ok 59, my $db1 = new BerkeleyDB::Queue -Filename => $Dfile, 
497                                           -Len      => 5,
498                                           -Pad      => "x",
499                                           -Encrypt => {Password => "beta",
500	                                        Flags    => DB_ENCRYPT_AES
501	                                       },
502		                           -Property    => DB_ENCRYPT ;
503
504
505    $v = '';				      
506    ok 60, ! $db1->db_get(3, $v) ;
507    ok 61, $v eq fillout($data{3}, 5, 'x');
508    # check there are three records
509    ok 62, countRecords($db1) == 3 ;
510    undef $db1;
511}
512
513{
514    # new BerkeleyDB::Recno -Encrypt =>
515
516    my $Dfile = "abcd.enc";
517    my $lex = new LexFile $Dfile ;
518    my %hash ;
519    my ($k, $v) ;
520    ok 63, my $db = new BerkeleyDB::Recno 
521                           -Filename => $Dfile, 
522		           -Flags    => DB_CREATE, 
523                           -Encrypt  => {Password => "beta",
524	                                 Flags    => DB_ENCRYPT_AES
525	                                },
526		           -Property => DB_ENCRYPT ;
527
528    # create some data
529    my %data =  (
530		1	=> 2,
531		2	=> "house",
532		3	=> "sea",
533		) ;
534
535    my $ret = 0 ;
536    while (($k, $v) = each %data) {
537        $ret += $db->db_put($k, $v) ;
538    }
539    ok 64, $ret == 0 ;
540
541    # check there are three records
542    ok 65, countRecords($db) == 3 ;
543
544    undef $db;
545
546    # attempt to open a database without specifying encryption
547    ok 66, ! new BerkeleyDB::Recno -Filename => $Dfile, 
548				      -Flags    => DB_CREATE ;
549
550
551    # try opening with the wrong password				      
552    ok 67, ! new BerkeleyDB::Recno -Filename => $Dfile, 
553                           -Filename => $Dfile, 
554                           -Encrypt => {Password => "def",
555	                                Flags    => DB_ENCRYPT_AES
556	                               },
557		           -Property    => DB_ENCRYPT ;
558
559
560    # read the encrypted data				      
561    ok 68, my $db1 = new BerkeleyDB::Recno -Filename => $Dfile, 
562                           -Filename => $Dfile, 
563                           -Encrypt => {Password => "beta",
564	                                Flags    => DB_ENCRYPT_AES
565	                               },
566		           -Property    => DB_ENCRYPT ;
567
568
569    $v = '';				      
570    ok 69, ! $db1->db_get(3, $v) ;
571    ok 70, $v eq $data{3};
572    # check there are three records
573    ok 71, countRecords($db1) == 3 ;
574    undef $db1;
575}
576
577{
578    # new BerkeleyDB::Unknown -Encrypt =>
579
580    my $Dfile = "abcd.enc";
581    my $lex = new LexFile $Dfile ;
582    my %hash ;
583    my ($k, $v) ;
584    ok 72, my $db = new BerkeleyDB::Hash 
585                           -Filename => $Dfile, 
586		           -Flags    => DB_CREATE, 
587                           -Encrypt  => {Password => "beta",
588	                                 Flags    => DB_ENCRYPT_AES
589	                                },
590		           -Property => DB_ENCRYPT ;
591
592    # create some data
593    my %data =  (
594		"red"	=> 2,
595		"green"	=> "house",
596		"blue"	=> "sea",
597		) ;
598
599    my $ret = 0 ;
600    while (($k, $v) = each %data) {
601        $ret += $db->db_put($k, $v) ;
602    }
603    ok 73, $ret == 0 ;
604
605    # check there are three records
606    ok 74, countRecords($db) == 3 ;
607
608    undef $db;
609
610    # attempt to open a database without specifying encryption
611    ok 75, ! new BerkeleyDB::Unknown -Filename => $Dfile, 
612				      -Flags    => DB_CREATE ;
613
614
615    # try opening with the wrong password				      
616    ok 76, ! new BerkeleyDB::Unknown -Filename => $Dfile, 
617                           -Filename => $Dfile, 
618                           -Encrypt => {Password => "def",
619	                                Flags    => DB_ENCRYPT_AES
620	                               },
621		           -Property    => DB_ENCRYPT ;
622
623
624    # read the encrypted data				      
625    ok 77, my $db1 = new BerkeleyDB::Unknown -Filename => $Dfile, 
626                           -Filename => $Dfile, 
627                           -Encrypt => {Password => "beta",
628	                                Flags    => DB_ENCRYPT_AES
629	                               },
630		           -Property    => DB_ENCRYPT ;
631
632
633    $v = '';				      
634    ok 78, ! $db1->db_get("red", $v) ;
635    ok 79, $v eq $data{"red"};
636    # check there are three records
637    ok 80, countRecords($db1) == 3 ;
638    undef $db1;
639}
640
641