Project

General

Profile

Feature #2451

Updated by Alex Afanasyev almost 10 years ago

Refactoring code from the SecPubInfo interface, and more precisely the sec-pub-info-sqlite3 concrete implementation into a series of abstractions. 

 The general design is as follows: 

   - 
      SecIdentityManager - a mechanism class that is used to interact with the TPM, Pib, and Identities 
   - 
      SecIdentityInfo      - a value-semantic class used to manage information relating to a particular identity,  
                           including accessing any keys associated with the Identity 
   - 
      SecKeyInfo              - a value-semantic type used to manage information relating to a particular key including 
                           the type of key and associated certificates 
   - 
      DbUtil               - a utility class to encapsulate common functionality used to access sqlite database 

 More complete public interfaces are included below. 

 A current topic relevant to the design that needs to be settled are the circumstances in which we should throw an exception. 
 
     
 
 class SecIdentityManager { 
     
 // A mechanism class to manage access to identities, TPM, and Pib. 
     
 public: 
       
   class Error : public SecPublicInfo::Error 
       
   { 
       
   public: 
    
       

   explicit 
       
   SecIdentityManager(const std::string& dir = ""); 
       
   // ACCESSORS 
       
   /** 
        
    * @brief Get TPM Locator 
        
    * 
        
    * @throws SecPublicInfo::Error if the TPM info does not exist 
       
   */ 
       
   std::string 
       
   getTpmLocator() const; 
    
       

   /** 
        
    * @brief Get PIB Locator 
       
   */ 
       
   std::string 
       
   getPibLocator() const; 
     
       
 
   /** 
        
    * @brief Check if the specified identity already exists 
        
    * 
        
    * @param identityName The identity name 
        
    * @return true if the identity exists, otherwise false 
       
   */ 
       
   bool 
       
   doesIdentityExist(const Name& identityName) const; 
    
       

   /** 
        
    * @brief Get name of the default identity 
        
    * 
        
    * @throws SecPublicInfo::Error if there is no default. 
       
   */ 
       
   SecIdentityInfo& 
       
   getDefaultIdentity() const; 
    
       

   /** 
        
    * @brief Get all the identities from public info, return a vector 
        
    * with the results. 
       
   */ 
       
   std::vector<SecIdentityInfo>&& 
       
   getAllIdentities() const; 
    
         

     /** 
        
    * @brief return the scheme of the PibLocator 
        
    */ 
       
   std::string 
       
   getScheme() const; 
    
       

   // MANIPULATORS 
       
   /** 
        
    * @brief Set the corresponding TPM information to @p tpmLocator 
        
    * 
        
    * If the provided @p tpmLocator is different from the existing one, the PIB will be reset, 
        
    * otherwise nothing will be changed. 
        
    * 
        
    * For legacy issue, the TPM info may not exist (some old PIB content may not have this info), 
        
    * this method will simply set the TPM info as provided without changing anything else. Thus an 
        
    * ideal process of handling old PIB is to check if TPM info exists. If it does not exist, 
        
    * then set it to the default value according to configuration. 
       
   */ 
       
   void 
       
   setTpmLocator(const std::string& tpmLocator); 
    
       

   /** 
        
    * @brief Add a new identity 
        
    * 
        
    * if identity already exist, do not add it again 
        
    * 
        
    * @param identityName The identity name to be added 
       
   */ 
       
   void 
       
   addIdentity(const Name& identityName); 
    
       

   /** 
        
    * @brief Set the default identity 
        
    * 
        
    * @param identityName The default identity name 
        
    */ 
       
   void 
       
   setDefaultIdentity(const Name& identity); 
    
         

     /** 
        
    * @brief Delete an identity and related public keys and certificates 
        
    * 
        
    * @param identity The identity name 
       
   */ 
       
   void 
       
   deleteIdentityInfo(const Name& identityName); 
     
 }; 
    
     

 class SecIdentityInfo { 
     
     
 
 public:  
          
     //CREATORS 
         
     /**  
            
       * @brief Create an a new 'SecIdentityInfo' for the identity with the 
    		 
		 specified 'identityName'. 
    	   
	   * 
    	   
	   * @param identityName The identity name 
    	 
	 */ 
    	 
	 SecIdentityInfo(Name& identityName); 
    
    	 

	 //ACCESSORS  
    	  
	 bool 
    	 
	 doesPublicKeyExist(const Name& keyName) const; 
    
        

    /** 
         
     * @brief Generate a key name for this identity 
         
     * 
         
     * @param useKsk If true, generate a KSK name, otherwise a DSK name 
         
     * @return The a "SecKeyInfo" for the new key 
         
     */ 
         
     SecKeyInfo& 
         
     getNewKeyInfo(bool useKsk) const; 
    
        

    /** 
         
     * @brief Get all the keys associated with this identity 
         
     * @return A vector of all keys 
         
     */ 
    	 
	 std::vector<SecKeyInfo>&&  
    	  
	 getAllKeys() const; 
    
        

    /** 
         
     * @brief Get name of the default key name for this identity 
         
     * 
         
     * @throws SecPublicInfo::Error if there is no default 
         
     * 
         
     * @return The keyInfo for the requested key 
         
     */ 
         
     SecKeyInfo& 
         
     getDefaultKey() const; 
    
         

     /** 
    	 
	 * @brief Get the KeyInfo for the key with the specified 'keyName'. 
    	 
	 * 
    	 
	 * @param keyName The name of the desired key  
    	  
	 * 
    	 
	 * @return The keyInfo for the requested key 
         
     */ 
         
     SecKeyInfo& 
         
     getKey(const Name& keyName) const; 
    
        

    //MANIPULATORS 
        
        
    
    /** 
         
     * @brief Delete a public key and related certificates related to the key 
         
     * of the specifed 'name' associated with this identity. 
         
     * 
         
     * @param keyName The key name 
         
     */  
    
          

     void 
         
     deletePublicKeyInfo(const Name& keyName); 
    
        

    /** 
         
     * @brief Add a public key to the identity storage. 
         
     * 
         
     * @param keyName The name of the public key to be added 
         
     * @param publicKey Reference to the PublicKey object 
         
     */ 
         
     void 
         
     addKey(const Name& keyName, const PublicKey& publicKey); 
    
    
        


    /** 
         
     * @brief Set the default key name for the corresponding identity 
         
     * 
         
     * @param keyName The key name 
         
     * @throws SecPublicInfo::Error if the key does not exist 
         
     */ 
         
     void 
         
     setDefaultKeyName(const Name& keyName) const; 
     
 }; 
    
     

 class SecKeyInfo { 
     
 public: 
       
   SecKeyInfo(const Name& keyName); 
      
        
  
    // ACCESSORS 
        
    /** 
         
     * @brief Check if the specified certificate already exists 
         
     * 
         
     * @param certificateName The name of the certificate 
         
     */ 
        
    bool 
        
    doesCertificateExist(const Name& certificateName) const; 
    
        

    /** 
        
    * @brief Get a shared pointer to identity certificate object  
        	      
    	     from the identity storage corresponding to this Key. 
        
    * 
        
    * @param certificateName The name of the requested certificate 
        
    * @throws SecPublicInfo::Error if the certificate does not exist 
        
    */ 
        
    shared_ptr<IdentityCertificate> 
        
    getCertificate(const Name& certificateName) const; 
    
        

    /** 
         
     * @brief Get all the certificate name in public info 
         
     * 
         
     * @return A vector will all certificates for this key. 
         
     */ 
        
    std::vector<IdentityCertificate>&& 
        
    getAllCertificates();     
    
           

   /** 
        
    * @brief Get the type of the queried public key 
        
    * 
        
    * @note KeyType is also available from PublicKey instance. 
        
    *         This method is more efficient if only KeyType is needed. 
        
    * 
        
    * @param keyName The name of the requested public key 
        
    * @return the type of the key. If the queried key does not exist, KEY_TYPE_NULL will be returned 
        
    */ 
       
   virtual KeyType 
       
   getPublicKeyType(const Name& keyName) 
    
       

   // MANIPULATOR 
       
   /** 
        
    * @brief Add a certificate to the identity storage. 
        
    * 
        
    * It will add the corresponding public key and identity if they do not exist 
        
    * 
        
    * @param certificate The certificate to be added 
        
    */ 
       
   void 
       
   addCertificate(const IdentityCertificate& certificate) 
    
       

   /** 
        
    * @brief Delete a certificate 
        
    * 
        
    * @param certificateName The certificate name 
        
    */ 
       
   void 
       
   deleteCertificateInfo(const Name& certificateName) 
    
       

   /** 
        
    * @brief Add a certificate into the public key identity storage and set the certificate as the 
        
    *          default one of the default identity 
        
    * 
        
    * @param certificate The certificate to be added 
        
    * @throws SecPublicInfo::Error if the certificate cannot be added (though it is really rare) 
        
    */ 
       
   void 
       
   addCertificateAsSystemDefault(const IdentityCertificate& certificate); 
    
     

 }; 

Back