3 * Cryptographic challenges
5 * (c) 2005 Straylight/Edgeware
8 /*----- Licensing notice --------------------------------------------------*
10 * This file is part of Trivial IP Encryption (TrIPE).
12 * TrIPE is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
17 * TrIPE is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with TrIPE; if not, write to the Free Software Foundation,
24 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27 /*----- Header files ------------------------------------------------------*/
31 /*----- Static variables --------------------------------------------------*/
33 static bulkchal *bulk;
37 /*----- Main code ---------------------------------------------------------*/
39 /* --- @c_genkey@ --- *
45 * Use: Generates a new challenge key.
48 static void c_genkey(void)
50 if (bulk && bulk->ops == master->algs.bulk->ops && oseq < 0x07ffffff)
52 if (bulk) bulk->ops->freechal(bulk);
53 bulk = master->algs.bulk->ops->genchal(master->algs.bulk);
54 bulk->ops = master->algs.bulk->ops;
61 * Arguments: @buf *b@ = where to put the challenge
63 * Returns: Zero if OK, nonzero on error.
65 * Use: Issues a new challenge.
74 if (buf_putu32(b, oseq++) || !buf_get(b, bulk->tagsz)) return (-1);
75 if (bulk->ops->chaltag(bulk, p, 4, p + 4)) return (-1);
77 trace(T_CHAL, "chal: issuing challenge %lu", (unsigned long)(oseq - 1));
78 trace_block(T_CRYPTO, "chal: challenge block", p, BCUR(b) - p);
83 /* --- @c_check@ --- *
85 * Arguments: @buf *b@ = where to find the challenge
87 * Returns: Zero if OK, nonzero if it didn't work.
89 * Use: Checks a challenge. On failure, the buffer is broken.
99 a_warn("CHAL", "impossible-challenge", A_END);
102 sz = 4 + bulk->tagsz;
103 if ((p = buf_get(b, sz)) == 0) {
104 a_warn("CHAL", "invalid-challenge", A_END);
107 IF_TRACING(T_CHAL, trace_block(T_CRYPTO, "chal: check challenge", p, sz); )
108 if (bulk->ops->chalvrf(bulk, p, 4, p + 4)) {
109 a_warn("CHAL", "incorrect-tag", A_END);
113 if (seq_check(&iseq, seq, "CHAL"))
115 T( trace(T_CHAL, "chal: checked challenge %lu", (unsigned long)seq); )
123 /*----- That's all, folks -------------------------------------------------*/