added missing upstream files
[tridge/bind9.git] / contrib / pkcs11-keygen / destroyobj.c
1 /* destroyobj [-s $slot] [-i $id | -l $label] [-p $pin] */
2
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <unistd.h>
6 #include <fcntl.h>
7 #include <errno.h>
8 #include <string.h>
9 #include <sys/types.h>
10 #ifndef OPENCRYPTOKI
11 #include <security/cryptoki.h>
12 #include <security/pkcs11.h>
13 #else
14 #include <opencryptoki/pkcs11.h>
15 #endif
16
17 int
18 main(int argc, char *argv[])
19 {
20     CK_RV rv;
21     CK_SLOT_ID slot = 0;
22     CK_SESSION_HANDLE hSession;
23     CK_UTF8CHAR *pin = NULL;
24     CK_BYTE attr_id[2];
25     CK_OBJECT_HANDLE akey[50];
26     char *label = NULL;
27     int error = 0;
28     int id = 0, i = 0;
29     int c, errflg = 0;
30     CK_ULONG ulObjectCount;
31     CK_ATTRIBUTE search_template[] = {
32         {CKA_ID, &attr_id, sizeof(attr_id)}
33     };
34     extern char *optarg;
35     extern int optopt;
36
37     while ((c = getopt(argc, argv, ":s:i:l:p:")) != -1) {
38         switch (c) {
39         case 's':
40             slot = atoi(optarg);
41             break;
42         case 'i':
43             id = atoi(optarg);
44             id &= 0xffff;
45             break;
46         case 'l':
47             label = optarg;
48             break;
49         case 'p':
50             pin = (CK_UTF8CHAR *)optarg;
51             break;
52         case ':':
53             fprintf(stderr, "Option -%c requires an operand\n", optopt);
54             errflg++;
55             break;
56         case '?':
57         default:
58             fprintf(stderr, "Unrecognised option: -%c\n", optopt);
59             errflg++;
60         }
61     }
62     if (errflg || ((!id) && (!label))) {
63         fprintf(stderr,
64                 "usage: destroykey [-s slot] [-i id | -l label] [-p pin]\n");
65         exit(1);
66     }
67     if (id) {
68         printf("id %i\n", id);
69         attr_id[0] = (id >> 8) & 0xff;
70         attr_id[1] = id & 0xff;
71     } else if (label) {
72         printf("label %s\n", label);
73         search_template[0].type = CKA_LABEL;
74         search_template[0].pValue = label;
75         search_template[0].ulValueLen = strlen(label);
76     }
77
78     /* Initialize the CRYPTOKI library */
79     rv = C_Initialize(NULL_PTR);
80     if (rv != CKR_OK) {
81         fprintf(stderr, "C_Initialize: Error = 0x%.8X\n", rv);
82         exit(1);
83     }
84
85     /* Open a session on the slot found */
86     rv = C_OpenSession(slot, CKF_RW_SESSION+CKF_SERIAL_SESSION,
87                        NULL_PTR, NULL_PTR, &hSession);
88     if (rv != CKR_OK) {
89         fprintf(stderr, "C_OpenSession: Error = 0x%.8X\n", rv);
90         error = 1;
91         goto exit_program;
92     }
93
94     /* Login to the Token (Keystore) */
95     if (!pin)
96 #ifndef OPENCRYPTOKI
97         pin = (CK_UTF8CHAR *)getpassphrase("Enter Pin: ");
98 #else
99         pin = (CK_UTF8CHAR *)getpass("Enter Pin: ");
100 #endif
101     rv = C_Login(hSession, CKU_USER, pin, strlen((char *)pin));
102     memset(pin, 0, strlen((char *)pin));
103     if (rv != CKR_OK) {
104         fprintf(stderr, "C_Login: Error = 0x%.8X\n", rv);
105         error = 1;
106         goto exit_session;
107     }
108
109     rv = C_FindObjectsInit(hSession, search_template,
110                            ((id != 0) || (label != NULL)) ? 1 : 0); 
111     if (rv != CKR_OK) {
112         fprintf(stderr, "C_FindObjectsInit: Error = 0x%.8X\n", rv);
113         error = 1;
114         goto exit_session;
115     }
116     
117     rv = C_FindObjects(hSession, akey, 50, &ulObjectCount);
118     if (rv != CKR_OK) {
119         fprintf(stderr, "C_FindObjects: Error = 0x%.8X\n", rv);
120         error = 1;
121         goto exit_search;
122     }
123
124     for (i = 0; i < ulObjectCount; i++) {
125         CK_OBJECT_CLASS oclass = 0;
126         CK_BYTE labelbuf[64 + 1];
127         CK_BYTE idbuf[64];
128         CK_ATTRIBUTE attr_template[] = {
129             {CKA_CLASS, &oclass, sizeof(oclass)},
130             {CKA_LABEL, labelbuf, sizeof(labelbuf) - 1},
131             {CKA_ID, idbuf, sizeof(idbuf)}
132         };
133         int j, len;
134
135         memset(labelbuf, 0, sizeof(labelbuf));
136         memset(idbuf, 0, sizeof(idbuf));
137
138         rv = C_GetAttributeValue(hSession, akey[i], attr_template, 3);
139         if (rv != CKR_OK) {
140             fprintf(stderr, "C_GetAttributeValue[%d]: rv = 0x%.8X\n", i, rv);
141             error = 1;
142             goto exit_search;
143         }
144         len = attr_template[2].ulValueLen;
145         printf("object[%d]: class %d label '%s' id[%u] ",
146                i, oclass, labelbuf, attr_template[2].ulValueLen);
147         if (len > 4)
148             len = 4;
149         for (j = 0; j < len; j++)
150             printf("%02x", idbuf[j]);
151         if (attr_template[2].ulValueLen > len)
152             printf("...\n");
153         else
154             printf("\n");
155     }
156
157     /* give a chance to kill this */
158     printf("sleeping 5 seconds...\n");
159     sleep(5);
160
161     for (i = 0; i < ulObjectCount; i++) {
162         rv = C_DestroyObject(hSession, akey[i]);
163         if (rv != CKR_OK) {
164             fprintf(stderr, "C_DestroyObject[%d]: rv = 0x%.8X\n", i, rv);
165             error = 1;
166         }
167     }
168
169  exit_search:
170     rv = C_FindObjectsFinal(hSession);
171     if (rv != CKR_OK) {
172         fprintf(stderr, "C_FindObjectsFinal: Error = 0x%.8X\n", rv);
173         error = 1;
174     }
175
176  exit_session:
177     (void) C_CloseSession(hSession);
178
179  exit_program:
180     (void) C_Finalize(NULL_PTR);
181
182     exit(error);
183 }