1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 * 21 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 22 * Use is subject to license terms. 23 */ 24 25 #include <crypt.h> 26 #include <string.h> 27 28 #ifdef CRYPT_SHA256 29 static const struct 30 { 31 const char *salt; 32 const char *input; 33 const char *expected; 34 } tests2[] = { 35 { "$5$saltstring", "Hello world!", 36 "$5$saltstring$5B8vYYiY.CVt1RlTTf8KbXBH3hsxY/GNooZaBBGWEc5" }, 37 { "$5$rounds=10000$saltstringsaltstring", "Hello world!", 38 "$5$rounds=10000$saltstringsaltst$3xv.VbSHBb41AL9AvLeujZkZRBA" 39 "wqFMz2.opqey6IcA" }, 40 { "$5$rounds=5000$toolongsaltstring", "This is just a test", 41 "$5$rounds=5000$toolongsaltstrin$Un/5jzAHMgOGZ5.mWJpuVolil07g" 42 "uHPvOW8mGRcvxa5" }, 43 { "$5$rounds=1400$anotherlongsaltstring", 44 "a very much longer text to encrypt. This one even stretches" 45 " over morethan one line.", 46 "$5$rounds=1400$anotherlongsalts$Rx.j8H.h8HjEDGomFU8bDkXm3XIU" 47 "nzyxf12oP84Bnq1" }, 48 { "$5$rounds=77777$short", 49 "we have a short salt string but not a short password", 50 "$5$rounds=77777$short$JiO1O3ZpDAxGJeaDIuqCoEFysAe1mZNJRs3pw0" 51 "KQRd/" }, 52 { "$5$rounds=123456$asaltof16chars..", "a short string", 53 "$5$rounds=123456$asaltof16chars..$gP3VQ/6X7UUEW3HkBn2w1/Ptq2" 54 "jxPyzV/cZKmF/wJvD" }, 55 { "$5$rounds=10$roundstoolow", "the minimum number is still observed", 56 "$5$rounds=1000$roundstoolow$yfvwcWrQ8l/K0DAWyuPMDNHpIVlTQebY" 57 "9l/gL972bIC" }, 58 }; 59 #elif CRYPT_SHA512 60 static const struct 61 { 62 const char *salt; 63 const char *input; 64 const char *expected; 65 } tests2[] = { 66 { "$6$saltstring", "Hello world!", 67 "$6$saltstring$svn8UoSVapNtMuq1ukKS4tPQd8iKwSMHWjl/O817G3uBnI" 68 "FNjnQJuesI68u4OTLiBFdcbYEdFCoEOfaS35inz1" }, 69 { "$6$rounds=10000$saltstringsaltstring", "Hello world!", 70 "$6$rounds=10000$saltstringsaltst$OW1/O6BYHV6BcXZu8QVeXbDWra3" 71 "Oeqh0sbHbbMCVNSnCM/UrjmM0Dp8vOuZeHBy/YTBmSK6H9qs/y3RnOaw5v." }, 72 { "$6$rounds=5000$toolongsaltstring", "This is just a test", 73 "$6$rounds=5000$toolongsaltstrin$lQ8jolhgVRVhY4b5pZKaysCLi0QBxG" 74 "oNeKQzQ3glMhwllF7oGDZxUhx1yxdYcz/e1JSbq3y6JMxxl8audkUEm0" }, 75 { "$6$rounds=1400$anotherlongsaltstring", 76 "a very much longer text to encrypt. This one even stretches " 77 "over morethan one line.", 78 "$6$rounds=1400$anotherlongsalts$POfYwTEok97VWcjxIiSOjiykti.o/p" 79 "Qs.wPvMxQ6Fm7I6IoYN3CmLs66x9t0oSwbtEW7o7UmJEiDwGqd8p4ur1" }, 80 { "$6$rounds=77777$short", 81 "we have a short salt string but not a short password", 82 "$6$rounds=77777$short$WuQyW2YR.hBNpjjRhpYD/ifIw05xdfeEyQoMxIXb" 83 "kvr0gge1a1x3yRULJ5CCaUeOxFmtlcGZelFl5CxtgfiAc0" }, 84 { "$6$rounds=123456$asaltof16chars..", "a short string", 85 "$6$rounds=123456$asaltof16chars..$BtCwjqMJGx5hrJhZywWvt0RLE8uZ" 86 "4oPwcelCjmw2kSYu.Ec6ycULevoBK25fs2xXgMNrCzIMVcgEJAstJeonj1" }, 87 { "$6$rounds=10$roundstoolow", "the minimum number is still observed", 88 "$6$rounds=1000$roundstoolow$kUMsbe306n21p9R.FRkW3IGn.S9NPN0x50Y" 89 "hH1xhLsPuWGsUSklZt58jaTfF4ZEQpyUNGc0dqbpBYYBaHHrsX." }, 90 }; 91 92 #else 93 #error "One of CRYPT_SHA256 or CRYPT_SHA512 must be defined" 94 #endif 95 96 #define ntests2 (sizeof (tests2) / sizeof (tests2[0])) 97 98 int 99 main(int argc, char *argv[]) 100 { 101 int cnt; 102 int failures = 0; 103 char ctbuffer[CRYPT_MAXCIPHERTEXTLEN]; 104 size_t ctbufflen = sizeof (ctbuffer); 105 106 #ifdef CRYPT_SHA256 107 fprintf(stderr, "CRYPT_SHA256 "); 108 #elif CRYPT_SHA512 109 fprintf(stderr, "CRYPT_SHA512 "); 110 #endif 111 fprintf(stderr, "CRYPT_MAXCIPHERTEXTLEN = %d\n", 112 CRYPT_MAXCIPHERTEXTLEN); 113 for (cnt = 0; cnt < ntests2; ++cnt) { 114 char *cp; 115 fprintf(stderr, "test %d (outlen=%d): ", cnt, 116 strlen(tests2[cnt].expected)); 117 cp = crypt_genhash_impl(ctbuffer, ctbufflen, 118 tests2[cnt].input, tests2[cnt].salt, NULL); 119 120 if (cp == NULL || (strcmp(cp, tests2[cnt].expected) != 0)) { 121 fprintf(stderr, 122 "FAILED\nE(%d): \"%s\"\nG(%d): \"%s\"\n", 123 strlen(tests2[cnt].expected), tests2[cnt].expected, 124 (cp ? strlen(cp) : 0), (cp ? cp : "NULL")); 125 failures++; 126 } else { 127 fprintf(stderr, "OK\n"); 128 } 129 } 130 131 if (failures == 0) { 132 fprintf(stderr, "all tests OK\n"); 133 } else { 134 fprintf(stderr, "%d tests failed\n", failures); 135 } 136 137 return (failures); 138 } 139