106
edits
(Deleted a HUGE block of duplicated text, and do some wordsmithing) |
|||
Line 20: | Line 20: | ||
In 2001 NSS was modified to enable applications to supply their own database engines. Applications could share a common database if they supplied their | In 2001 NSS was modified to enable applications to supply their own database engines. Applications could share a common database if they supplied their | ||
own | own shareable database implementation, and configured NSS to use it. | ||
Today, there exists a process level, ACID, open source, and widely available database engine with which multiple processes may simultaneous have read and write access to a shared database. It is named SQLite. The NSS team proposes to use this database to give all NSS-based applications Shared Database access. | Today, there exists a process level, ACID, open source, and widely available database engine with which multiple processes may simultaneous have read and write access to a shared database. It is named SQLite. The NSS team proposes to use this database to give all NSS-based applications Shared Database access. | ||
Line 57: | Line 57: | ||
In the presence of a multiaccess initialization string, during initialization | In the presence of a multiaccess initialization string, during initialization | ||
NSS will try to find a shared | NSS will try to find a shared library named librdb.so (rdb.dll on Windows) in its path and load it. This shared library is expected to implement a superset of the old dbm interface. The main entry point is rdbopen, which will be passed the appName, database name, and open flags. The rdb shared library will pick a location or method to store the database (it may not necessarily be a file), then handle the raw db records from NSS. The records passed to and from this library use exactly the same schema and record formats as the records in the DBM library. | ||
=== The proposal === | === The proposal === | ||
Line 312: | Line 312: | ||
MACS are PBMAC1 data structures defined in pkcs5 2.0. Since pkcs5 v1 | MACS are PBMAC1 data structures defined in pkcs5 2.0. Since pkcs5 v1 | ||
does not have integrity checks and pkcs12 has | does not have integrity checks and pkcs12 has no definition for storing | ||
purely | purely MAC data,the shared database integrity checks use pkcs5 v2 to store that | ||
PBE and MAC data. | |||
===== Database coherency issues ===== | ===== Database coherency issues ===== | ||
In our previous database, we had issues with database corruption resulting in hard to diagnose issues. In order to mitigate that, | In our previous database, we had issues with database corruption resulting in hard to diagnose issues. In order to mitigate that, this section analyzes how various forms of corruption can affect the new database design, and possible ways of repairing that corruption in the field. | ||
'''Hidden Meta-data records''' | '''Hidden Meta-data records''' | ||
Line 341: | Line 341: | ||
If the Private key is deleted, but the corresponding public key is not, then NSS may be confused and think that the private key exists for the certificate. Also, if the public key is deleted, but the private key is not, NSS may be confused and think the private key does not exist for the certificate. Both of these cases will act correctly if the token is logged in. This kind of corruption can be repaired by reimporting the pkcs12 file, or by a PKCS #11 level tool to delete or restore the public key. | If the Private key is deleted, but the corresponding public key is not, then NSS may be confused and think that the private key exists for the certificate. Also, if the public key is deleted, but the private key is not, NSS may be confused and think the private key does not exist for the certificate. Both of these cases will act correctly if the token is logged in. This kind of corruption can be repaired by reimporting the pkcs12 file, or by a PKCS #11 level tool to delete or restore the public key. | ||
CKO_NSS_SMIME object holds the email address, subject of the S/MIME certificate, and the s/mime profile. In the legacy database, multiple email addresses could hold the same profile data and certificate subject, but only one s/mime profile data and subject would be allowed for each email address. In the new database, multiple independent email records can exist for the same email address. While S/MIME will function without CKO_NSS_SMIME objects, Certificates that verify multiple email address can not be found by the email addresses (other then the 'primary' address) without CKO_NSS_SMIME objects. If S/MIME records are corrupted, the | CKO_NSS_SMIME object holds the email address, subject of the S/MIME certificate, and the s/mime profile. In the legacy database, multiple email addresses could hold the same profile data and certificate subject, but only one s/mime profile data and subject would be allowed for each email address. In the new database, multiple independent email records can exist for the same email address. While S/MIME will function without CKO_NSS_SMIME objects, Certificates that verify multiple email address can not be found by the email addresses (other then the 'primary' address) without CKO_NSS_SMIME objects. If S/MIME records are corrupted, the Certificates will not be findable for other email addresses. Unlike the legacy database, these records are destroyed by S/MIME records for other certificates with the same email address. Now if you have multiple certificates with the same email address, all those certificates can be found. This corruption can be repaired with a PKCS #11 level tool. | ||
==== Accessing the | ==== Accessing the shareable Database ==== | ||
In order to maintain binary compatibility, the following keywords will be understood and used by softoken. | In order to maintain binary compatibility, the following keywords will be understood and used by softoken. | ||
'''multiaccess:'''''appName''[''':'''''directory''] works as it does today, including using the cert8/key3 record version.<br/> | '''multiaccess:'''''appName''[''':'''''directory''] works as it does today, including using the cert8/key3 record version.<br/> | ||
'''dbm:'''''directory'' opens an existing non- | '''dbm:'''''directory'' opens an existing non-shareable libdbm version 8 database.<br/> | ||
'''sql:'''''directory1''[''':'''''directory2''] opens a | '''sql:'''''directory1''[''':'''''directory2''] opens a shareable database, | ||
cert9.db (& key4.db) in ''directory1'' if cert9.db does exist. If the database does not exist, then ''directory2'' is searched for a libdbm cert8.db and key3.db. If ''directory2'' is not supplied, ''directory1'' is searched. <br/> | cert9.db (& key4.db) in ''directory1'' if cert9.db does exist. If the database does not exist, then ''directory2'' is searched for a libdbm cert8.db and key3.db. If ''directory2'' is not supplied, ''directory1'' is searched. <br/> | ||
'''extern:'''''directory'' open a sql-like database by loading an external module, a. la. rdb and ''multiaccess:''. This option would not be implemented in the initial release, but the ''extern:'' keyword would be reserved for future use. | '''extern:'''''directory'' open a sql-like database by loading an external module, a. la. rdb and ''multiaccess:''. This option would not be implemented in the initial release, but the ''extern:'' keyword would be reserved for future use. | ||
Line 367: | Line 367: | ||
One of the goals of making a shareable database version of NSS is to create a 'system crypto library' in which applications will automatically share database and configuration settings. In order for this to work, applications need to be able to open NSS databases from standard locations. | One of the goals of making a shareable database version of NSS is to create a 'system crypto library' in which applications will automatically share database and configuration settings. In order for this to work, applications need to be able to open NSS databases from standard locations. | ||
This design assumes that new NSS init functions will be defined for applications wanting to do 'standard user initialization', rather than building special knowledge into softoken or the database model. Note: This is different from the 2001 design, or and earlier prototype | This design assumes that new NSS init functions will be defined for applications wanting to do 'standard user initialization', rather than building special knowledge into softoken or the database model. Note: This is different from the 2001 design, or and earlier prototype shareable database, where the database code knew the location of the shareable database. | ||
==== Database Upgrade ==== | ==== Database Upgrade ==== | ||
Line 373: | Line 373: | ||
NSS has traditionally performed automatic updates when moving to new database formats. If NSS cannot find a database that matches it's current database type, it looks for older versions of it's database and automatically updates those to the new database version. In these cases database upgrade is automatic and mandatory for all applications. | NSS has traditionally performed automatic updates when moving to new database formats. If NSS cannot find a database that matches it's current database type, it looks for older versions of it's database and automatically updates those to the new database version. In these cases database upgrade is automatic and mandatory for all applications. | ||
In the | In the shareable database design, upgrade is no longer mandatory. Applications | ||
may choose to continue to use the old DBM database, update to use the new | may choose to continue to use the old DBM database, update to use the new shareable database from old DBM databases, or update and merge old DBM database into a new location shareable by multiple apps. There is still a desire for this update to be automatic, at least as far as the application user is concerned. The following describe how NSS deals with update in different applications, and what the different applications must do to get the correct update behavior. | ||
To understand the issues of migration to the Shareable Database version of NSS from the traditional (legacy) versions, we group applications that use the new version of NSS into three 'modes' of operation, and into two types for a total of five valid combinations (Mode 1 B is not valid).. | To understand the issues of migration to the Shareable Database version of NSS from the traditional (legacy) versions, we group applications that use the new version of NSS into three 'modes' of operation, and into two types for a total of five valid combinations (Mode 1 B is not valid).. | ||
Line 383: | Line 383: | ||
These applications will continue to use the legacy database support and the | These applications will continue to use the legacy database support and the | ||
old DBM database format. The applications cannot take advantage of new features | old DBM database format. The applications cannot take advantage of new features | ||
in the | in the shareable database. In this Mode, the nssdbm3 shared library must be | ||
present. No update from legacy DBM to sharable is needed in this mode. | present. No update from legacy DBM to sharable is needed in this mode. | ||
Line 439: | Line 439: | ||
====== Mode 2A ====== | ====== Mode 2A ====== | ||
Mode 2A Applications can also continue to call traditional NSS_Initialize() functions. The should, however, prepend the string "sql:" to the directory path passed to NSS in the configdir parameter. If the sql databases do not exist, NSS will automatically update any old DBM databases in the config directory to | Mode 2A Applications can also continue to call traditional NSS_Initialize() functions. The should, however, prepend the string "sql:" to the directory path passed to NSS in the configdir parameter. If the sql databases do not exist, NSS will automatically update any old DBM databases in the config directory to shareable databases. Like the upgrade from cert7 to cert8, if the update does not work, the app will open and use the old DBM database. Upgrade will not happen if | ||
# NSS is opened readOnly. | # NSS is opened readOnly. | ||
# NSS_Initialization fails. | # NSS_Initialization fails. | ||
Line 539: | Line 539: | ||
# continue to use the legacy DB and try to update later. (Probably a future restart of the application). | # continue to use the legacy DB and try to update later. (Probably a future restart of the application). | ||
# reset the legacy database, throwing away any private or secret keys in the old database. | # reset the legacy database, throwing away any private or secret keys in the old database. | ||
# shutdown NSS and initialize it only with the new | # shutdown NSS and initialize it only with the new shareable database. | ||
: The exact strategy for recovering is application dependent and depends on factors like | : The exact strategy for recovering is application dependent and depends on factors like | ||
:# the sensitivity of the application to loosing key data. | :# the sensitivity of the application to loosing key data. | ||
Line 545: | Line 545: | ||
:# the likelihood that the password will every be recovered. | :# the likelihood that the password will every be recovered. | ||
Exception B. Applications needs to decide what happens if the new | Exception B. Applications needs to decide what happens if the new shareable DB | ||
password is not supplied. Application can choose to: | password is not supplied. Application can choose to: | ||
# continue to use the legacy DB and try to update later. | # continue to use the legacy DB and try to update later. | ||
# force NSS to update those objects it can from the legacy DB,throwing away private keys and saved passwords, and trust information from the legacy DB. | # force NSS to update those objects it can from the legacy DB,throwing away private keys and saved passwords, and trust information from the legacy DB. | ||
# force NSS to reset the | # force NSS to reset the shareable database password, throwing away private keys and saved passwords, and trust information from the shareable DB. | ||
Notes: | Notes: | ||
Line 687: | Line 687: | ||
In Mode 2, the new database is uninitialized, so NSS only needs the | In Mode 2, the new database is uninitialized, so NSS only needs the | ||
password for the legacy database so it can read the secret keys | password for the legacy database so it can read the secret keys | ||
in that legacy database, and so the new | in that legacy database, and so the new shareable database password | ||
matches the old one. NSS can find the legacy database because | matches the old one. NSS can find the legacy database because | ||
it's in the same directory that the | it's in the same directory that the shareable database lives in. NSS opens both | ||
databases at initialization time and uses the legacy database until the user | databases at initialization time and uses the legacy database until the user | ||
authenticates (providing the legacy database password). NSS then uses that | authenticates (providing the legacy database password). NSS then uses that | ||
password to update the new | password to update the new shareable database with the records from the old. | ||
The new database takes on the password from the legacy database, and the | The new database takes on the password from the legacy database, and the | ||
legacy database is closed. Future NSS initializations only open the new | legacy database is closed. Future NSS initializations only open the new | ||
shareable database. If the user never supplies a password, NSS will continue to | |||
treat the new | treat the new shareable database as uninitialized and will attempt to update from | ||
the old database on future opens until the update succeeds. | the old database on future opens until the update succeeds. | ||
Line 704: | Line 704: | ||
| | | | ||
V | V | ||
open | open shareable DB | ||
| | | | ||
V | V | ||
< is open | < is open shareable > yes | ||
< initialized? | < DB initialized? >-------> done | ||
| no | | no | ||
V | V | ||
Line 732: | Line 732: | ||
+--------------+ | +--------------+ | ||
V | V | ||
update (and use) | update (and use) shareable DB | ||
| | | | ||
V | V | ||
Line 751: | Line 751: | ||
| | | | ||
V | V | ||
update (and use) | update (and use) shareable DB | ||
| | | | ||
V | V | ||
Line 765: | Line 765: | ||
application, the new database will be uninitialized. NSS can proceed the with | application, the new database will be uninitialized. NSS can proceed the with | ||
the same procedure as Mode 2. When the second and subsequent applications | the same procedure as Mode 2. When the second and subsequent applications | ||
start, the new | start, the new shareable database will already be initialized with it's own | ||
password. We potentially need both passwords, the first to read the keys | password. We potentially need both passwords, the first to read the keys | ||
out of the legacy database, and the second to write those keys, as well as | out of the legacy database, and the second to write those keys, as well as | ||
Line 775: | Line 775: | ||
updated, so the applications needs to tell us some unique identifier for its | updated, so the applications needs to tell us some unique identifier for its | ||
database. The application must be able to tell us where the old database lives, | database. The application must be able to tell us where the old database lives, | ||
since it's | since it's an application private directory compared the the multiple | ||
application shared directory that the shared DB lives in. | application shared directory that the shared DB lives in. | ||
Line 917: | Line 917: | ||
# The Mozilla app is starting as a fresh instance. | # The Mozilla app is starting as a fresh instance. | ||
# The Mozilla app has already been updated. | # The Mozilla app has already been updated. | ||
# The shared database does not have a master password set and | # The shared database does not have a master password set and the legacy database for Mozilla app does a master password set. | ||
These are the most common cases. | These are the most common cases. | ||
Line 926: | Line 926: | ||
UI question. At this point should we notify the user that we are updating | UI question. At this point should we notify the user that we are updating | ||
the database to a | the database to a shareable database? In order to complete this we will need | ||
to do user interaction below. | to do user interaction below. | ||
Line 968: | Line 968: | ||
Once we have a legacy db password, or if we determine we don't need the legacy | Once we have a legacy db password, or if we determine we don't need the legacy | ||
db password (either because there isn't one, or because we are willing to loose | db password (either because there isn't one, or because we are willing to loose | ||
the data that was protected by it). We need to acquire the | the data that was protected by it). We need to acquire the shareable db's | ||
password so we can encrypt and | password so we can encrypt and MAC the data properly. If the shareable db doesn't | ||
have a password we can proceed with the update without further prompting the | have a password we can proceed with the update without further prompting the | ||
user. If the | user. If the shareable db has the same password as the legacy db, then we can | ||
detect that and again proceed with the update without further prompting. | detect that and again proceed with the update without further prompting. | ||
If both of these fail, we prompt for the password for the | If both of these fail, we prompt for the password for the shareable database. This | ||
prompt is trickier, because we need to ask the user for the password that | prompt is trickier, because we need to ask the user for the password that | ||
he percieves to be the Master password for a different mozilla app. Note: at | he percieves to be the Master password for a different mozilla app. Note: at | ||
Line 988: | Line 988: | ||
If we fail to get this password, we need to handle the exception B case. | If we fail to get this password, we need to handle the exception B case. | ||
If the user has a master password set on his | If the user has a master password set on his shareable database, but does not | ||
know what that master password is, we now have the following choices: | know what that master password is, we now have the following choices: | ||
1) eshew any private keys, secret keys and trust updates from the | 1) eshew any private keys, secret keys and trust updates from the | ||
legacy database. | legacy database. | ||
2) reset the password on the | 2) reset the password on the shareable database (losing all private and secret | ||
keys, possibly | keys, possibly losing some trust). | ||
3) run with the legacy database and allow the user to update later. | 3) run with the legacy database and allow the user to update later. | ||
4) run with the new | 4) run with the new shareable database and allow the user to update later. | ||
It seems pretty unlikely that the user truly does not know the | It seems pretty unlikely that the user truly does not know the shareable database | ||
password, since he had to create or set it recently. However as the deployment | password, since he had to create or set it recently. However as the deployment | ||
time increases, this becomes more likely. | time increases, this becomes more likely. | ||
Line 1,015: | Line 1,015: | ||
production environment. | production environment. | ||
Shared databases, in general, | Shared databases, in general, mean that some of the current semantics of user | ||
profiles will break. Creating a new profile will not create a new | profiles will break. Creating a new profile will not create a new | ||
key/cert/master password profile. For developers (the primary users of profiles) | key/cert/master password profile. For developers (the primary users of profiles) | ||
Line 1,029: | Line 1,029: | ||
===== Database Merge ===== | ===== Database Merge ===== | ||
While not necessarily a feature of | While not necessarily a feature of shareable databases, it is an important tool for successful shareable database deployments. | ||
Database merge is different from database update, and in particular, database update with merge, in the following ways. | Database merge is different from database update, and in particular, database update with merge, in the following ways. | ||
Line 1,037: | Line 1,037: | ||
# Because merge does not require the complicated state machine to manage password acquisition, it can (and is) implemented outside the softoken itself. | # Because merge does not require the complicated state machine to manage password acquisition, it can (and is) implemented outside the softoken itself. | ||
Characteristic 3 allows database merge to work on arbitrary database types. You can merge a | Characteristic 3 allows database merge to work on arbitrary database types. You can merge a shareable db into a shareable db as well as an old database into a shareable db (in fact, to a point, on arbitrary tokens - you can merge a hardware token into a shareable db as long as the keys are extractable). | ||
To merge 2 databases, the application simply opens the both databases and calls the new PK11_MergeTokens() call. PK11_MergeTokens() has the following signature: | To merge 2 databases, the application simply opens the both databases and calls the new PK11_MergeTokens() call. PK11_MergeTokens() has the following signature: | ||
Line 1,163: | Line 1,163: | ||
where: | where: | ||
* private is a pointer to opaque private data specific to the | * private is a pointer to opaque private data specific to the Shareable DB implementation. | ||
* sdb_type is the type of database (key [aka private] or cert [aka public]). | * sdb_type is the type of database (key [aka private] or cert [aka public]). | ||
* sdb_flags specifies how the database was opened (ReadOnly, Create, etc). | * sdb_flags specifies how the database was opened (ReadOnly, Create, etc). | ||
Line 1,287: | Line 1,287: | ||
* legacy_SetCryptFunctions - This is used to set some callbacks that the legacy db can call to decrypt and encrypt password protected records (pkcs8 formatted keys, etc.). This allows the legacy database to translate it's database records to the new format without getting direct access to the keys. | * legacy_SetCryptFunctions - This is used to set some callbacks that the legacy db can call to decrypt and encrypt password protected records (pkcs8 formatted keys, etc.). This allows the legacy database to translate it's database records to the new format without getting direct access to the keys. | ||
NSS will | NSS will automatically load the legacy database support under the following conditions: | ||
# The application requests that the old databases be loaded (either implicitly or explicitly). | # The application requests that the old databases be loaded (either implicitly or explicitly). |
edits