summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/acss/acss_enc.c
diff options
context:
space:
mode:
authorhshoexer <>2004-02-13 10:05:44 +0000
committerhshoexer <>2004-02-13 10:05:44 +0000
commit1617c4271e2064de608b1d25e4d8b49ea0b00007 (patch)
tree43b0daa1c67f3741165f9daf7852ed118370b9ba /src/lib/libcrypto/acss/acss_enc.c
parent890ac6c07f8f31aa4c90f8eb9b5c2eab59c8c7e6 (diff)
downloadopenbsd-1617c4271e2064de608b1d25e4d8b49ea0b00007.tar.gz
openbsd-1617c4271e2064de608b1d25e4d8b49ea0b00007.tar.bz2
openbsd-1617c4271e2064de608b1d25e4d8b49ea0b00007.zip
Cleanup and shrink ACSS_KEY a bit. Thus crank library minor.
Change cipher modes to more generic names and add an additional mode. ok deraadt@ markus@
Diffstat (limited to 'src/lib/libcrypto/acss/acss_enc.c')
-rw-r--r--src/lib/libcrypto/acss/acss_enc.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/src/lib/libcrypto/acss/acss_enc.c b/src/lib/libcrypto/acss/acss_enc.c
index 9278af3578..829830bc54 100644
--- a/src/lib/libcrypto/acss/acss_enc.c
+++ b/src/lib/libcrypto/acss/acss_enc.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: acss_enc.c,v 1.3 2004/01/23 19:23:33 hshoexer Exp $ */ 1/* $OpenBSD: acss_enc.c,v 1.4 2004/02/13 10:05:44 hshoexer Exp $ */
2/* 2/*
3 * Copyright (c) 2004 The OpenBSD project 3 * Copyright (c) 2004 The OpenBSD project
4 * 4 *
@@ -95,7 +95,7 @@ static unsigned char sboxenc[] = {
95 * lfsr17: polynomial of degree 17, primitive modulo 2 (listed in Schneier) 95 * lfsr17: polynomial of degree 17, primitive modulo 2 (listed in Schneier)
96 * x^15 + x + 1 96 * x^15 + x + 1
97 * lfsr25: polynomial of degree 25, not know if primitive modulo 2 97 * lfsr25: polynomial of degree 25, not know if primitive modulo 2
98 * x^13 + x^5 + x^4 + x^1 + 1 98 * x^13 + x^5 + x^4 + x + 1
99 * 99 *
100 * Output bits are discarded, instead the feedback bits are added to produce 100 * Output bits are discarded, instead the feedback bits are added to produce
101 * the cipher stream. Depending on the mode, feedback bytes may be inverted 101 * the cipher stream. Depending on the mode, feedback bytes may be inverted
@@ -145,24 +145,30 @@ acss(ACSS_KEY *key, unsigned long len, const unsigned char *in,
145 145
146 /* addition */ 146 /* addition */
147 switch (key->mode) { 147 switch (key->mode) {
148 case ACSS_SESSIONKEY: 148 case ACSS_MODE3:
149 key->lfsrsum = key->lfsr17 >> 9; 149 key->lfsrsum = 0xff & ~(key->lfsr17 >> 9);
150 key->lfsrsum += key->lfsr25 >> 17; 150 key->lfsrsum += 0xff & ~(key->lfsr25 >> 17);
151 break; 151 break;
152 case ACSS_TITLEKEY: 152 case ACSS_MODE2:
153 key->lfsrsum = key->lfsr17 >> 9; 153 key->lfsrsum = key->lfsr17 >> 9;
154 key->lfsrsum += 0xff & ~(key->lfsr25 >> 17); 154 key->lfsrsum += 0xff & ~(key->lfsr25 >> 17);
155 break; 155 break;
156 case ACSS_AUTHENTICATE: 156 case ACSS_MODE1:
157 case ACSS_DATA:
158 default:
159 key->lfsrsum = 0xff & ~(key->lfsr17 >> 9); 157 key->lfsrsum = 0xff & ~(key->lfsr17 >> 9);
160 key->lfsrsum += key->lfsr25 >> 17; 158 key->lfsrsum += key->lfsr25 >> 17;
161 break; 159 break;
160 case ACSS_MODE0:
161 default:
162 key->lfsrsum = key->lfsr17 >> 9;
163 key->lfsrsum += key->lfsr25 >> 17;
164 break;
162 } 165 }
163 key->lfsrsum += (lfsrsumtmp >> 8); 166 key->lfsrsum += (lfsrsumtmp >> 8);
164 167
165 if (key->encrypt) { 168 if (in == (unsigned char *)0)
169 /* generate only a keystream */
170 out[i] = key->lfsrsum & 0xff;
171 else if (key->encrypt) {
166 out[i] = sboxenc[(in[i] ^ key->lfsrsum) & 0xff]; 172 out[i] = sboxenc[(in[i] ^ key->lfsrsum) & 0xff];
167 } else { 173 } else {
168 out[i] = (sboxdec[in[i]] ^ key->lfsrsum) & 0xff; 174 out[i] = (sboxdec[in[i]] ^ key->lfsrsum) & 0xff;