Use macros for iobuf ioctls.
[gnupg.git] / g10 / misc.c
index cbaee08..f34e1e3 100644 (file)
@@ -1,6 +1,6 @@
 /* misc.c - miscellaneous functions
  * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
- *               2008 Free Software Foundation, Inc.
+ *               2008, 2009 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -340,7 +340,7 @@ print_digest_algo_note( int algo )
 /* Map OpenPGP algo numbers to those used by Libgcrypt.  We need to do
    this for algorithms we implemented in Libgcrypt after they become
    part of OpenPGP.  */
-static int
+int
 map_cipher_openpgp_to_gcry (int algo)
 {
   switch (algo)
@@ -400,15 +400,6 @@ openpgp_cipher_test_algo( int algo )
   if ( algo < 0 || algo > 110 || algo == 5 || algo == 6 )
     return gpg_error (GPG_ERR_CIPHER_ALGO);
 
-  /* Camellia is not yet defined for OpenPGP thus only allow it if
-     requested.  */
-#ifndef USE_CAMELLIA
-  if (algo == CIPHER_ALGO_CAMELLIA128 
-      || algo == CIPHER_ALGO_CAMELLIA192
-      || algo == CIPHER_ALGO_CAMELLIA256)
-    return gpg_error (GPG_ERR_CIPHER_ALGO);
-#endif
-
   return gcry_cipher_test_algo (map_cipher_openpgp_to_gcry (algo));
 }
 
@@ -519,15 +510,16 @@ idea_cipher_warn(int show)
 
 
 static unsigned long 
-get_signature_count (PKT_secret_key *sk)
+get_signature_count (PKT_public_key *pk)
 {
 #ifdef ENABLE_CARD_SUPPORT
-  if(sk && sk->is_protected && sk->protect.s2k.mode==1002)
-    {
-      struct agent_card_info_s info;
-      if(agent_scd_getattr("SIG-COUNTER",&info)==0)
-       return info.sig_counter;
-    }  
+  /* FIXME: Need to call the agent.  */
+  /* if(sk && sk->is_protected && sk->protect.s2k.mode==1002) */
+  /*   { */
+  /*     struct agent_card_info_s info; */
+  /*     if(agent_scd_getattr("SIG-COUNTER",&info)==0) */
+  /*       return info.sig_counter; */
+  /*   }   */
 #endif
 
   /* How to do this without a card? */
@@ -548,13 +540,13 @@ pct_expando(const char *string,struct expando_args *args)
   if(args->pk)
     keyid_from_pk(args->pk,pk_keyid);
 
-  if(args->sk)
-    keyid_from_sk(args->sk,sk_keyid);
+  if(args->pksk)
+    keyid_from_pk (args->pksk, sk_keyid);
 
   /* This is used so that %k works in photoid command strings in
      --list-secret-keys (which of course has a sk, but no pk). */
-  if(!args->pk && args->sk)
-    keyid_from_sk(args->sk,pk_keyid);
+  if(!args->pk && args->pksk)
+    keyid_from_pk (args->pksk, pk_keyid);
 
   while(*ch!='\0')
     {
@@ -615,7 +607,7 @@ pct_expando(const char *string,struct expando_args *args)
            case 'c': /* signature count from card, if any. */
              if(idx+10<maxlen)
                {
-                 sprintf(&ret[idx],"%lu",get_signature_count(args->sk));
+                 sprintf (&ret[idx],"%lu", get_signature_count (args->pksk));
                  idx+=strlen(&ret[idx]);
                  done=1;
                }             
@@ -629,28 +621,31 @@ pct_expando(const char *string,struct expando_args *args)
                size_t len;
                int i;
 
-               if((*(ch+1))=='p' && args->sk)
+               if((*(ch+1))=='p' && args->pksk)
                  {
-                   if(args->sk->is_primary)
-                     fingerprint_from_sk(args->sk,array,&len);
-                   else if(args->sk->main_keyid[0] || args->sk->main_keyid[1])
+                   if(args->pksk->is_primary)
+                     fingerprint_from_pk (args->pksk, array, &len);
+                   else if (args->pksk->main_keyid[0]
+                             || args->pksk->main_keyid[1])
                      {
+                        /* FIXME: Document teh code and check whether
+                           it is still needed.  */
                        PKT_public_key *pk=
                          xmalloc_clear(sizeof(PKT_public_key));
 
-                       if(get_pubkey_fast(pk,args->sk->main_keyid)==0)
-                         fingerprint_from_pk(pk,array,&len);
+                       if (!get_pubkey_fast (pk,args->pksk->main_keyid))
+                         fingerprint_from_pk (pk, array, &len);
                        else
-                         memset(array,0,(len=MAX_FINGERPRINT_LEN));
-                       free_public_key(pk);
+                         memset (array, 0, (len=MAX_FINGERPRINT_LEN));
+                       free_public_key (pk);
                      }
                    else
                      memset(array,0,(len=MAX_FINGERPRINT_LEN));
                  }
                else if((*(ch+1))=='f' && args->pk)
-                 fingerprint_from_pk(args->pk,array,&len);
-               else if((*(ch+1))=='g' && args->sk)
-                 fingerprint_from_sk(args->sk,array,&len);
+                 fingerprint_from_pk (args->pk, array, &len);
+               else if((*(ch+1))=='g' && args->pksk)
+                 fingerprint_from_pk (args->pksk, array, &len);
                else
                  memset(array,0,(len=MAX_FINGERPRINT_LEN));
 
@@ -1215,39 +1210,16 @@ parse_options(char *str,unsigned int *options,
 }
 
 
-/* Return a new malloced string by unescaping the string S.  Escaping
-   is percent escaping and '+'/space mapping.  A binary nul will
-   silently be replaced by a 0xFF. */
-char *
-unescape_percent_string (const unsigned char *s)
-{
-  char *buffer, *d;
-
-  buffer = d = xmalloc (strlen (s)+1);
-  while (*s)
-    {
-      if (*s == '%' && s[1] && s[2])
-        { 
-          s++;
-          *d = xtoi_2 (s);
-          if (!*d)
-            *d = '\xff';
-          d++;
-          s += 2;
-        }
-      else if (*s == '+')
-        {
-          *d++ = ' ';
-          s++;
-        }
-      else
-        *d++ = *s++;
-    }
-  *d = 0; 
-  return buffer;
-}
-
-
+/* Check whether the string has characters not valid in an RFC-822
+   address.  To cope with OpenPGP we ignore non-ascii characters
+   so that for example umlauts are legal in an email address.  An
+   OpenPGP user ID must be utf-8 encoded but there is no strict
+   requirement for RFC-822.  Thus to avoid IDNA encoding we put the
+   address verbatim as utf-8 into the user ID under the assumption
+   that mail programs handle IDNA at a lower level and take OpenPGP
+   user IDs as utf-8.  Note that we can't do an utf-8 encoding
+   checking here because in keygen.c this function is called with the
+   native encoding and native to utf-8 encoding is only done  later.  */
 int
 has_invalid_email_chars (const char *s)
 {
@@ -1257,8 +1229,8 @@ has_invalid_email_chars (const char *s)
 
   for ( ; *s; s++ ) 
     {
-      if ( *s & 0x80 )
-        return 1;
+      if ( (*s & 0x80) )
+        continue; /* We only care about ASCII.  */
       if ( *s == '@' )
         at_seen=1;
       else if ( !at_seen && !( !!strchr( valid_chars, *s ) || *s == '+' ) )