1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
# See the file LICENSE for redistribution information.
#
# Copyright (c) 1999-2001
# Sleepycat Software. All rights reserved.
#
# $Id: sec002.tcl,v 1.1.1.1 2003/11/20 22:13:59 toshok Exp $
#
# TEST sec002
# TEST Test of security interface and catching errors in the
# TEST face of attackers overwriting parts of existing files.
proc sec002 { } {
global errorInfo
global errorCode
source ./include.tcl
set testfile1 $testdir/sec002-1.db
set testfile2 $testdir/sec002-2.db
set testfile3 $testdir/sec002-3.db
set testfile4 $testdir/sec002-4.db
puts "Sec002: Test of basic encryption interface."
env_cleanup $testdir
set passwd1 "passwd1"
set passwd2 "passwd2"
set key "key"
set data "data"
set pagesize 1024
#
# Set up 4 databases, two encrypted, but with different passwords
# and one unencrypt, but with checksumming turned on and one
# unencrypted and no checksumming. Place the exact same data
# in each one.
#
puts "\tSec002.a: Setup databases"
set db_cmd "-create -pagesize $pagesize -btree "
set db [eval {berkdb_open} -encryptaes $passwd1 $db_cmd $testfile1]
error_check_good db [is_valid_db $db] TRUE
error_check_good dbput [$db put $key $data] 0
error_check_good dbclose [$db close] 0
set db [eval {berkdb_open} -encryptaes $passwd2 $db_cmd $testfile2]
error_check_good db [is_valid_db $db] TRUE
error_check_good dbput [$db put $key $data] 0
error_check_good dbclose [$db close] 0
set db [eval {berkdb_open} -chksum $db_cmd $testfile3]
error_check_good db [is_valid_db $db] TRUE
error_check_good dbput [$db put $key $data] 0
error_check_good dbclose [$db close] 0
set db [eval {berkdb_open} $db_cmd $testfile4]
error_check_good db [is_valid_db $db] TRUE
error_check_good dbput [$db put $key $data] 0
error_check_good dbclose [$db close] 0
#
# First just touch some bits in the file. We know that in btree
# meta pages, bytes 92-459 are unused. Scribble on them in both
# an encrypted, and both unencrypted files. We should get
# a checksum error for the encrypted, and checksummed files.
# We should get no error for the normal file.
#
set fidlist {}
set fid [open $testfile1 r+]
lappend fidlist $fid
set fid [open $testfile3 r+]
lappend fidlist $fid
set fid [open $testfile4 r+]
lappend fidlist $fid
puts "\tSec002.b: Overwrite unused space in meta-page"
foreach f $fidlist {
fconfigure $f -translation binary
seek $f 100 start
set byte [read $f 1]
binary scan $byte c val
set newval [expr ~$val]
set newbyte [binary format c $newval]
seek $f 100 start
puts -nonewline $f $newbyte
close $f
}
puts "\tSec002.c: Reopen modified databases"
set stat [catch {berkdb_open_noerr -encryptaes $passwd1 $testfile1} ret]
error_check_good db:$testfile1 $stat 1
error_check_good db:$testfile1:fail \
[is_substr $ret "metadata page checksum error"] 1
set stat [catch {berkdb_open_noerr -chksum $testfile3} ret]
error_check_good db:$testfile3 $stat 1
error_check_good db:$testfile3:fail \
[is_substr $ret "metadata page checksum error"] 1
set stat [catch {berkdb_open_noerr $testfile4} db]
error_check_good db:$testfile4 $stat 0
error_check_good dbclose [$db close] 0
puts "\tSec002.d: Replace root page in encrypted w/ encrypted"
set fid1 [open $testfile1 r+]
set fid2 [open $testfile2 r+]
seek $fid1 $pagesize start
seek $fid2 $pagesize start
set root1 [read $fid1 $pagesize]
close $fid1
puts -nonewline $fid2 $root1
close $fid2
set db [berkdb_open_noerr -encryptaes $passwd2 $testfile2]
error_check_good db [is_valid_db $db] TRUE
set stat [catch {$db get $key} ret]
error_check_good dbget $stat 1
error_check_good db:$testfile2:fail \
[is_substr $ret "checksum error: catastrophic recovery required"] 1
set stat [catch {$db close} ret]
error_check_good dbclose $stat 1
error_check_good db:$testfile2:fail [is_substr $ret "DB_RUNRECOVERY"] 1
puts "\tSec002.e: Replace root page in encrypted w/ unencrypted"
set fid2 [open $testfile2 r+]
set fid4 [open $testfile4 r+]
seek $fid2 $pagesize start
seek $fid4 $pagesize start
set root4 [read $fid4 $pagesize]
close $fid4
puts -nonewline $fid2 $root4
close $fid2
set db [berkdb_open_noerr -encryptaes $passwd2 $testfile2]
error_check_good db [is_valid_db $db] TRUE
set stat [catch {$db get $key} ret]
error_check_good dbget $stat 1
error_check_good db:$testfile2:fail \
[is_substr $ret "checksum error: catastrophic recovery required"] 1
set stat [catch {$db close} ret]
error_check_good dbclose $stat 1
error_check_good db:$testfile2:fail [is_substr $ret "DB_RUNRECOVERY"] 1
cleanup $testdir NULL 1
puts "\tSec002 complete."
}
|