For FIPS algorithm test utilities use our own version of strcasecmp and
authorDr. Stephen Henson <steve@openssl.org>
Sun, 1 May 2011 16:18:52 +0000 (16:18 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Sun, 1 May 2011 16:18:52 +0000 (16:18 +0000)
strncasecmp to cover cases where platforms don't support them.

fips/aes/fips_aesavs.c
fips/des/fips_desmovs.c
fips/fips_utl.h

index 72c2d09..dae8023 100644 (file)
@@ -152,7 +152,7 @@ static int AESTest(EVP_CIPHER_CTX *ctx,
                }
 
        }
-    else if (strncasecmp(amode, "OFB", 3) == 0)
+    else if (fips_strncasecmp(amode, "OFB", 3) == 0)
        {
        switch (akeysz)
                {
@@ -661,7 +661,7 @@ static int proc_file(char *rqfile, char *rspfile)
                        if (VERBOSE)
                                printf("Test = %s, Mode = %s\n", atest, amode);
                        }
-                   else if (strncasecmp(pp, "Key Length : ", 13) == 0)
+                   else if (fips_strncasecmp(pp, "Key Length : ", 13) == 0)
                        {
                        akeysz = atoi(pp+13);
                        if (VERBOSE)
@@ -676,9 +676,9 @@ static int proc_file(char *rqfile, char *rspfile)
                {
                fputs(ibuf, rfp);
                ++step;
-               if (strncasecmp(ibuf, "[ENCRYPT]", 9) == 0)
+               if (fips_strncasecmp(ibuf, "[ENCRYPT]", 9) == 0)
                    dir = 1;
-               else if (strncasecmp(ibuf, "[DECRYPT]", 9) == 0)
+               else if (fips_strncasecmp(ibuf, "[DECRYPT]", 9) == 0)
                    dir = 0;
                else
                    {
@@ -700,10 +700,10 @@ static int proc_file(char *rqfile, char *rspfile)
            fputs(ibuf, rfp);
            if(*ibuf == '\n')
                break;
-           if(!strncasecmp(ibuf,"COUNT = ",8))
+           if(!fips_strncasecmp(ibuf,"COUNT = ",8))
                break;
 
-           if (strncasecmp(ibuf, "KEY = ", 6) != 0)
+           if (fips_strncasecmp(ibuf, "KEY = ", 6) != 0)
                {
                printf("Missing KEY\n");
                err = 1;
@@ -730,7 +730,7 @@ static int proc_file(char *rqfile, char *rspfile)
 
        case 3: /* IV = xxxx */
            fputs(ibuf, rfp);
-           if (strncasecmp(ibuf, "IV = ", 5) != 0)
+           if (fips_strncasecmp(ibuf, "IV = ", 5) != 0)
                {
                printf("Missing IV\n");
                err = 1;
@@ -751,7 +751,7 @@ static int proc_file(char *rqfile, char *rspfile)
 
        case 4: /* PLAINTEXT = xxxx */
            fputs(ibuf, rfp);
-           if (strncasecmp(ibuf, "PLAINTEXT = ", 12) != 0)
+           if (fips_strncasecmp(ibuf, "PLAINTEXT = ", 12) != 0)
                {
                printf("Missing PLAINTEXT\n");
                err = 1;
@@ -795,7 +795,7 @@ static int proc_file(char *rqfile, char *rspfile)
 
        case 5: /* CIPHERTEXT = xxxx */
            fputs(ibuf, rfp);
-           if (strncasecmp(ibuf, "CIPHERTEXT = ", 13) != 0)
+           if (fips_strncasecmp(ibuf, "CIPHERTEXT = ", 13) != 0)
                {
                printf("Missing KEY\n");
                err = 1;
index 88c3063..ee65e09 100644 (file)
@@ -105,17 +105,17 @@ static int DESTest(EVP_CIPHER_CTX *ctx,
        EXIT(1);
        }
 
-    if (strcasecmp(amode, "CBC") == 0)
+    if (fips_strcasecmp(amode, "CBC") == 0)
        cipher = EVP_des_ede3_cbc();
-    else if (strcasecmp(amode, "ECB") == 0)
+    else if (fips_strcasecmp(amode, "ECB") == 0)
        cipher = EVP_des_ede3_ecb();
-    else if (strcasecmp(amode, "CFB64") == 0)
+    else if (fips_strcasecmp(amode, "CFB64") == 0)
        cipher = EVP_des_ede3_cfb64();
-    else if (strncasecmp(amode, "OFB", 3) == 0)
+    else if (fips_strncasecmp(amode, "OFB", 3) == 0)
        cipher = EVP_des_ede3_ofb();
-    else if(!strcasecmp(amode,"CFB8"))
+    else if(!fips_strcasecmp(amode,"CFB8"))
        cipher = EVP_des_ede3_cfb8();
-    else if(!strcasecmp(amode,"CFB1"))
+    else if(!fips_strcasecmp(amode,"CFB1"))
        cipher = EVP_des_ede3_cfb1();
     else
        {
@@ -125,7 +125,7 @@ static int DESTest(EVP_CIPHER_CTX *ctx,
 
     if (FIPS_cipherinit(ctx, cipher, aKey, iVec, dir) <= 0)
        return 0;
-    if(!strcasecmp(amode,"CFB1"))
+    if(!fips_strcasecmp(amode,"CFB1"))
        M_EVP_CIPHER_CTX_set_flags(ctx, EVP_CIPH_FLAG_LENGTH_BITS);
     FIPS_cipher(ctx, out, in, len);
 
@@ -398,9 +398,9 @@ static int proc_file(char *rqfile, char *rspfile)
                {
                fputs(ibuf, rfp);
                ++step;
-               if (strncasecmp(ibuf, "[ENCRYPT]", 9) == 0)
+               if (fips_strncasecmp(ibuf, "[ENCRYPT]", 9) == 0)
                    dir = 1;
-               else if (strncasecmp(ibuf, "[DECRYPT]", 9) == 0)
+               else if (fips_strncasecmp(ibuf, "[DECRYPT]", 9) == 0)
                    dir = 0;
                else
                    {
@@ -424,24 +424,24 @@ static int proc_file(char *rqfile, char *rspfile)
                fputs(ibuf, rfp);
                break;
                 }
-           if(!strncasecmp(ibuf,"COUNT = ",8))
+           if(!fips_strncasecmp(ibuf,"COUNT = ",8))
                {
                fputs(ibuf, rfp);
                break;
                 }
-           if(!strncasecmp(ibuf,"COUNT=",6))
+           if(!fips_strncasecmp(ibuf,"COUNT=",6))
                {
                fputs(ibuf, rfp);
                break;
                 }
-           if(!strncasecmp(ibuf,"NumKeys = ",10))
+           if(!fips_strncasecmp(ibuf,"NumKeys = ",10))
                {
                numkeys=atoi(ibuf+10);
                break;
                }
          
            fputs(ibuf, rfp);
-           if(!strncasecmp(ibuf,"KEY = ",6))
+           if(!fips_strncasecmp(ibuf,"KEY = ",6))
                {
                akeysz=64;
                len = hex2bin((char*)ibuf+6, aKey);
@@ -454,7 +454,7 @@ static int proc_file(char *rqfile, char *rspfile)
                PrintValue("KEY", aKey, len);
                ++step;
                }
-           else if(!strncasecmp(ibuf,"KEYs = ",7))
+           else if(!fips_strncasecmp(ibuf,"KEYs = ",7))
                {
                akeysz=64*3;
                len=hex2bin(ibuf+7,aKey);
@@ -470,7 +470,7 @@ static int proc_file(char *rqfile, char *rspfile)
                PrintValue("KEYs",aKey,len);
                ++step;
                }
-           else if(!strncasecmp(ibuf,"KEY",3))
+           else if(!fips_strncasecmp(ibuf,"KEY",3))
                {
                int n=ibuf[3]-'1';
 
@@ -496,7 +496,7 @@ static int proc_file(char *rqfile, char *rspfile)
 
        case 3: /* IV = xxxx */
            fputs(ibuf, rfp);
-           if (strncasecmp(ibuf, "IV = ", 5) != 0)
+           if (fips_strncasecmp(ibuf, "IV = ", 5) != 0)
                {
                printf("Missing IV\n");
                err = 1;
@@ -517,7 +517,7 @@ static int proc_file(char *rqfile, char *rspfile)
 
        case 4: /* PLAINTEXT = xxxx */
            fputs(ibuf, rfp);
-           if (strncasecmp(ibuf, "PLAINTEXT = ", 12) != 0)
+           if (fips_strncasecmp(ibuf, "PLAINTEXT = ", 12) != 0)
                {
                printf("Missing PLAINTEXT\n");
                err = 1;
@@ -559,7 +559,7 @@ static int proc_file(char *rqfile, char *rspfile)
 
        case 5: /* CIPHERTEXT = xxxx */
            fputs(ibuf, rfp);
-           if (strncasecmp(ibuf, "CIPHERTEXT = ", 13) != 0)
+           if (fips_strncasecmp(ibuf, "CIPHERTEXT = ", 13) != 0)
                {
                printf("Missing KEY\n");
                err = 1;
@@ -636,11 +636,11 @@ int main(int argc, char **argv)
     fips_algtest_init();
     if (argc > 1)
        {
-       if (strcasecmp(argv[1], "-d") == 0)
+       if (fips_strcasecmp(argv[1], "-d") == 0)
            {
            d_opt = 1;
            }
-       else if (strcasecmp(argv[1], "-f") == 0)
+       else if (fips_strcasecmp(argv[1], "-f") == 0)
            {
            f_opt = 1;
            d_opt = 0;
index f64a35d..dc29c20 100644 (file)
@@ -1,5 +1,5 @@
 /* ====================================================================
- * Copyright (c) 2007 The OpenSSL Project.  All rights reserved.
+ * Copyright (c) 2011 The OpenSSL Project.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -66,6 +66,8 @@ void PrintValue(char *tag, unsigned char *val, int len);
 void OutputValue(char *tag, unsigned char *val, int len, FILE *rfp,int bitmode);
 void fips_algtest_init(void);
 void do_entropy_stick(void);
+int fips_strncasecmp(const char *str1, const char *str2, size_t n);
+int fips_strcasecmp(const char *str1, const char *str2);
 
 static int no_err;
 
@@ -420,3 +422,32 @@ void OutputValue(char *tag, unsigned char *val, int len, FILE *rfp,int bitmode)
 #endif
     }
 
+/* Not all platforms support strcasecmp and strncasecmp: implement versions
+ * in here to avoid need to include them in the validated module. Taken
+ * from crypto/o_str.c written by Richard Levitte (richard@levitte.org)
+ */
+
+int fips_strncasecmp(const char *str1, const char *str2, size_t n)
+       {
+       while (*str1 && *str2 && n)
+               {
+               int res = toupper(*str1) - toupper(*str2);
+               if (res) return res < 0 ? -1 : 1;
+               str1++;
+               str2++;
+               n--;
+               }
+       if (n == 0)
+               return 0;
+       if (*str1)
+               return 1;
+       if (*str2)
+               return -1;
+       return 0;
+       }
+
+int fips_strcasecmp(const char *str1, const char *str2)
+       {
+       return fips_strncasecmp(str1, str2, (size_t)-1);
+       }
+