Commit 2f8c607d authored by Yann Garcia's avatar Yann Garcia
Browse files

Add support of BFK as defined in P1609.2.1/D7, January 2022 Clause 9.3.4.1.1 General

parent 110f8bb0
Loading
Loading
Loading
Loading
+91 −84
Original line number Diff line number Diff line
@@ -94,4 +94,11 @@ module LibItsSecurity_Pics {
   */
  modulepar boolean PICS_SEC_ITS_AID_OTHER := true;

  /**
   * @desc Different set of parameters is used to generate the butterfly signing key associated with a certificate and the cocoon encryption key used to encrypt the certificate on issuance
   */
  modulepar boolean PICS_SECPKI_ORIGINAL_BFK_KEY        := true;
  modulepar boolean PICS_SECPKI_UNIFIED_BFK_KEY         := false;
  modulepar boolean PICS_SECPKI_COMPACT_UNIFIED_BFK_KEY := false;

} // End of module LibItsSecurity_Pics
+5 −0
Original line number Diff line number Diff line
@@ -95,4 +95,9 @@ module LibItsSecurity_Pixits {
   */
  modulepar SignAlgorithm PX_EC_ALG_FOR_EC_SIGN := e_nist_p256;

  /**
   * @desc Set to true to use test vectors instead of random vectors
   */
  modulepar boolean PX_BFK_TEST_VECTORS := false;
  
} // End of module LibItsSecurity_Pixits
+407 −302
Original line number Diff line number Diff line
@@ -3517,6 +3517,111 @@ module LibItsSecurity_Functions {

        } // End of group encryption

        group butterfly_expension_key {

            /**
             * @desc    Produce a BKF expension key for signing as defined in P1609.2.1/D7 Clause 9.3.3.1 Butterfly expansion functions
             * @param The generated expansion key
             * @return true on success, false otherwise
             * @see  // P1609.2.1/D7 Clause 9.3.3.1.2 Expansion function parameters
             */
            function f_generate_bkf_signing_expension_keys(
                                                           out octetstring p_expansion_key
                                                           ) return boolean {

                var integer v_i := f_random(1, 4294967296 - 1); // P1609.2.1/D7 Clause 9.3.3.1.2 Expansion function parameters
                var integer v_j := f_random(1, 20);
                if (PX_BFK_TEST_VECTORS) { // Test vectors
                    v_i := oct2int('217D79E1'O); // P1609.2.1/D7 Clause 9.3.3.1.2 Expansion function parameters
                    v_j := oct2int('00000011'O);
                }
                log("f_generate_bkf_signing_expension_keys: v_i=", v_i);
                log("f_generate_bkf_signing_expension_keys: v_j=", v_j);
                return fx_generate_bkf_signing_expension_keys(v_i, v_j, PX_BFK_TEST_VECTORS, p_expansion_key);
            } // End of function f_generate_bkf_signing_expension_keys

            /**
             * @desc    Produce a BKF expension key for encryption as defined in P1609.2.1/D7 Clause 9.3.3.1 Butterfly expansion functions
             * @param The generated expansion key
             * @return true on success, false otherwise
             * @see  // P1609.2.1/D7 Clause 9.3.3.1.2 Expansion function parameters
             */
            function f_generate_bkf_enc_expension_keys(
                                                       out octetstring p_expansion_key
                                                       ) return boolean {
                var integer v_i := f_random(1, 4294967296 - 1); // P1609.2.1/D7 Clause 9.3.3.1.2 Expansion function parameters
                var integer v_j := f_random(1, 20);
                if (PX_BFK_TEST_VECTORS) { // Test vectors
                    v_i := oct2int('217D79E1'O); // P1609.2.1/D7 Clause 9.3.3.1.2 Expansion function parameters
                    v_j := oct2int('00000011'O);
                }
                log("f_generate_bkf_enc_expension_keys: v_i=", v_i);
                log("f_generate_bkf_enc_expension_keys: v_j=", v_j);
                return fx_generate_bkf_enc_expension_keys(v_i, v_j, PX_BFK_TEST_VECTORS, p_expansion_key);
            } // End of function f_generate_bkf_enc_expension_keys

            function f_bfk_expend_private_key(
                                              in octetstring p_expansion_key,
                                              in octetstring p_private_key,
                                              out octetstring p_expended_private_key
                                              ) return boolean {
                log(">>> f_bfk_expend_private_key: p_compressed_public_key=", p_expansion_key);
                log(">>> f_bfk_expend_private_key: p_private_key=", p_private_key);
                return fx_bfk_expend_private_key(p_expansion_key, p_private_key, p_expended_private_key);
            }

            function f_bfk_expend_public_key(
                                             in octetstring p_expansion_key,
                                             in octetstring p_compressed_public_key,
                                             in integer p_compressed_mode,
                                             out octetstring p_expended_compressed_public_key,
                                             out integer p_expended_compressed_mode
                                             ) return boolean {
                log(">>> f_bfk_expend_public_key: p_expansion_key=", p_expansion_key);
                log(">>> f_bfk_expend_public_key: p_compressed_public_key=", p_compressed_public_key);
                log(">>> f_bfk_expend_public_key: p_compressed_mode=", p_compressed_mode);
                return fx_bfk_expend_public_key(p_expansion_key, p_compressed_public_key, p_compressed_mode, p_expended_compressed_public_key, p_expended_compressed_mode);
            }

            function f_bfk_verify_expended_keys(
                                                in octetstring p_expended_private_key, 
                                                in octetstring p_expended_compressed_public_key, 
                                                in integer p_expended_compressed_mode
                                                ) return boolean {
                log(">>> f_bfk_verify_expended_keys: p_expended_private_key=", p_expended_private_key);
                log(">>> f_bfk_verify_expended_keys: p_expended_compressed_public_key=", p_expended_compressed_public_key);
                log(">>> f_bfk_verify_expended_keys: p_expended_compressed_mode=", p_expended_compressed_mode);
                return f_bfk_verify_expended_keys(p_expended_private_key, p_expended_compressed_public_key, p_expended_compressed_mode);
            }

            /**
             * @desc    Produce a BKF expension key for signing as defined in P1609.2.1/D7 Clause 9.3.3.1 Butterfly expansion functions
             * @param p_i integers in the range 0 < iINT
             * @param p_j integers in the range jINT < 2^32– 1.
             * @param The generated expansion key
             * @return true on success, false otherwise
             * @see  // P1609.2.1/D7 Clause 9.3.3.1.2 Expansion function parameters
             */
            external function fx_generate_bkf_signing_expension_keys(in integer p_i, in integer p_j, in boolean p_debug := false, out octetstring p_expansion_key) return boolean;

            /**
             * @desc    Produce a BKF expension key for encryption as defined in P1609.2.1/D7 Clause 9.3.3.1 Butterfly expansion functions
             * @param p_i integers in the range 0 < iINT
             * @param p_j integers in the range jINT < 2^32– 1.
             * @param The generated expansion key
             * @return true on success, false otherwise
             * @see  // P1609.2.1/D7 Clause 9.3.3.1.2 Expansion function parameters
             */
            external function fx_generate_bkf_enc_expension_keys(in integer p_i, in integer p_j, in boolean p_debug := false, out octetstring p_expansion_key) return boolean;

            external function fx_bfk_expend_private_key(in octetstring p_expansion_key, in octetstring p_private_key, out octetstring p_expended_private_key) return boolean;

            external function fx_bfk_expend_public_key(in octetstring p_expansion_key, in octetstring p_compressed_public_key, in integer p_compressed_mode, out octetstring p_expended_compressed_public_key, out integer p_expended_compressed_mode) return boolean;

            external function fx_bfk_verify_expended_keys(in octetstring p_expended_private_key, in octetstring p_expended_compressed_public_key, in integer p_expended_compressed_mode) return boolean;

        } // End of group butterfly_expension_key

        group certificatesLoader {

            /**