1 /* 2 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 #include <stdio.h> 11 #include <stdlib.h> 12 #include <string.h> 13 14 #include "../e_os.h" 15 16 #if defined(OPENSSL_NO_DES) && !defined(OPENSSL_NO_MDC2) 17 # define OPENSSL_NO_MDC2 18 #endif 19 20 #ifdef OPENSSL_NO_MDC2 21 int main(int argc, char *argv[]) 22 { 23 printf("No MDC2 support\n"); 24 return (0); 25 } 26 #else 27 # include <openssl/evp.h> 28 # include <openssl/mdc2.h> 29 30 # ifdef CHARSET_EBCDIC 31 # include <openssl/ebcdic.h> 32 # endif 33 34 static unsigned char pad1[16] = { 35 0x42, 0xE5, 0x0C, 0xD2, 0x24, 0xBA, 0xCE, 0xBA, 36 0x76, 0x0B, 0xDD, 0x2B, 0xD4, 0x09, 0x28, 0x1A 37 }; 38 39 static unsigned char pad2[16] = { 40 0x2E, 0x46, 0x79, 0xB5, 0xAD, 0xD9, 0xCA, 0x75, 41 0x35, 0xD8, 0x7A, 0xFE, 0xAB, 0x33, 0xBE, 0xE2 42 }; 43 44 int main(int argc, char *argv[]) 45 { 46 int ret = 1; 47 unsigned char md[MDC2_DIGEST_LENGTH]; 48 int i; 49 EVP_MD_CTX *c; 50 static char text[] = "Now is the time for all "; 51 52 # ifdef CHARSET_EBCDIC 53 ebcdic2ascii(text, text, strlen(text)); 54 # endif 55 56 c = EVP_MD_CTX_new(); 57 if (c == NULL 58 || !EVP_DigestInit_ex(c, EVP_mdc2(), NULL) 59 || !EVP_DigestUpdate(c, (unsigned char *)text, strlen(text)) 60 || !EVP_DigestFinal_ex(c, &(md[0]), NULL)) 61 goto err; 62 63 if (memcmp(md, pad1, MDC2_DIGEST_LENGTH) != 0) { 64 for (i = 0; i < MDC2_DIGEST_LENGTH; i++) 65 printf("%02X", md[i]); 66 printf(" <- generated\n"); 67 for (i = 0; i < MDC2_DIGEST_LENGTH; i++) 68 printf("%02X", pad1[i]); 69 printf(" <- correct\n"); 70 goto err; 71 } else { 72 printf("pad1 - ok\n"); 73 } 74 75 if (!EVP_DigestInit_ex(c, EVP_mdc2(), NULL)) 76 goto err; 77 /* FIXME: use a ctl function? */ 78 ((MDC2_CTX *)EVP_MD_CTX_md_data(c))->pad_type = 2; 79 if (!EVP_DigestUpdate(c, (unsigned char *)text, strlen(text)) 80 || !EVP_DigestFinal_ex(c, &(md[0]), NULL)) 81 goto err; 82 83 if (memcmp(md, pad2, MDC2_DIGEST_LENGTH) != 0) { 84 for (i = 0; i < MDC2_DIGEST_LENGTH; i++) 85 printf("%02X", md[i]); 86 printf(" <- generated\n"); 87 for (i = 0; i < MDC2_DIGEST_LENGTH; i++) 88 printf("%02X", pad2[i]); 89 printf(" <- correct\n"); 90 } else { 91 printf("pad2 - ok\n"); 92 ret = 0; 93 } 94 95 err: 96 EVP_MD_CTX_free(c); 97 EXIT(ret); 98 } 99 #endif 100