MagickCore 7.0.10
secret.c
Go to the documentation of this file.
1/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3% %
4% %
5% %
6% SSSSS EEEEE CCCC RRRR EEEEE TTTTT %
7% SS E C R R E T %
8% SSS EEE C RRRR EEE T %
9% SS E C R R E T %
10% SSSSS EEEEE CCCC R R EEEEE T %
11% %
12% %
13% Wizard's Toolkit Secret Authentication Methods %
14% %
15% Software Design %
16% Cristy %
17% March 2003 %
18% %
19% %
20% Copyright @ 1999 ImageMagick Studio LLC, a non-profit organization %
21% dedicated to making software imaging solutions freely available. %
22% %
23% You may not use this file except in compliance with the License. You may %
24% obtain a copy of the License at %
25% %
26% https://imagemagick.org/script/license.php %
27% %
28% Unless required by applicable law or agreed to in writing, software %
29% distributed under the License is distributed on an "AS IS" BASIS, %
30% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
31% See the License for the specific language governing permissions and %
32% limitations under the License. %
33% %
34%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35%
36%
37%
38*/
39
40/*
41 Include declarations.
42*/
43#include "wizard/studio.h"
44#include "wizard/cipher.h"
45#include "wizard/exception.h"
47#include "wizard/hmac.h"
48#include "wizard/keyring.h"
49#include "wizard/memory_.h"
50#include "wizard/passphrase.h"
51#include "wizard/random_.h"
52#include "wizard/secret.h"
53
54/*
55 Define declarations.
56*/
57#define SecretKeyCipher AESCipher
58#define SecretKeyMode CTRMode
59#define SecretKeyHash SHA2256Hash
60#define SecretRandomHash SHA2256Hash
61
62/*
63 Typedef declarations.
64*/
66{
67 char
69
75
76 size_t
78
81
84
87
90
91 time_t
93
94 size_t
96};
97
98/*
99%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
100% %
101% %
102% %
103% A c q u i r e S e c r e t I n f o %
104% %
105% %
106% %
107%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
108%
109% AcquireSecretInfo() allocates the SecretInfo structure.
110%
111% The format of the AcquireSecretInfo method is:
112%
113% SecretInfo *AcquireSecretInfo(const char *path,const HashType hash,
114% const size_t key_length)
115%
116% A description of each parameter follows:
117%
118% o path: The secret keyring path.
119%
120% o hash: The hash type.
121%
122% o key_length: The key length in bits.
123*/
125 const size_t key_length)
126{
128 *secret_info;
129
130 secret_info=(SecretInfo *) AcquireWizardMemory(sizeof(*secret_info));
131 if (secret_info == (SecretInfo *) NULL)
133 (void) memset(secret_info,0,sizeof(*secret_info));
134 secret_info->key_length=key_length;
135 secret_info->keyring_info=AcquireKeyringInfo(path);
137 secret_info->nonce=GenerateCipherNonce(secret_info->cipher_info);
138 secret_info->hmac_info=AcquireHMACInfo(hash);
140 secret_info->timestamp=time((time_t *) NULL);
141 secret_info->signature=WizardSignature;
142 return(secret_info);
143}
144
145/*
146%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
147% %
148% %
149% %
150% A u t h e n t i c a t e S e c r e t K e y %
151% %
152% %
153% %
154%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
155%
156% AuthenticateSecretKey() returns WizardTrue if the caller is authenticated.
157%
158% The format of the AuthenticateSecretKey method is:
159%
160% void AuthenticateSecretKey(SecretInfo *secret_info,
161% ExceptionInfo *exception)
162%
163% A description of each parameter follows:
164%
165% o secret_info: The secret info.
166%
167% o exception: Return any errors or warnings in this structure.
168%
169*/
171 ExceptionInfo *exception)
172{
174 status;
175
177 *digest,
178 *phrase;
179
181 WizardAssert(AuthenticateDomain,secret_info != (SecretInfo *) NULL);
183 SetKeyringId(secret_info->keyring_info,secret_info->id);
184 status=ExportKeyringKey(secret_info->keyring_info,exception);
185 if (status == WizardFalse)
186 return(WizardFalse);
187 if (secret_info->passphrase == (char *) NULL)
188 phrase=GetPassphrase(exception);
189 else
190 phrase=FileToStringInfo(secret_info->passphrase,~0,exception);
191 if (phrase == (StringInfo *) NULL)
192 return(WizardFalse);
193 SetCipherKey(secret_info->cipher_info,phrase);
195 secret_info->keyring_info));
196 if (secret_info->key != (StringInfo *) NULL)
197 secret_info->key=DestroyStringInfo(secret_info->key);
198 secret_info->key=CloneStringInfo(GetKeyringKey(secret_info->keyring_info));
199 (void) DecipherCipher(secret_info->cipher_info,secret_info->key);
200 ConstructHMAC(secret_info->hmac_info,phrase,secret_info->key);
201 phrase=DestroyStringInfo(phrase);
202 digest=CloneStringInfo(GetHMACDigest(secret_info->hmac_info));
203 if (CompareStringInfo(secret_info->id,digest) != 0)
204 {
205 digest=DestroyStringInfo(digest);
206 return(WizardFalse);
207 }
208 digest=DestroyStringInfo(digest);
209 return(WizardTrue);
210}
211
212/*
213%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
214% %
215% %
216% %
217% D e s t r o y S e c r e t I n f o %
218% %
219% %
220% %
221%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
222%
223% DestroySecretInfo() zeros memory associated with the SecretInfo structure.
224%
225% The format of the DestroySecretInfo method is:
226%
227% SecretInfo *DestroySecretInfo(SecretInfo *secret_info)
228%
229% A description of each parameter follows:
230%
231% o secret_info: The secret info.
232%
233*/
235{
237 WizardAssert(AuthenticateDomain,secret_info != (SecretInfo *) NULL);
239 if (secret_info->random_info != (RandomInfo *) NULL)
240 secret_info->random_info=DestroyRandomInfo(secret_info->random_info);
241 if (secret_info->hmac_info != (HMACInfo *) NULL)
242 secret_info->hmac_info=DestroyHMACInfo(secret_info->hmac_info);
243 if (secret_info->cipher_info != (CipherInfo *) NULL)
244 secret_info->cipher_info=DestroyCipherInfo(secret_info->cipher_info);
245 if (secret_info->keyring_info != (KeyringInfo *) NULL)
246 secret_info->keyring_info=DestroyKeyringInfo(secret_info->keyring_info);
247 if (secret_info->nonce != (StringInfo *) NULL)
248 secret_info->nonce=DestroyStringInfo(secret_info->nonce);
249 if (secret_info->key != (StringInfo *) NULL)
250 secret_info->key=DestroyStringInfo(secret_info->key);
251 if (secret_info->id != (StringInfo *) NULL)
252 secret_info->id=DestroyStringInfo(secret_info->id);
253 if (secret_info->digest != (StringInfo *) NULL)
254 secret_info->digest=DestroyStringInfo(secret_info->digest);
255 secret_info->signature=(~WizardSignature);
256 secret_info=(SecretInfo *) RelinquishWizardMemory(secret_info);
257 return(secret_info);
258}
259
260/*
261%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
262% %
263% %
264% %
265% G e n e r a t e S e c r e t K e y %
266% %
267% %
268% %
269%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
270%
271% GenerateSecretKey() returns WizardTrue if a key is generated and successfully
272% added to the secret key ring.
273%
274% The format of the GenerateSecretKey method is:
275%
276% WizardBooleanType GenerateSecretKey(SecretInfo *secret_info,
277% ExceptionInfo *exception)
278%
279% A description of each parameter follows:
280%
281% o secret_info: The secret info.
282%
283% o exception: Return any errors or warnings in this structure.
284%
285*/
287 ExceptionInfo *exception)
288{
290 *sans;
291
293 status;
294
296 *key,
297 *phrase;
298
300 WizardAssert(AuthenticateDomain,secret_info != (SecretInfo *) NULL);
302 WizardAssert(AuthenticateDomain,exception != (ExceptionInfo *) NULL);
303 if (secret_info->passphrase == (char *) NULL)
304 phrase=GetPassphrase(exception);
305 else
306 phrase=FileToStringInfo(secret_info->passphrase,~0,exception);
307 if (phrase == (StringInfo *) NULL)
308 return(WizardFalse);
310 do
311 {
312 if (secret_info->key != (StringInfo *) NULL)
313 secret_info->key=DestroyStringInfo(secret_info->key);
314 secret_info->key=GetRandomKey(secret_info->random_info,
315 secret_info->key_length/8);
316 ConstructHMAC(secret_info->hmac_info,phrase,secret_info->key);
317 if (secret_info->id != (StringInfo *) NULL)
318 secret_info->id=DestroyStringInfo(secret_info->id);
319 secret_info->id=CloneStringInfo(GetHMACDigest(secret_info->hmac_info));
320 SetKeyringId(secret_info->keyring_info,secret_info->id);
321 status=ExportKeyringKey(secret_info->keyring_info,sans);
322 } while (status != WizardFalse);
323 sans=DestroyExceptionInfo(sans);
324 SetKeyringKey(secret_info->keyring_info,secret_info->key);
325 SetKeyringNonce(secret_info->keyring_info,secret_info->nonce);
326 SetCipherKey(secret_info->cipher_info,phrase);
328 secret_info->keyring_info));
329 key=CloneStringInfo(GetKeyringKey(secret_info->keyring_info));
330 (void) EncipherCipher(secret_info->cipher_info,key);
331 SetKeyringKey(secret_info->keyring_info,key);
332 status=ImportKeyringKey(secret_info->keyring_info,exception);
333 phrase=DestroyStringInfo(phrase);
334 key=DestroyStringInfo(key);
335 return(WizardTrue);
336}
337
338/*
339%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
340% %
341% %
342% %
343% G e t S e c r e t I d %
344% %
345% %
346% %
347%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
348%
349% GetSecretId() returns the secret id.
350%
351% The format of the GetSecretId method is:
352%
353% const StringInfo *GetSecretId(const SecretInfo *secret_info)
354%
355% A description of each parameter follows:
356%
357% o secret_info: The secret info.
358%
359*/
361{
363 WizardAssert(AuthenticateDomain,secret_info != (SecretInfo *) NULL);
365 return(secret_info->id);
366}
367
368/*
369%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
370% %
371% %
372% %
373% G e t S e c r e t K e y %
374% %
375% %
376% %
377%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
378%
379% GetSecretKey() returns the secret key.
380%
381% The format of the GetSecretKey method is:
382%
383% const StringInfo *GetSecretKey(const SecretInfo *secret_info)
384%
385% A description of each parameter follows:
386%
387% o secret_info: The secret info.
388%
389*/
391{
393 WizardAssert(AuthenticateDomain,secret_info != (SecretInfo *) NULL);
395 return(secret_info->key);
396}
397
398/*
399%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
400% %
401% %
402% %
403% G e t S e c r e t K e y L e n g t h %
404% %
405% %
406% %
407%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
408%
409% GetSecretKeyLength() returns the secret key length.
410%
411% The format of the GetSecretKeyLength method is:
412%
413% size_t GetSecretKeyLength(const SecretInfo *secret_info)
414%
415% A description of each parameter follows:
416%
417% o secret_info: The secret info.
418%
419*/
421{
423 WizardAssert(AuthenticateDomain,secret_info != (SecretInfo *) NULL);
425 return(secret_info->key_length);
426}
427
428/*
429%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
430% %
431% %
432% %
433% G e t S e c r e t P a s s p h r a s e %
434% %
435% %
436% %
437%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
438%
439% GetSecretPassphrase() returns the secret passphrase.
440%
441% The format of the GetSecretPassphrase method is:
442%
443% const char *GetSecretPassphrase(const SecretInfo *secret_info)
444%
445% A description of each parameter follows:
446%
447% o secret_info: The secret info.
448%
449*/
450WizardExport const char *GetSecretPassphrase(const SecretInfo *secret_info)
451{
453 WizardAssert(AuthenticateDomain,secret_info != (SecretInfo *) NULL);
455 return(secret_info->passphrase);
456}
457
458/*
459%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
460% %
461% %
462% %
463% S e t S e c r e t I d %
464% %
465% %
466% %
467%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
468%
469% SetSecretId() sets the secret id.
470%
471% The format of the SetSecretId method is:
472%
473% void SetSecretId(SecretInfo *secret_info,const StringInfo *id)
474%
475% A description of each parameter follows:
476%
477% o secret_info: The ring info.
478%
479% o id: The id.
480%
481*/
482WizardExport void SetSecretId(SecretInfo *secret_info,const StringInfo *id)
483{
484 if (secret_info->id != (StringInfo *) NULL)
485 secret_info->id=DestroyStringInfo(secret_info->id);
486 secret_info->id=CloneStringInfo(id);
487}
488
489/*
490%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
491% %
492% %
493% %
494% S e t S e c r e t K e y L e n g t h %
495% %
496% %
497% %
498%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
499%
500% SetSecretKeyLength() sets the authentication method key length.
501%
502% The format of the SetSecretKeyLength method is:
503%
504% void SetSecretKeyLength(SecretInfo *secret_info,
505% const size_t key_length)
506%
507% A description of each parameter follows:
508%
509% o secret_info: The secret info.
510%
511% o key_length: The key length in bits.
512%
513*/
515 const size_t key_length)
516{
518 WizardAssert(AuthenticateDomain,secret_info != (SecretInfo *) NULL);
520 secret_info->key_length=key_length;
521}
522
523/*
524%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
525% %
526% %
527% %
528% S e t S e c r e t P a s s p h r a s e %
529% %
530% %
531% %
532%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
533%
534% SetSecretPassphrase() sets the secret passphrase.
535%
536% The format of the SetSecretPassphrase method is:
537%
538% void SetSecretPassphrase(SecretInfo *secret_info,const char *passphrase)
539%
540% A description of each parameter follows:
541%
542% o secret_info: The secret info.
543%
544% o passphrase: The passphrase.
545%
546*/
548 const char *passphrase)
549{
550 if (secret_info->passphrase != (char *) NULL)
551 secret_info->passphrase=DestroyString(secret_info->passphrase);
552 secret_info->passphrase=ConstantString(passphrase);
553}
WizardExport CipherInfo * DestroyCipherInfo(CipherInfo *cipher_info)
Definition cipher.c:703
WizardExport void SetCipherNonce(CipherInfo *cipher_info, const StringInfo *nonce)
Definition cipher.c:1394
WizardExport void SetCipherKey(CipherInfo *cipher_info, const StringInfo *key)
Definition cipher.c:1429
WizardExport StringInfo * DecipherCipher(CipherInfo *cipher_info, StringInfo *ciphertext)
Definition cipher.c:405
WizardExport StringInfo * GenerateCipherNonce(CipherInfo *cipher_info)
Definition cipher.c:1278
WizardExport CipherInfo * AcquireCipherInfo(const CipherType cipher, const CipherMode mode)
Definition cipher.c:134
WizardExport StringInfo * EncipherCipher(CipherInfo *cipher_info, StringInfo *plaintext)
Definition cipher.c:946
#define WizardAssert(domain, predicate)
#define ThrowWizardFatalError(domain, error)
WizardExport ExceptionInfo * AcquireExceptionInfo(void)
Definition exception.c:125
WizardExport ExceptionInfo * DestroyExceptionInfo(ExceptionInfo *exception)
Definition exception.c:399
@ AuthenticateDomain
Definition exception.h:36
@ MemoryError
Definition exception.h:49
HashType
Definition hash.h:28
WizardExport void ConstructHMAC(HMACInfo *hmac_info, const StringInfo *key, const StringInfo *message)
Definition hmac.c:139
WizardExport HMACInfo * AcquireHMACInfo(const HashType hash)
Definition hmac.c:91
WizardExport const StringInfo * GetHMACDigest(const HMACInfo *hmac_info)
Definition hmac.c:250
WizardExport HMACInfo * DestroyHMACInfo(HMACInfo *hmac_info)
Definition hmac.c:174
WizardExport WizardBooleanType ImportKeyringKey(KeyringInfo *keyring_info, ExceptionInfo *exception)
Definition keyring.c:418
WizardExport const StringInfo * GetKeyringKey(const KeyringInfo *keyring_info)
Definition keyring.c:355
WizardExport void SetKeyringId(KeyringInfo *keyring_info, const StringInfo *id)
Definition keyring.c:752
WizardExport const StringInfo * GetKeyringNonce(const KeyringInfo *keyring_info)
Definition keyring.c:385
WizardExport WizardBooleanType ExportKeyringKey(KeyringInfo *keyring_info, ExceptionInfo *exception)
Definition keyring.c:195
WizardExport void SetKeyringKey(KeyringInfo *keyring_info, const StringInfo *key)
Definition keyring.c:785
WizardExport void SetKeyringNonce(KeyringInfo *keyring_info, const StringInfo *nonce)
Definition keyring.c:818
WizardExport KeyringInfo * DestroyKeyringInfo(KeyringInfo *keyring_info)
Definition keyring.c:152
WizardExport KeyringInfo * AcquireKeyringInfo(const char *path)
Definition keyring.c:108
WizardBooleanType LogWizardEvent(const LogEventType type, const char *module, const char *function, const size_t line, const char *format,...)
Definition log.c:1390
@ TraceEvent
Definition log.h:39
#define GetWizardModule()
Definition log.h:30
WizardExport void * AcquireWizardMemory(const size_t size)
Definition memory.c:586
WizardExport void * RelinquishWizardMemory(void *memory)
Definition memory.c:1039
#define WizardExport
#define WizardSignature
WizardExport StringInfo * GetPassphrase(ExceptionInfo *exception)
Definition passphrase.c:294
WizardExport RandomInfo * AcquireRandomInfo(const HashType hash)
Definition random.c:165
WizardExport StringInfo * GetRandomKey(RandomInfo *random_info, const size_t length)
Definition random.c:820
WizardExport RandomInfo * DestroyRandomInfo(RandomInfo *random_info)
Definition random.c:289
WizardExport void SetSecretId(SecretInfo *secret_info, const StringInfo *id)
Definition secret.c:482
#define SecretKeyMode
Definition secret.c:58
WizardExport WizardBooleanType AuthenticateSecretKey(SecretInfo *secret_info, ExceptionInfo *exception)
Definition secret.c:170
WizardExport SecretInfo * DestroySecretInfo(SecretInfo *secret_info)
Definition secret.c:234
WizardExport const StringInfo * GetSecretKey(const SecretInfo *secret_info)
Definition secret.c:390
WizardExport SecretInfo * AcquireSecretInfo(const char *path, const HashType hash, const size_t key_length)
Definition secret.c:124
WizardExport void SetSecretPassphrase(SecretInfo *secret_info, const char *passphrase)
Definition secret.c:547
WizardExport void SetSecretKeyLength(SecretInfo *secret_info, const size_t key_length)
Definition secret.c:514
#define SecretKeyCipher
Definition secret.c:57
WizardExport const StringInfo * GetSecretId(const SecretInfo *secret_info)
Definition secret.c:360
WizardExport const char * GetSecretPassphrase(const SecretInfo *secret_info)
Definition secret.c:450
WizardExport WizardBooleanType GenerateSecretKey(SecretInfo *secret_info, ExceptionInfo *exception)
Definition secret.c:286
#define SecretRandomHash
Definition secret.c:60
WizardExport size_t GetSecretKeyLength(const SecretInfo *secret_info)
Definition secret.c:420
WizardExport StringInfo * FileToStringInfo(const char *filename, const size_t extent, ExceptionInfo *exception)
Definition string.c:969
WizardExport char * DestroyString(char *string)
Definition string.c:830
WizardExport char * ConstantString(const char *source)
Definition string.c:655
WizardExport int CompareStringInfo(const StringInfo *target, const StringInfo *source)
Definition string.c:372
WizardExport StringInfo * CloneStringInfo(const StringInfo *string_info)
Definition string.c:332
WizardExport StringInfo * DestroyStringInfo(StringInfo *string_info)
Definition string.c:857
char * passphrase
Definition secret.c:68
StringInfo * digest
Definition secret.c:73
size_t signature
Definition secret.c:95
size_t key_length
Definition secret.c:77
RandomInfo * random_info
Definition secret.c:89
StringInfo * nonce
Definition secret.c:74
StringInfo * key
Definition secret.c:72
time_t timestamp
Definition secret.c:92
KeyringInfo * keyring_info
Definition secret.c:80
HMACInfo * hmac_info
Definition secret.c:86
StringInfo * id
Definition secret.c:71
CipherInfo * cipher_info
Definition secret.c:83
WizardBooleanType
Definition wizard-type.h:26
@ WizardTrue
Definition wizard-type.h:28
@ WizardFalse
Definition wizard-type.h:27