Commit Graph

1700 Commits

Author SHA1 Message Date
Stefan Berger
208a852425 tests: Retry NVWrite command after 0x922 return code and inc lockout counter
When returncode 0x922 is received from NVWrite then retry the command so
that it gets the expected error code from failing to provide a password.
When checking the lockout counter, increase the numbers now.

Patched versions of libtpms may not return 0x922 anymore, so write the code
that it can test both cases.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2025-05-13 08:51:22 -04:00
Stefan Berger
f55e820e50 tests: Extend regex to allow for optional RSA-4096 keys
libtpms v0.11 will support RSA-4096 keys. Adjust the test case
regex for optional output of 'tpm2-rsa-keysize-4096'.

Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
2025-05-07 12:32:23 -04:00
Stefan Berger
9f426a01ff build-sys: Build swtpm-0.10.2
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2025-05-07 12:32:23 -04:00
Stefan Berger
53841482b0 debian/rpm: Adjust changelog for 0.10.1 release
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2025-04-30 08:32:33 -04:00
Stefan Berger
1f668fbf5e CHANGES: Add documentation for changes in 0.10.1
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2025-04-30 08:32:33 -04:00
Stefan Berger
ea81753eb0 debian: Do not user parallel testing to avoid timeouts
The build for RISC-V causes timeouts when running tests in parallel due
to the CPU being emulated. Avoid the timeouts by not running parallel
tests.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2025-04-29 21:32:56 -04:00
Stefan Berger
485787d760 ci: Update from ubuntu-20.04 to ubuntu-24.04 due to EOL
Github actions does not run ubuntu-20.04 anymore due to EOL. Update the
20.04 entries to use 24.04.

cpp-coveralls needs an older version of python3 due to pkgutil.ImpImporter
having disappeared in more recent python versions. Therefore, leave
test-coveralls at 22.04.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2025-04-16 17:03:00 -04:00
Stefan Berger
5670cf51c3 swtpm.spec: Apply previous changes also to swtpm.spec.in
Suggested-by: Ajeeth Adithya <ajeeth.adithya@nutanix.com>
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2025-04-11 18:20:43 -04:00
Ajeeth Adithya
b17b852e15 swtpm.spec: Change the order of uninstallation of the SELinux modules
Reverse the order of uninstallation of the ‘swtpm’ and ‘swtpm_svirt’
selinux modules. The current order fails because 'swtpm-svirt' module
has a dependency on the 'swtpm' module. This results in the ‘swtpm'
module not being cleaned up during %postun:

$ semodule -l | grep swtpm
swtpm
swtpm_svirt

$ semodule -n -X 200 -s targeted -r swtpm
libsemanage.semanage_direct_remove_key: Removing last swtpm module (no other swtpm module exists at another priority).
Failed to resolve typeattributeset statement at /var/lib/selinux/targeted/tmp/modules/200/swtpm_svirt/cil:4
/sbin/semodule:  Failed!

$ sudo semodule -n -X 200 -s targeted -r swtpm_svirt
libsemanage.semanage_direct_remove_key: Removing last swtpm_svirt module (no other swtpm_svirt module exists at another priority).

$ semodule -l | grep swtpm
swtpm

Signed-off-by: Ajeeth Adithya <ajeeth.adithya@nutanix.com>
2025-04-09 18:06:38 -04:00
Ajeeth Adithya
f96a110e4c swtpm.spec: Back up the default file contexts
Add the %selinux_relabel_pre macro in the %pre section to back up the
current file contexts lists. This is required since %selinux_relabel_post
macro in the %posttrans section uses the backup to revert to the original contexts.

Signed-off-by: Ajeeth Adithya <ajeeth.adithya@nutanix.com>
2025-04-09 18:06:38 -04:00
Stefan Berger
8eafe434cb swtpm: Use custom profile's Algorithms when removing FIPS-disabled ones
Use the custom profile's Algorithms when adjusting them for FIPS mode,
rather than the list of all implemented Algorithms. The list of implemented
Algorithms contains for example elliptic curve identifiers, such as
ecc-nist-p192, ecc-nist-p224, ecc-nist-p256, ecc-nist-p384, ecc-nist-p521,
ecc-bn-p256, ecc-bn-p638, that are not part of the custom profile but are
enabled with the ecc-min-size=192, ecc-nist, and ecc-bn shortcuts there.
Using the algorithms of the custom profile avoids confusion since otherwise
the additional ecc-nist-* and ecc-bn-* algorithm identifiers appear in the
modified custom profile even though the were not part of the original one.

Test:

  swtpm_setup --tpm2 --tpmstate . --overwrite \
     --profile-name custom --profile-remove-disabled fips-host

  before:
  ...,ecc,ecc-min-size=224,ecc-nist,ecc-bn,ecc-nist-p224,ecc-nist-p256,
      ecc-nist-p384,ecc-nist-p521,ecc-bn-p256,ecc-bn-p638,ecc-sm2-p256,...

  now:

  ...,ecc,ecc-min-size=224,ecc-nist,ecc-bn,ecc-sm2-p256,...

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2025-04-04 12:30:13 -04:00
Stefan Berger
79430fa0d3 swtpm_setup: Do not pass a TPM 2 profile to swtpm when reconfiguring
Ensure that no profile is passed to the TPM 2 when it is to be reconfigured
by:

- Showing an error if user tries to pass a profile when also --reconfigure
  is passed
- Not taking the default profile from the swtpm_setup.conf configuration
  file if the user did not pass a profile

Extend an existing test case with a default profile in its swtpm_setup.conf
so that the above 2nd item is tested.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2025-03-28 11:35:33 -04:00
Stefan Berger
8918162159 swtpm_setup: Use DISTRO_PROFILES_DIR when listing profiles (fix path issue)
When listing profiles, then the profiles in the distro directory did not
show up since the directory formed by 'DATAROOTDIR "swtpm/profiles"' was
missing a '/' at the end of DATAROOTDIR. Use DISTRO_PROFILES_DIR instead.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2025-03-26 08:52:19 -04:00
Stefan Berger
61d43a000b selinux: Add rule to allow swtpm_t opening of virt_log_t files (BZ 2278123)
Link: https://bugzilla.redhat.com/show_bug.cgi?id=2278123#c40
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2025-02-24 09:21:56 -05:00
Stefan Berger
5dd6648a96 ci: Run apt-get update
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2025-02-24 09:21:56 -05:00
Marc-André Lureau
6c21be2510 SELinux: add NFS permissions for swtpm_t
swtpm fails with a NFS mount. `setsebool virt_use_nfs on` should fix it.

Resolves: https://issues.redhat.com/browse/RHEL-73809

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
2025-01-20 11:22:56 -05:00
Marc-André Lureau
736713c38a SELinux: allow to map state file
Specify vtpm state to a file instead of dir:

<tpm model="tpm-crb">
  <backend type="emulator" version="2.0">
    <source type="file" path="/var/lib/libvirt/swtpm/mytest/mytpm2-00.permall"/>
  </backend>
</tpm>

$ virsh start avocado-vt-vm1
error: Failed to start domain 'avocado-vt-vm1'
error: internal error: Could not run '/usr/bin/swtpm_setup'. exitstatus: 1; Check error log '/var/log/swtpm/libvirt/qemu/avocado-vt-vm1-swtpm.log' for details.

$ cat /var/log/swtpm/libvirt/qemu/avocado-vt-vm1-swtpm.log
SWTPM_NVRAM_LinearFile_Mmap: Could not mmap file: Permission denied
/usr/bin/swtpm exit with status 256:

$ ausearch -m avc
----
time->Thu Dec 12 08:43:07 2024
type=PROCTITLE msg=audit(1734010987.020:1455): proctitle=2F7573722F62696E2F737774706D00736F636B6574002D2D7072696E742D737461746573002D2D74706D7374617465006261636B656E642D7572693D66696C653A2F2F2F7661722F6C69622F6C6962766972742F737774706D2F6D79746573742F6D7974706D322D30302E7065726D616C6C002D2D74706D32002D2D6C6F67
type=SYSCALL msg=audit(1734010987.020:1455): arch=c000003e syscall=9 success=no exit=-13 a0=0 a1=c0 a2=3 a3=1 items=0 ppid=22547 pid=22549 auid=4294967295 uid=59 gid=59 euid=59 suid=59 fsuid=59 egid=59 sgid=59 fsgid=59 tty=(none) ses=4294967295 comm="swtpm" exe="/usr/bin/swtpm" subj=system_u:system_r:swtpm_t:s0 key=(null)
type=AVC msg=audit(1734010987.020:1455): avc:  denied  { map } for
pid=22549 comm="swtpm"
path="/var/lib/libvirt/swtpm/mytest/mytpm2-00.permall" dev="dm-0"
ino=202744025 scontext=system_u:system_r:swtpm_t:s0
tcontext=system_u:object_r:virt_var_lib_t:s0 tclass=file permissive=0

Resolves: https://issues.redhat.com/browse/RHEL-70835

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
2025-01-20 11:22:56 -05:00
Stefan Berger
71f68180d0 swtpm: Fix build error on 32bit systems due to inconsistent _FILE_OFFSET_BITS
Fix the following build error due to missing include of config.h where
_FILE_OFFSET_BITS is defined and leads to different sizes of off_t depending
on whether it is defined and/or included:

tpmlib.h:76:7: error: type of 'tpmlib_handle_tcg_tpm2_cmd_header' does not match original declaration [-Werror=lto-type-mismatch]
   76 | off_t tpmlib_handle_tcg_tpm2_cmd_header(const unsigned char *command,
      |       ^
tpmlib.c:576:7: note: return value type mismatch
  576 | off_t tpmlib_handle_tcg_tpm2_cmd_header(const unsigned char *command,
      |       ^
tpmlib.c:576:7: note: 'tpmlib_handle_tcg_tpm2_cmd_header' was previously declared here
tpmlib.c:576:7: note: code may be misoptimized unless '-fno-strict-aliasing' is used
lto1: all warnings being treated as errors
lto-wrapper: fatal error: gcc returned 1 exit status

Link: https://bugzilla.redhat.com/show_bug.cgi?id=2334600
Fixes: 599e2436d4 ("configure.ac: enable 64-bit file API on 32-bit systems")
Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
2024-12-27 17:48:27 -05:00
Stefan Berger
1f255fecc8 SELinux: Add rule for swtpm to be able to read password from pipe
Link: https://bugzilla.redhat.com/show_bug.cgi?id=2334271
Resolves: https://github.com/stefanberger/swtpm/issues/964
Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
2024-12-26 18:28:35 -05:00
Stefan Berger
e3fa3b4913 ci: Consolidate linter into container run and remove simple test
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-12-16 10:32:35 -05:00
Stefan Berger
2badc72c67 ci: Add github actions to replace Travis
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-12-16 10:32:35 -05:00
Marc-André Lureau
3e4a61717a swtpm-setup: fix invalid path
Make sure there is a '/' after DATAROOTDIR.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
2024-12-16 07:54:17 -05:00
Stefan Berger
54f4bb1e70 Travis: Downgrade to setuptools 59.6.0 to avoid error in 71.x
There seems to be a well known error in setuptools 71.x that prevents
installation of cpp-coveralls on Travis now:

File "/usr/local/lib/python3.10/dist-packages/setuptools/_core_metadata.py", line 285, in _distribution_fullname

    canonicalize_version(version, strip_trailing_zero=False),

TypeError: canonicalize_version() got an unexpected keyword argument 'strip_trailing_zero'

Fall back to the default version that is used in Ubuntu Jammy (59.6.0)
since later versions also lead to the same error.

Link: https://github.com/pypa/setuptools/issues/4483
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-12-02 16:42:06 -05:00
Stefan Berger
db6be1314d build-sys: Build swtpm-0.10.1
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-12-02 16:42:06 -05:00
Stefan Berger
ad4427ab8c debian/rpm: Adjust changelog for 0.10.0 release
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-11-15 14:19:43 -05:00
Stefan Berger
34fe38b527 CHANGES: Add documentation for changes in 0.10.0
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-11-15 14:19:43 -05:00
Stefan Berger
3001ce11ee debian: Use --disable-hardening to avoid multiple usages of -D_FORTIFY_SOURCE=.
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-11-15 14:19:43 -05:00
Stefan Berger
5f5a227721 rpm: Build swtpm-tests package from installed tests
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-11-15 07:52:59 -05:00
Stefan Berger
d059f40c61 swtpm/swtpm_setup: Initialize variables with NULL for RPM build
When building an rpm with swtpm.spec on Fedora 40 this type of errors
appear on variables that normally do not need to be initialized.

In file included from /usr/include/glib-2.0/glib.h:117,
                 from profile.c:14:
In function ‘g_autoptr_cleanup_generic_gfree’,
    inlined from ‘profile_gather_local’ at profile.c:307:23,
    inlined from ‘profile_printall’ at profile.c:366:10:
/usr/include/glib-2.0/glib/glib-autocleanups.h:32:3: error: ‘dir’ may be used uninitialized [-Werror=maybe-uninitialized]
   32 |   g_free (*pp);
      |   ^~~~~~~~~~~~
profile.c: In function ‘profile_printall’:
profile.c:307:23: note: ‘dir’ was declared here
  307 |     g_autofree gchar *dir;
      |                       ^~~

Include string.h since in some older build environments strcmp and strlen
do not have prototypes otherwise.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-11-15 07:52:59 -05:00
Stefan Berger
89f7a0545d swtpm: Check for null pointer from parsing string value
Check for a null pointer from parsing the string value in
json_get_submap_value(). All callers assume that the returned value is
non-NULL and therefore ensure that there is always a valid string.
However, all callers also provide trusted input from TPMLIB_GetInfo that
should never cause a NULL pointer.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-11-13 16:47:17 -05:00
Stefan Berger
fcda38b463 swtpm_setup: Handle case when returned profile Name is null
The profile '{"Name": null}' will not lead to a parser error but return
NULL for the 'Name'. Therefore, check for variable name being a NULL
pointer. Since the user may provide this type of profile this could have
lead to crashes when name was accessed.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-11-13 16:47:17 -05:00
Stefan Berger
e02bf61a22 swtpm_cert: Move error message about importing signing key into else branch
Move the error message about the failure to import a signing key into the
else branch where it should be (all other branches of the if-then-else
statement have a check already). Also mention the key's filename and hint
at possibly corrupted key.

Link: https://bugzilla.redhat.com/show_bug.cgi?id=2325901
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-11-13 13:52:07 -05:00
Stefan Berger
4eb51c38d9 swtpm_setup: Add missing --print-profiles to help screen
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-11-12 20:53:07 -05:00
Stefan Berger
bf4fc05517 swtpm: Fix name of variable passed to TPM_DEBUG
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-11-08 12:41:36 -05:00
Stefan Berger
f6f858eada man: Add some clarification to the nameing of profiles in files
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-11-08 11:57:26 -05:00
Stefan Berger
2c8865a3ac man: Format JSON maps for better display
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-11-08 11:57:26 -05:00
Stefan Berger
28345d008b swtpm_setup: Comment flags for storage primary key and deprecate --create-spk
Comment the flags used for creating the storage primary key.
Deprecate the --create-spk option since it may create an RSA-3072 key
and it creates a NIST P384 instead of NIST P256, both of which users may
not expect and know how to use.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-11-07 08:33:04 -05:00
Stefan Berger
cc52b200b0 debian: Add rule to allow usage of /var/tmp directory (QEMU)
QEMU's functional tests need access to /var/tmp/**. To avoid the following
type of AppArmor permission failures add a rule that allows access to
/var/tmp/**.

 type=AVC msg=audit(1730829888.863:260): apparmor="DENIED" \
   operation="mknod" class="file" profile="swtpm" \
   name="/var/tmp/qemu_3r9txw7z/swtpm-socket" pid=3925 comm="swtpm" \
   requested_mask="c" denied_mask="c" fsuid=1000 ouid=1000FSUID="stefanb" \
   OUID="stefanb"

[ To run the QEMU's functional tests use the following command:
    make check-functional ]

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-11-06 15:22:58 -05:00
Stefan Berger
1982c51535 swtpm: Indent 'Tested' output of tested algorithm by one more space
Move the 'Tested: tdes' type of debugging output one more indentation
level up so that they can be filtered-out easier from control and data
channel communication.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-11-05 09:20:53 -05:00
Sergei Trofimovich
599e2436d4 configure.ac: enable 64-bit file API on 32-bit systems
My local filesystem is btrfs with a long life. It's inodes ecxeed 32-bit
space and that causes test failures in `swtpm` on `i686-linux`
containers:

    FAIL: test_parameters
    FAIL: test_swtpm_setup_file_backend
    FAIL: test_swtpm_setup_overwrite
    FAIL: test_tpm2_swtpm_setup_create_cert
    FAIL: test_tpm2_swtpm_setup_overwrite
    FAIL: test_swtpm_setup_create_cert
    FAIL: test_tpm2_parameters

The example test failure log looks this way:

    FAIL: test_migration_key
    ========================

    Need to be root to run test with CUSE interface.
    Need to be root to run test with CUSE interface.
    ==== Starting swtpm with interfaces socket+socket ====
    Test 1: Ok
    ==== Starting swtpm with interfaces socket+socket ====
    Test 2: Ok
    ==== Starting swtpm with interfaces socket+socket ====
    swtpm: Missing migration key to decrypt volatilestate
    Test 3: Ok
    ==== Starting swtpm with interfaces socket+socket ====
    Could not stat file '/build/tests/data/migkey1/volatilestate.bin': Value too large for defined data type
    Error: Could not load encrypted volatile state into TPM.
    FAIL test_migration_key (exit status: 1)

The `stat()` fails because inode value exceeds 32-bit value:

    $ stat /build/tests/data/migkey1/volatilestate.bin
      File: /build/tests/data/migkey1/volatilestate.bin
      Size: 1290            Blocks: 8          IO Block: 4096   regular file
    Device: 0,30    Inode: 9639547569  Links: 1
    ...

The change fixes all the test failures. To fix
`test_tpm2_swtpm_setup_create_cert` I also had to include `config.h`
into `swtpm_backend_dir.c` to get 64-bit file open there as well.

Signed-off-by: Sergei Trofimovich <slyich@gmail.com>
2024-11-04 14:14:09 -05:00
Stefan Berger
05f4d91989 test: Exit IBM TSS2 test early if it does not support swtpm
Check the help screen for necessary supported options since the IBM TSS2
test will have to be patched to support swtpm directly. If it does not
support it, exit the tests early with an error message.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-28 21:19:33 -04:00
Stefan Berger
395ada34d8 tests: Update IBMTSS2 test suite to v2.4.0
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-24 18:20:01 -04:00
Stefan Berger
ab267bfe4a swtpm: Only display profile capabilities when --tpm2 is given
Only display profile capabilities when --tpm2 is given since they are only
relevant when a TPM 2 is used.

Adjust test cases.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-23 19:44:57 -04:00
Stefan Berger
74a3d99b93 swtpm_setup: Give fields in tpm2_authblock better names
Give two oif the (unused) fields in the tpm2_authblock better names and
since these two and the continueSession fields are always initialized with
'0', simplify the initializer macro to only take one argument.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-18 15:07:36 -04:00
Stefan Berger
a72da2dfac tests: Extend regex's with optional match for Attributes in profiles
The default-v1 profile may soon also set Attributes in the JSON and
therefore extend the regular expressions matching profiles to optionally
match for Attributes.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-17 17:56:11 -04:00
Stefan Berger
1eb06b6f79 swtpm_setup: Always lock storage while creating initial state
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-15 10:49:01 -04:00
Stefan Berger
38aa3d972c swtpm: Display tpmstate-opt-lock as a new capability
Display the new capability tpmstate-opt-lock, adjust test cases,
and document it in the swptm man page.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-15 10:49:01 -04:00
Stefan Berger
1d17d09158 swtpm: Add support for lock option parameter to tpmstate option
To support storage backend locking on the file backend, add support for a
lock option parameter to the --tpmstate option. By default the value of
this option (if not given) has to be 'true' for the dir backend, since this
backend has always been locking, and 'false' on the file backend, since
this backend did not lock so far.

If the user chooses no storage backend locking then SWTPM_NVRAM_Unlock &
SWTPM_NVRAM_Lock_Storage do not call the backend for locking at all
anymore.

Document the new option parameter in the swtpm man page.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-15 10:49:01 -04:00
Stefan Berger
aa483aeb6d swtpm: nvstore_linear: Add support for file-backend locking
Add support for locking the storage file using fcntl(fd, F_SETLK, ...).
Since fcntl needs a file descriptor of the actual storage file, call
SWTPM_NVRAM_LinearFile_DoOpenURI() to open the file in case it has not
been opened, yet. In case of error close the file again but be careful
about the fact that it may not have been mmap'ed, yet.

Since now all backends have .lock and .unlock nvram_backend_ops, they can
be called without checking for a NULL pointer.

Extend an existing test case with a file-backend storage lock test.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-15 10:49:01 -04:00
Stefan Berger
4be72bc65a swtpm: Remove broken logic to check for neither dir nor file backend
Remove the broken logic to check for neither dir:// nor file:// backend.
If an unknow backend type is used, then it will be detected later on
and an error message will be printed out. Even though the logic was
broken it didn't seem to cause failures.

Also have tpmstate_set_mode return void since it cannot fail.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-15 10:49:01 -04:00