Initial commit for Tizen
[profile/extras/shadow-utils.git] / lib / encrypt.c
1 /*
2  * Copyright (c) 1990 - 1993, Julianne Frances Haugh
3  * Copyright (c) 1996 - 2000, Marek Michałkiewicz
4  * Copyright (c) 2005       , Tomasz Kłoczko
5  * Copyright (c) 2007 - 2008, Nicolas François
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. The name of the copyright holders or contributors may not be used to
17  *    endorse or promote products derived from this software without
18  *    specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
23  * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT
24  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32
33 #include <config.h>
34
35 #ident "$Id: encrypt.c 2849 2009-04-30 21:08:49Z nekral-guest $"
36
37 #include <unistd.h>
38 #include <stdio.h>
39
40 #include "prototypes.h"
41 #include "defines.h"
42
43 char *pw_encrypt (const char *clear, const char *salt)
44 {
45         static char cipher[128];
46         char *cp;
47
48         cp = crypt (clear, salt);
49         if (!cp) {
50                 /*
51                  * Single Unix Spec: crypt() may return a null pointer,
52                  * and set errno to indicate an error.  The caller doesn't
53                  * expect us to return NULL, so...
54                  */
55                 perror ("crypt");
56                 exit (EXIT_FAILURE);
57         }
58
59         /* The GNU crypt does not return NULL if the algorithm is not
60          * supported, and return a DES encrypted password. */
61         if ((NULL != salt) && (salt[0] == '$') && (strlen (cp) <= 13))
62         {
63                 const char *method;
64                 switch (salt[1])
65                 {
66                         case '1':
67                                 method = "MD5";
68                                 break;
69                         case '5':
70                                 method = "SHA256";
71                                 break;
72                         case '6':
73                                 method = "SHA512";
74                                 break;
75                         default:
76                         {
77                                 static char nummethod[4] = "$x$";
78                                 nummethod[1] = salt[1];
79                                 method = &nummethod[0];
80                         }
81                 }
82                 fprintf (stderr,
83                          _("crypt method not supported by libcrypt? (%s)\n"),
84                           method);
85                 exit (EXIT_FAILURE);
86         }
87
88         if (strlen (cp) != 13) {
89                 return cp;      /* nonstandard crypt() in libc, better bail out */
90         }
91
92         strcpy (cipher, cp);
93
94         return cipher;
95 }
96