<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p><font face="Noto Serif">Hi,</font></p>
    <p><font face="Noto Serif">I made more tests (see below) regards
        your comments and try to put 448 keys on Gnuk too<br>
      </font></p>
    <p><font face="Noto Serif">Best regards<br>
      </font></p>
    <div class="moz-cite-prefix">Le 20/02/2025 à 07:20, NIIBE Yutaka a
      écrit :<br>
    </div>
    <blockquote type="cite" cite="mid:87seo9kuh2.fsf@haruna.fsij.org">
      <pre wrap="" class="moz-quote-pre">Hello,

Thank you for your testing.

Frédéric SUEL <a class="moz-txt-link-rfc2396E"
      href="mailto:frederic.suel@free.fr" moz-do-not-send="true"><frederic.suel@free.fr></a> wrote:
</pre>
      <blockquote type="cite">
        <pre wrap="" class="moz-quote-pre">I tried to configure the board first with secp256k1 then with Curve 448 
and :

-- i can select both algorithms, and the result with the list command is ok

- but, i can't generate keys with secp256k1, i get "Échec de génération 
de la clef : Conditions d'utilisation non satisfaites" : fail to 
generate key : used conditions not satisfied
</pre>
      </blockquote>
      <pre wrap="" class="moz-quote-pre">This error may mean, you didn't configure KDF-DO, which is required for
Gnuk 2.2.  I wonder if it's the case.</pre>
    </blockquote>
    --------<br>
    <p>KDF-DO is on and i get the same error</p>
    <p>---------------------------------------------------------------</p>
    <p>LinuxMint gnupg 2.4.4  </p>
    <p>gpg --card-edit<br>
      can't connect to 'socket:///home/yokosano/.gnupg/log-socket':
      Aucun fichier ou dossier de ce nom<br>
      <br>
      Reader ...........: 1209:2440:FSIJ-2.2-43112959:0<br>
      Application ID ...: D276000124010200FFFE431129590000<br>
      Application type .: OpenPGP<br>
      Version ..........: 2.0<br>
      Manufacturer .....: unmanaged S/N range<br>
      Serial number ....: 43112959<br>
      Name of cardholder: [non positionné]<br>
      Language prefs ...: [non positionné]<br>
      Salutation .......: <br>
      URL of public key : [non positionné]<br>
      Login data .......: [non positionné]<br>
      Signature PIN ....: forcé<br>
      Key attributes ...: secp256k1 secp256k1 secp256k1<br>
      Max. PIN lengths .: 127 127 127<br>
      PIN retry counter : 3 3 3<br>
      Signature counter : 0<br>
      KDF setting ......: on<br>
      UIF setting ......: Sign=off Decrypt=off Auth=off<br>
      Signature key ....: 24B4 8DE1 A850 0937 AB11  600E 8A17 68BE 0C7A
      9021<br>
            created ....: 2025-02-18 11:17:54<br>
      Encryption key....: [none]<br>
      Authentication key: [none]<br>
      General key info..: [none]<br>
      <br>
      gpg/carte> admin<br>
      Les commandes d'administration sont permises</p>
    <p>gpg/carte> generate</p>
    <p>Faut-il faire une sauvegarde hors carte de la clef de
      chiffrement ? (O/n) n</p>
    <p>Faut-il remplacer les clefs existantes ? (o/N) o</p>
    <p>Veuillez noter que les configurations d'usine des codes
      personnels sont</p>
    <p>  code personnel = « 123456 »     code personnel d'admin. =
      « 12345678 ».</p>
    <p>Vous devriez les modifier avec la commande --change-pin</p>
    <p>Veuillez indiquer le temps pendant lequel cette clef devrait être
      valable.</p>
    <p>        0 = la clef n'expire pas</p>
    <p>      <n>  = la clef expire dans n jours</p>
    <p>      <n>w = la clef expire dans n semaines</p>
    <p>      <n>m = la clef expire dans n mois</p>
    <p>      <n>y = la clef expire dans n ans</p>
    <p>Pendant combien de temps la clef est-elle valable ? (0) 10y</p>
    <p>La clef expire le dim. 18 févr. 2035 09:57:37 CET</p>
    <p>Est-ce correct ? (o/N) o</p>
    <p>GnuPG doit construire une identité pour identifier la clef.</p>
    <p>Nom réel : test1</p>
    <p>Adresse électronique : <br>
    </p>
    <p>Commentaire : <br>
    </p>
    <p>Vous avez sélectionné cette identité :</p>
    <p>    « test1 »</p>
    <p>Changer le (N)om, le (C)ommentaire, l'(A)dresse électronique</p>
    <p>ou (O)ui/(Q)uitter ? O</p>
    <p>Échec de génération de la clef : Conditions d'utilisation non
      satisfaites : used conditions not satisfied<br>
    </p>
    <p>---------------------------------------------------------------<br>
    </p>
    <blockquote type="cite" cite="mid:87seo9kuh2.fsf@haruna.fsij.org">
      <blockquote type="cite">
        <pre wrap="" class="moz-quote-pre">- but, i can't generate keys with Curve 448, i get "Échec de génération 
de la clef : Erreur de carte" : fail to generate key : board error
</pre>
      </blockquote>
      <pre wrap="" class="moz-quote-pre">Ah, Curve448 is not covered by the tests/ in Gnuk.

It seems there is bugs around its private key size.  Here is a fix (of today).
Not tested yet.

diff --git a/src/openpgp-do.c b/src/openpgp-do.c
index 2ad7853..2fc5aea 100644
--- a/src/openpgp-do.c
+++ b/src/openpgp-do.c
@@ -1340,7 +1340,7 @@ gpg_do_write_prvkey (enum kind_of_key kk, const uint8_t *key_data,
   else if (attr == ALGO_X448)
     {
       pubkey_len = prvkey_len;
-      if (prvkey_len != 56)
+      if (prvkey_len != 64)
        return -1;
     }
   else
@@ -1583,14 +1583,15 @@ proc_key_import (const uint8_t *data, int len)
     }
   else if (attr == ALGO_X448)
     {
-      uint8_t priv[56];
+      uint8_t priv[64];
 
       if (len - 12 != 56)
        return 0;               /* Error.  */
 
       memcpy (priv, data+12, 56);
+      memset (priv+56, 0, 64-56);
       ecdh_compute_public_x448 (pubkey, priv);
-      r = gpg_do_write_prvkey (kk, priv, 56, keystring_admin, pubkey);
+      r = gpg_do_write_prvkey (kk, priv, 64, keystring_admin, pubkey);
     }
 
   if (r < 0)
@@ -2287,7 +2288,7 @@ gpg_do_keygen (uint8_t *buf)
   enum kind_of_key kk = kkb_to_kk (kk_byte);
   int attr = gpg_get_algo_attr (kk);;
   int prvkey_len = gpg_get_algo_attr_key_size (kk, GPG_KEY_PRIVATE);
-  const uint8_t *prv;
+  uint8_t *prv;
   const uint8_t *rnd;
   int r = 0;
 #define p_q (&buf[3])
@@ -2359,6 +2360,8 @@ gpg_do_keygen (uint8_t *buf)
       random_bytes_free (rnd);
       prv = d;
       ed448_compute_public (pubkey, prv);
+      memset (prv+114, 0, 128-114);
+      prvkey_len = 128;
       pubkey[57] = 0;
     }
   else if (attr == ALGO_X448)
@@ -2369,6 +2372,8 @@ gpg_do_keygen (uint8_t *buf)
       rnd = random_bytes_get ();
       memcpy (d+32, rnd, 24);
       prv = d;
+      prvkey_len = 64;
+      memset (prv+56, 0, 64-56);
       ecdh_compute_public_x448 (pubkey, prv);
     }
   else</pre>
    </blockquote>
    <p>---------------------------------------------------------------</p>
    <p>I tried your patch and i get a error too : board error</p>
    <p>--------</p>
    <p>gpg --expert --card-edit<br>
      can't connect to 'socket:///home/yokosano/.gnupg/log-socket':
      Aucun fichier ou dossier de ce nom<br>
      <br>
      Reader ...........: 1209:2440:FSIJ-2.2-43112959:0<br>
      Application ID ...: D276000124010200FFFE431129590000<br>
      Application type .: OpenPGP<br>
      Version ..........: 2.0<br>
      Manufacturer .....: unmanaged S/N range<br>
      Serial number ....: 43112959<br>
      Name of cardholder: [non positionné]<br>
      Language prefs ...: [non positionné]<br>
      Salutation .......: <br>
      URL of public key : [non positionné]<br>
      Login data .......: [non positionné]<br>
      Signature PIN ....: forcé<br>
      Key attributes ...: ed25519 cv25519 ed25519<br>
      Max. PIN lengths .: 127 127 127<br>
      PIN retry counter : 3 3 3<br>
      Signature counter : 0<br>
      KDF setting ......: off<br>
      UIF setting ......: Sign=off Decrypt=off Auth=off<br>
      Signature key ....: [none]<br>
      Encryption key....: [none]<br>
      Authentication key: [none]<br>
      General key info..: [none]<br>
      <br>
      gpg/carte> admin<br>
      Les commandes d'administration sont permises<br>
      <br>
      gpg/carte> key-attr<br>
      Changing card key attribute for: Signature key<br>
      Sélectionnez le type de clef désiré :<br>
         (1) RSA<br>
         (2) ECC<br>
      Quel est votre choix ? 2<br>
      Sélectionnez le type de courbe elliptique désiré :<br>
         (1) Curve 25519 *default*<br>
         (2) Curve 448<br>
         (3) NIST P-256<br>
         (4) NIST P-384<br>
         (5) NIST P-521<br>
         (6) Brainpool P-256<br>
         (7) Brainpool P-384<br>
         (8) Brainpool P-512<br>
         (9) secp256k1<br>
      Quel est votre choix ? 2<br>
      The card will now be re-configured to generate a key of type:
      ed448<br>
      Note: There is no guarantee that the card supports the requested<br>
            key type or size.  If the key generation does not succeed,<br>
            please check the documentation of your card to see which<br>
            key types and sizes are supported.<br>
      Changing card key attribute for: Encryption key<br>
      Sélectionnez le type de clef désiré :<br>
         (1) RSA<br>
         (2) ECC<br>
      Quel est votre choix ? 2<br>
      Sélectionnez le type de courbe elliptique désiré :<br>
         (1) Curve 25519 *default*<br>
         (2) Curve 448<br>
         (3) NIST P-256<br>
         (4) NIST P-384<br>
         (5) NIST P-521<br>
         (6) Brainpool P-256<br>
         (7) Brainpool P-384<br>
         (8) Brainpool P-512<br>
         (9) secp256k1<br>
      Quel est votre choix ? 2<br>
      The card will now be re-configured to generate a key of type:
      cv448<br>
      Changing card key attribute for: Authentication key<br>
      Sélectionnez le type de clef désiré :<br>
         (1) RSA<br>
         (2) ECC<br>
      Quel est votre choix ? 2<br>
      Sélectionnez le type de courbe elliptique désiré :<br>
         (1) Curve 25519 *default*<br>
         (2) Curve 448<br>
         (3) NIST P-256<br>
         (4) NIST P-384<br>
         (5) NIST P-521<br>
         (6) Brainpool P-256<br>
         (7) Brainpool P-384<br>
         (8) Brainpool P-512<br>
         (9) secp256k1<br>
      Quel est votre choix ? 2<br>
      The card will now be re-configured to generate a key of type:
      ed448<br>
      <br>
      gpg/carte> list<br>
      <br>
      Reader ...........: 1209:2440:FSIJ-2.2-43112959:0<br>
      Application ID ...: D276000124010200FFFE431129590000<br>
      Application type .: OpenPGP<br>
      Version ..........: 2.0<br>
      Manufacturer .....: unmanaged S/N range<br>
      Serial number ....: 43112959<br>
      Name of cardholder: [non positionné]<br>
      Language prefs ...: [non positionné]<br>
      Salutation .......: <br>
      URL of public key : [non positionné]<br>
      Login data .......: [non positionné]<br>
      Signature PIN ....: forcé<br>
      Key attributes ...: ed448 cv448 ed448<br>
      Max. PIN lengths .: 127 127 127<br>
      PIN retry counter : 3 3 3<br>
      Signature counter : 0<br>
      KDF setting ......: off<br>
      UIF setting ......: Sign=off Decrypt=off Auth=off<br>
      Signature key ....: [none]<br>
      Encryption key....: [none]<br>
      Authentication key: [none]<br>
      General key info..: [none]<br>
      <br>
      gpg/carte> generate<br>
      Faut-il faire une sauvegarde hors carte de la clef de
      chiffrement ? (O/n) <br>
      <br>
      Veuillez noter que les configurations d'usine des codes personnels
      sont<br>
         code personnel = « 123456 »     code personnel d'admin. =
      « 12345678 ».<br>
      Vous devriez les modifier avec la commande --change-pin<br>
      <br>
      Veuillez indiquer le temps pendant lequel cette clef devrait être
      valable.<br>
               0 = la clef n'expire pas<br>
            <n>  = la clef expire dans n jours<br>
            <n>w = la clef expire dans n semaines<br>
            <n>m = la clef expire dans n mois<br>
            <n>y = la clef expire dans n ans<br>
      Pendant combien de temps la clef est-elle valable ? (0) 10y<br>
      La clef expire le mer. 21 févr. 2035 17:02:31 CET<br>
      Est-ce correct ? (o/N) o<br>
      <br>
      GnuPG doit construire une identité pour identifier la clef.<br>
      <br>
      Nom réel : test1<br>
      Adresse électronique : <br>
      Commentaire : <br>
      Vous avez sélectionné cette identité :<br>
          « test1 »<br>
      <br>
      Changer le (N)om, le (C)ommentaire, l'(A)dresse électronique<br>
      ou (O)ui/(Q)uitter ? O<br>
      Échec de génération de la clef : Erreur de carte : board error<br>
    </p>
    <p>---------------------------------------------------------------</p>
    <p>LinuxMint gnupg 2.4.4  <br>
    </p>
    <p>I created X448 keys and try to put them on Gnuk <br>
    </p>
    <p>---------------------------------</p>
    <p>gpg --list-secret-keys<br>
      <br>
      sec   ed448/0xAA988F88C70C3DEE 2025-02-23 [SC] [expire :
      2075-02-11]</p>
    <p>     Empreinte de la clef = AA988 F88C7 0C3DE E74BE DFF48 D127D
      4BA4E CAEB3 685B3 575E7</p>
    <p>uid                  [  ultime ] tmp</p>
    <p>ssb   cv448/0x406CC6562774BC84 2025-02-23 [E] [expire :
      2075-02-11]</p>
    <p>ssb   ed448/0x02BB1F8E7A2B268A 2025-02-23 [A] [expire :
      2075-02-11]</p>
    <p>---------------------------------</p>
    <p>gpg --expert --edit-key 0xAA988F88C70C3DEE</p>
    <p>gpg (GnuPG) 2.4.4; Copyright (C) 2024 g10 Code GmbH</p>
    <p>This is free software: you are free to change and redistribute
      it.</p>
    <p>There is NO WARRANTY, to the extent permitted by law.</p>
    <p>La clef secrète est disponible.</p>
    <p>sec  ed448/0xAA988F88C70C3DEE</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : SC  <br>
    </p>
    <p>     confiance : ultime        validité : ultime</p>
    <p>ssb  cv448/0x406CC6562774BC84</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : E   <br>
    </p>
    <p>ssb  ed448/0x02BB1F8E7A2B268A</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : A   <br>
    </p>
    <p>[  ultime ] (1). tmp</p>
    <p>gpg> keytocard</p>
    <p>Faut-il vraiment déplacer la clef principale ? (o/N) o</p>
    <p>Veuillez sélectionner l'endroit où stocker la clef :</p>
    <p>   (1) Clef de signature</p>
    <p>   (3) Clef d'authentification</p>
    <p>Quel est votre choix ? 1</p>
    <p>Faut-il remplacer la clef existante ? (o/N) o</p>
    <p>sec  ed448/0xAA988F88C70C3DEE</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : SC  <br>
    </p>
    <p>     confiance : ultime        validité : ultime</p>
    <p>ssb  cv448/0x406CC6562774BC84</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : E   <br>
    </p>
    <p>ssb  ed448/0x02BB1F8E7A2B268A</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : A   <br>
    </p>
    <p>[  ultime ] (1). tmp</p>
    <p>Note: the local copy of the secret key will only be deleted with
      "save".</p>
    <p>gpg> key 1</p>
    <p>sec  ed448/0xAA988F88C70C3DEE</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : SC  <br>
    </p>
    <p>     confiance : ultime        validité : ultime</p>
    <p>ssb* cv448/0x406CC6562774BC84</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : E   <br>
    </p>
    <p>ssb  ed448/0x02BB1F8E7A2B268A</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : A   <br>
    </p>
    <p>[  ultime ] (1). tmp</p>
    <p>gpg> keytocard</p>
    <p>Veuillez sélectionner l'endroit où stocker la clef :</p>
    <p>   (2) Clef de chiffrement</p>
    <p>Quel est votre choix ? 2</p>
    <p>Faut-il remplacer la clef existante ? (o/N) o</p>
    <p>sec  ed448/0xAA988F88C70C3DEE</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : SC  <br>
    </p>
    <p>     confiance : ultime        validité : ultime</p>
    <p>ssb* cv448/0x406CC6562774BC84</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : E   <br>
    </p>
    <p>ssb  ed448/0x02BB1F8E7A2B268A</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : A   <br>
    </p>
    <p>[  ultime ] (1). tmp</p>
    <p>Note: the local copy of the secret key will only be deleted with
      "save".</p>
    <p>gpg> key 1<br>
      <br>
      sec  ed448/0xAA988F88C70C3DEE</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : SC  <br>
    </p>
    <p>     confiance : ultime        validité : ultime</p>
    <p>ssb  cv448/0x406CC6562774BC84</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : E   <br>
    </p>
    <p>ssb  ed448/0x02BB1F8E7A2B268A</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : A   <br>
    </p>
    <p>[  ultime ] (1). tmp</p>
    <p>gpg> key 2</p>
    <p><br>
      sec  ed448/0xAA988F88C70C3DEE</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : SC  <br>
    </p>
    <p>     confiance : ultime        validité : ultime</p>
    <p>ssb  cv448/0x406CC6562774BC84</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : E   <br>
    </p>
    <p>ssb* ed448/0x02BB1F8E7A2B268A</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : A   <br>
    </p>
    <p>[  ultime ] (1). tmp</p>
    <p>gpg> keytocard</p>
    <p>Veuillez sélectionner l'endroit où stocker la clef :</p>
    <p>   (3) Clef d'authentification</p>
    <p>Quel est votre choix ? 2</p>
    <p>Choix incorrect.</p>
    <p>Quel est votre choix ? 3<br>
    </p>
    <p>Faut-il remplacer la clef existante ? (o/N) o</p>
    <p>sec  ed448/0xAA988F88C70C3DEE</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : SC</p>
    <p>     confiance : ultime        validité : ultime</p>
    <p>ssb  cv448/0x406CC6562774BC84</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : E   <br>
    </p>
    <p>ssb* ed448/0x02BB1F8E7A2B268A</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : A   <br>
    </p>
    <p>[  ultime ] (1). tmp</p>
    <p>Note: the local copy of the secret key will only be deleted with
      "save".</p>
    <p>gpg> key 2</p>
    <p>sec  ed448/0xAA988F88C70C3DEE</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : SC  <br>
    </p>
    <p>     confiance : ultime        validité : ultime</p>
    <p>ssb  cv448/0x406CC6562774BC84</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : E   <br>
    </p>
    <p>ssb  ed448/0x02BB1F8E7A2B268A</p>
    <p>     créé : 2025-02-23  expire : 2075-02-11  utilisation : A   <br>
    </p>
    <p>[  ultime ] (1). tmp</p>
    <p>gpg> save</p>
    <p>---------------------------------</p>
    <p>The results is with gpg --list-secret-keys</p>
    <p>sec#  ed448/0xAA988F88C70C3DEE 2025-02-23 [SC] [expire :
      2075-02-11]</p>
    <p>      Empreinte de la clef = AA988 F88C7 0C3DE E74BE DFF48 D127D
      4BA4E CAEB3 685B3 575E7</p>
    <p>uid                  [  ultime ] tmp</p>
    <p>ssb>  cv448/0x406CC6562774BC84 2025-02-23 [E] [expire :
      2075-02-11]</p>
    <p>ssb#  ed448/0x02BB1F8E7A2B268A 2025-02-23 [A] [expire :
      2075-02-11]</p>
    <p>--------</p>
    <p>It seems that transfert of SC and A keys failed (# indicator). It
      succeed with E key and I can  encrypt and decrypt with it.</p>
    <p>--------</p>
    <p><br>
    </p>
    <p><span style="white-space: pre-wrap">
</span></p>
    <br>
    <div id="grammalecte_menu_main_button_shadow_host"
      style="width: 0px; height: 0px;"></div>
  </body>
</html>