It doesn't make sense to try see if these variables are negative, since they're unsigned.
[openssl.git] / crypto / bio / bss_bio.c
1 /* crypto/bio/bss_bio.c  -*- Mode: C; c-file-style: "eay" -*- */
2
3 /* Special method for a BIO where the other endpoint is also a BIO
4  * of this kind, handled by the same thread (i.e. the "peer" is actually
5  * ourselves, wearing a different hat).
6  * Such "BIO pairs" are mainly for using the SSL library with I/O interfaces
7  * for which no specific BIO method is available.
8  * See ssl/ssltest.c for some hints on how this can be used. */
9
10 #ifndef BIO_PAIR_DEBUG
11 # undef NDEBUG /* avoid conflicting definitions */
12 # define NDEBUG
13 #endif
14
15 #include <assert.h>
16 #include <limits.h>
17 #include <stdlib.h>
18 #include <string.h>
19
20 #include <openssl/bio.h>
21 #include <openssl/err.h>
22 #include <openssl/crypto.h>
23
24 static int bio_new(BIO *bio);
25 static int bio_free(BIO *bio);
26 static int bio_read(BIO *bio, char *buf, int size);
27 static int bio_write(BIO *bio, char *buf, int num);
28 static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr);
29 static int bio_puts(BIO *bio, char *str);
30
31 static int bio_make_pair(BIO *bio1, BIO *bio2);
32 static void bio_destroy_pair(BIO *bio);
33
34 static BIO_METHOD methods_biop =
35 {
36         BIO_TYPE_BIO,
37         "BIO pair",
38         bio_write,
39         bio_read,
40         bio_puts,
41         NULL /* no bio_gets */,
42         bio_ctrl,
43         bio_new,
44         bio_free
45 };
46
47 BIO_METHOD *BIO_s_bio(void)
48         {
49         return &methods_biop;
50         }
51
52 struct bio_bio_st
53 {
54         BIO *peer;     /* NULL if buf == NULL.
55                         * If peer != NULL, then peer->ptr is also a bio_bio_st,
56                         * and its "peer" member points back to us.
57                         * peer != NULL iff init != 0 in the BIO. */
58         
59         /* This is for what we write (i.e. reading uses peer's struct): */
60         int closed;     /* valid iff peer != NULL */
61         size_t len;     /* valid iff buf != NULL; 0 if peer == NULL */
62         size_t offset;  /* valid iff buf != NULL; 0 if len == 0 */
63         size_t size;
64         char *buf;      /* "size" elements (if != NULL) */
65
66         size_t request; /* valid iff peer != NULL; 0 if len != 0,
67                          * otherwise set by peer to number of bytes
68                          * it (unsuccesfully) tried to read,
69                          * never more than buffer space (size-len) warrants. */
70 };
71
72 static int bio_new(BIO *bio)
73         {
74         struct bio_bio_st *b;
75         
76         b = Malloc(sizeof *b);
77         if (b == NULL)
78                 return 0;
79
80         b->peer = NULL;
81         b->size = 17*1024; /* enough for one TLS record (just a default) */
82         b->buf = NULL;
83
84         bio->ptr = b;
85         return 1;
86         }
87
88
89 static int bio_free(BIO *bio)
90         {
91         struct bio_bio_st *b;
92
93         if (bio == NULL)
94                 return 0;
95         b = bio->ptr;
96
97         assert(b != NULL);
98
99         if (b->peer)
100                 bio_destroy_pair(bio);
101         
102         if (b->buf != NULL)
103                 {
104                 Free(b->buf);
105                 }
106
107         Free(b);
108
109         return 1;
110         }
111
112
113
114 static int bio_read(BIO *bio, char *buf, int size_)
115         {
116         size_t size = size_;
117         size_t rest;
118         struct bio_bio_st *b, *peer_b;
119
120         BIO_clear_retry_flags(bio);
121
122         if (!bio->init)
123                 return 0;
124
125         b = bio->ptr;
126         assert(b != NULL);
127         assert(b->peer != NULL);
128         peer_b = b->peer->ptr;
129         assert(peer_b != NULL);
130         assert(peer_b->buf != NULL);
131
132         peer_b->request = 0; /* will be set in "retry_read" situation */
133
134         if (buf == NULL || size == 0)
135                 return 0;
136
137         if (peer_b->len == 0)
138                 {
139                 if (peer_b->closed)
140                         return 0; /* writer has closed, and no data is left */
141                 else
142                         {
143                         BIO_set_retry_read(bio); /* buffer is empty */
144                         if (size <= peer_b->size)
145                                 peer_b->request = size;
146                         else
147                                 /* don't ask for more than the peer can
148                                  * deliver in one write */
149                                 peer_b->request = peer_b->size;
150                         return -1;
151                         }
152                 }
153
154         /* we can read */
155         if (peer_b->len < size)
156                 size = peer_b->len;
157
158         /* now read "size" bytes */
159         
160         rest = size;
161         
162         assert(rest > 0);
163         do /* one or two iterations */
164                 {
165                 size_t chunk;
166                 
167                 assert(rest <= peer_b->len);
168                 if (peer_b->offset + rest <= peer_b->size)
169                         chunk = rest;
170                 else
171                         /* wrap around ring buffer */
172                         chunk = peer_b->size - peer_b->offset;
173                 assert(peer_b->offset + chunk <= peer_b->size);
174                 
175                 memcpy(buf, peer_b->buf + peer_b->offset, chunk);
176                 
177                 peer_b->len -= chunk;
178                 if (peer_b->len)
179                         {
180                         peer_b->offset += chunk;
181                         assert(peer_b->offset <= peer_b->size);
182                         if (peer_b->offset == peer_b->size)
183                                 peer_b->offset = 0;
184                         buf += chunk;
185                         }
186                 else
187                         {
188                         /* buffer now empty, no need to advance "buf" */
189                         assert(chunk == rest);
190                         peer_b->offset = 0;
191                         }
192                 rest -= chunk;
193                 }
194         while (rest);
195         
196         return size;
197         }
198
199 /* non-copying interface: provide pointer to available data in buffer
200  *    bio_nread0:  return number of available bytes
201  *    bio_nread:   also advance index
202  * (example usage:  bio_nread0(), read from buffer, bio_nread()
203  *  or just         bio_nread(), read from buffer)
204  */
205 /* WARNING: The non-copying interface is largely untested as of yet
206  * and may contain bugs. */
207 static size_t bio_nread0(BIO *bio, char **buf)
208         {
209         struct bio_bio_st *b, *peer_b;
210         size_t num;
211         
212         BIO_clear_retry_flags(bio);
213
214         if (!bio->init)
215                 return 0;
216         
217         b = bio->ptr;
218         assert(b != NULL);
219         assert(b->peer != NULL);
220         peer_b = b->peer->ptr;
221         assert(peer_b != NULL);
222         assert(peer_b->buf != NULL);
223         
224         peer_b->request = 0;
225         
226         if (peer_b->len == 0)
227                 {
228                 char dummy;
229                 
230                 /* avoid code duplication -- nothing available for reading */
231                 return bio_read(bio, &dummy, 1); /* returns 0 or -1 */
232                 }
233
234         num = peer_b->len;
235         if (peer_b->size < peer_b->offset + num)
236                 /* no ring buffer wrap-around for non-copying interface */
237                 num = peer_b->size - peer_b->offset;
238         assert(num > 0);
239
240         if (buf != NULL)
241                 *buf = peer_b->buf + peer_b->offset;
242         return num;
243         }
244
245 static size_t bio_nread(BIO *bio, char **buf, size_t num)
246         {
247         struct bio_bio_st *b, *peer_b;
248         size_t available;
249
250         available = bio_nread0(bio, buf);
251         if (num > available)
252                 num = available;
253         if (num == 0)
254                 return num;
255
256         b = bio->ptr;
257         peer_b = b->peer->ptr;
258
259         peer_b->len -= num;
260         if (peer_b->len) 
261                 {
262                 peer_b->offset += num;
263                 assert(peer_b->offset <= peer_b->size);
264                 if (peer_b->offset == peer_b->size)
265                         peer_b->offset = 0;
266                 }
267         else
268                 peer_b->offset = 0;
269
270         return num;
271         }
272
273
274 static int bio_write(BIO *bio, char *buf, int num_)
275         {
276         size_t num = num_;
277         size_t rest;
278         struct bio_bio_st *b;
279
280         BIO_clear_retry_flags(bio);
281
282         if (!bio->init || buf == NULL || num == 0)
283                 return 0;
284
285         b = bio->ptr;           
286         assert(b != NULL);
287         assert(b->peer != NULL);
288         assert(b->buf != NULL);
289
290         b->request = 0;
291         if (b->closed)
292                 {
293                 /* we already closed */
294                 BIOerr(BIO_F_BIO_WRITE, BIO_R_BROKEN_PIPE);
295                 return -1;
296                 }
297
298         assert(b->len <= b->size);
299
300         if (b->len == b->size)
301                 {
302                 BIO_set_retry_write(bio); /* buffer is full */
303                 return -1;
304                 }
305
306         /* we can write */
307         if (num > b->size - b->len)
308                 num = b->size - b->len;
309         
310         /* now write "num" bytes */
311
312         rest = num;
313         
314         assert(rest > 0);
315         do /* one or two iterations */
316                 {
317                 size_t write_offset;
318                 size_t chunk;
319
320                 assert(b->len + rest <= b->size);
321
322                 write_offset = b->offset + b->len;
323                 if (write_offset >= b->size)
324                         write_offset -= b->size;
325                 /* b->buf[write_offset] is the first byte we can write to. */
326
327                 if (write_offset + rest <= b->size)
328                         chunk = rest;
329                 else
330                         /* wrap around ring buffer */
331                         chunk = b->size - write_offset;
332                 
333                 memcpy(b->buf + write_offset, buf, chunk);
334                 
335                 b->len += chunk;
336
337                 assert(b->len <= b->size);
338                 
339                 rest -= chunk;
340                 buf += chunk;
341                 }
342         while (rest);
343
344         return num;
345         }
346
347 /* non-copying interface: provide pointer to region to write to
348  *   bio_nwrite0:  check how much space is available
349  *   bio_nwrite:   also increase length
350  * (example usage:  bio_nwrite0(), write to buffer, bio_nwrite()
351  *  or just         bio_nwrite(), write to buffer)
352  */
353 static size_t bio_nwrite0(BIO *bio, char **buf)
354         {
355         struct bio_bio_st *b;
356         size_t num;
357         size_t write_offset;
358
359         BIO_clear_retry_flags(bio);
360
361         if (!bio->init)
362                 return 0;
363
364         b = bio->ptr;           
365         assert(b != NULL);
366         assert(b->peer != NULL);
367         assert(b->buf != NULL);
368
369         b->request = 0;
370         if (b->closed)
371                 {
372                 BIOerr(BIO_F_BIO_NWRITE0, BIO_R_BROKEN_PIPE);
373                 return -1;
374                 }
375
376         assert(b->len <= b->size);
377
378         if (b->len == b->size)
379                 {
380                 BIO_set_retry_write(bio);
381                 return -1;
382                 }
383
384         num = b->size - b->len;
385         write_offset = b->offset + b->len;
386         if (write_offset >= b->size)
387                 write_offset -= b->size;
388         if (write_offset + num > b->size)
389                 /* no ring buffer wrap-around for non-copying interface
390                  * (to fulfil the promise by BIO_ctrl_get_write_guarantee,
391                  * BIO_nwrite may have to be called twice) */
392                 num = b->size - write_offset;
393
394         if (buf != NULL)
395                 *buf = b->buf + write_offset;
396         assert(write_offset + num <= b->size);
397
398         return num;
399         }
400
401 static size_t bio_nwrite(BIO *bio, char **buf, size_t num)
402         {
403         struct bio_bio_st *b;
404         size_t space;
405
406         space = bio_nwrite0(bio, buf);
407         if (num > space)
408                 num = space;
409         if (num == 0)
410                 return num;
411         b = bio->ptr;
412         assert(b != NULL);
413         b->len += num;
414         assert(b->len <= b->size);
415
416         return num;
417         }
418
419
420 static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
421         {
422         long ret;
423         struct bio_bio_st *b = bio->ptr;
424         
425         assert(b != NULL);
426
427         switch (cmd)
428                 {
429         /* specific CTRL codes */
430
431         case BIO_C_SET_WRITE_BUF_SIZE:
432                 if (b->peer)
433                         {
434                         BIOerr(BIO_F_BIO_CTRL, BIO_R_IN_USE);
435                         ret = 0;
436                         }
437                 else if (num == 0)
438                         {
439                         BIOerr(BIO_F_BIO_CTRL, BIO_R_INVALID_ARGUMENT);
440                         ret = 0;
441                         }
442                 else
443                         {
444                         size_t new_size = num;
445
446                         if (b->size != new_size)
447                                 {
448                                 if (b->buf) 
449                                         {
450                                         Free(b->buf);
451                                         b->buf = NULL;
452                                         }
453                                 b->size = new_size;
454                                 }
455                         ret = 1;
456                         }
457                 break;
458
459         case BIO_C_GET_WRITE_BUF_SIZE:
460                 num = (long) b->size;
461
462         case BIO_C_MAKE_BIO_PAIR:
463                 {
464                 BIO *other_bio = ptr;
465                 
466                 if (bio_make_pair(bio, other_bio))
467                         ret = 1;
468                 else
469                         ret = 0;
470                 }
471                 break;
472                 
473         case BIO_C_DESTROY_BIO_PAIR:
474                 /* Effects both BIOs in the pair -- call just once!
475                  * Or let BIO_free(bio1); BIO_free(bio2); do the job. */
476                 bio_destroy_pair(bio);
477                 ret = 1;
478                 break;
479
480         case BIO_C_GET_WRITE_GUARANTEE:
481                 /* How many bytes can the caller feed to the next write
482                  * withouth having to keep any? */
483                 if (b->peer == NULL || b->closed)
484                         ret = 0;
485                 else
486                         ret = (long) b->size - b->len;
487                 break;
488
489         case BIO_C_GET_READ_REQUEST:
490                 /* If the peer unsuccesfully tried to read, how many bytes
491                  * were requested?  (As with BIO_CTRL_PENDING, that number
492                  * can usually be treated as boolean.) */
493                 ret = (long) b->request;
494                 break;
495
496         case BIO_C_RESET_READ_REQUEST:
497                 /* Reset request.  (Can be useful after read attempts
498                  * at the other side that are meant to be non-blocking,
499                  * e.g. when probing SSL_read to see if any data is
500                  * available.) */
501                 b->request = 0;
502                 ret = 1;
503                 break;
504
505         case BIO_C_SHUTDOWN_WR:
506                 /* similar to shutdown(..., SHUT_WR) */
507                 b->closed = 1;
508                 ret = 1;
509                 break;
510
511         case BIO_C_NREAD:
512                 /* non-copying read */
513                 ret = (long) bio_nread(bio, ptr, (size_t) num);
514                 break;
515                 
516         case BIO_C_NWRITE0:
517                 /* prepare for non-copying write */
518                 ret = (long) bio_nwrite0(bio, ptr);
519                 break;
520
521         case BIO_C_NWRITE:
522                 /* non-copying write */
523                 ret = (long) bio_nwrite(bio, ptr, (size_t) num);
524                 break;
525                 
526
527         /* standard CTRL codes follow */
528
529         case BIO_CTRL_RESET:
530                 if (b->buf != NULL)
531                         {
532                         b->len = 0;
533                         b->offset = 0;
534                         }
535                 ret = 0;
536                 break;          
537
538         case BIO_CTRL_GET_CLOSE:
539                 ret = bio->shutdown;
540                 break;
541
542         case BIO_CTRL_SET_CLOSE:
543                 bio->shutdown = (int) num;
544                 ret = 1;
545                 break;
546
547         case BIO_CTRL_PENDING:
548                 if (b->peer != NULL)
549                         {
550                         struct bio_bio_st *peer_b = b->peer->ptr;
551                         
552                         ret = (long) peer_b->len;
553                         }
554                 else
555                         ret = 0;
556                 break;
557
558         case BIO_CTRL_WPENDING:
559                 if (b->buf != NULL)
560                         ret = (long) b->len;
561                 else
562                         ret = 0;
563                 break;
564
565         case BIO_CTRL_DUP:
566                 /* See BIO_dup_chain for circumstances we have to expect. */
567                 {
568                 BIO *other_bio = ptr;
569                 struct bio_bio_st *other_b;
570                 
571                 assert(other_bio != NULL);
572                 other_b = other_bio->ptr;
573                 assert(other_b != NULL);
574                 
575                 assert(other_b->buf == NULL); /* other_bio is always fresh */
576
577                 other_b->size = b->size;
578                 }
579
580                 ret = 1;
581                 break;
582
583         case BIO_CTRL_FLUSH:
584                 ret = 1;
585                 break;
586
587         case BIO_CTRL_EOF:
588                 {
589                 BIO *other_bio = ptr;
590                 
591                 if (other_bio)
592                         {
593                         struct bio_bio_st *other_b = other_bio->ptr;
594                         
595                         assert(other_b != NULL);
596                         ret = other_b->len == 0 && other_b->closed;
597                         }
598                 else
599                         ret = 1;
600                 }
601                 break;
602
603         default:
604                 ret = 0;
605                 }
606         return ret;
607         }
608
609 static int bio_puts(BIO *bio, char *str)
610         {
611         return bio_write(bio, str, strlen(str));
612         }
613
614
615 static int bio_make_pair(BIO *bio1, BIO *bio2)
616         {
617         struct bio_bio_st *b1, *b2;
618
619         assert(bio1 != NULL);
620         assert(bio2 != NULL);
621
622         b1 = bio1->ptr;
623         b2 = bio2->ptr;
624         
625         if (b1->peer != NULL || b2->peer != NULL)
626                 {
627                 BIOerr(BIO_F_BIO_MAKE_PAIR, BIO_R_IN_USE);
628                 return 0;
629                 }
630         
631         if (b1->buf == NULL)
632                 {
633                 b1->buf = Malloc(b1->size);
634                 if (b1->buf == NULL)
635                         {
636                         BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE);
637                         return 0;
638                         }
639                 b1->len = 0;
640                 b1->offset = 0;
641                 }
642         
643         if (b2->buf == NULL)
644                 {
645                 b2->buf = Malloc(b2->size);
646                 if (b2->buf == NULL)
647                         {
648                         BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE);
649                         return 0;
650                         }
651                 b2->len = 0;
652                 b2->offset = 0;
653                 }
654         
655         b1->peer = bio2;
656         b1->closed = 0;
657         b1->request = 0;
658         b2->peer = bio1;
659         b2->closed = 0;
660         b2->request = 0;
661
662         bio1->init = 1;
663         bio2->init = 1;
664
665         return 1;
666         }
667
668 static void bio_destroy_pair(BIO *bio)
669         {
670         struct bio_bio_st *b = bio->ptr;
671
672         if (b != NULL)
673                 {
674                 BIO *peer_bio = b->peer;
675
676                 if (peer_bio != NULL)
677                         {
678                         struct bio_bio_st *peer_b = peer_bio->ptr;
679
680                         assert(peer_b != NULL);
681                         assert(peer_b->peer == bio);
682
683                         peer_b->peer = NULL;
684                         peer_bio->init = 0;
685                         assert(peer_b->buf != NULL);
686                         peer_b->len = 0;
687                         peer_b->offset = 0;
688                         
689                         b->peer = NULL;
690                         bio->init = 0;
691                         assert(b->buf != NULL);
692                         b->len = 0;
693                         b->offset = 0;
694                         }
695                 }
696         }
697  
698
699 /* Exported convenience functions */
700 int BIO_new_bio_pair(BIO **bio1_p, size_t writebuf1,
701         BIO **bio2_p, size_t writebuf2)
702          {
703          BIO *bio1 = NULL, *bio2 = NULL;
704          long r;
705          int ret = 0;
706
707          bio1 = BIO_new(BIO_s_bio());
708          if (bio1 == NULL)
709                  goto err;
710          bio2 = BIO_new(BIO_s_bio());
711          if (bio2 == NULL)
712                  goto err;
713
714          if (writebuf1)
715                  {
716                  r = BIO_set_write_buf_size(bio1, writebuf1);
717                  if (!r)
718                          goto err;
719                  }
720          if (writebuf2)
721                  {
722                  r = BIO_set_write_buf_size(bio2, writebuf2);
723                  if (!r)
724                          goto err;
725                  }
726
727          r = BIO_make_bio_pair(bio1, bio2);
728          if (!r)
729                  goto err;
730          ret = 1;
731
732  err:
733          if (ret == 0)
734                  {
735                  if (bio1)
736                          {
737                          BIO_free(bio1);
738                          bio1 = NULL;
739                          }
740                  if (bio2)
741                          {
742                          BIO_free(bio2);
743                          bio2 = NULL;
744                          }
745                  }
746
747          *bio1_p = bio1;
748          *bio2_p = bio2;
749          return ret;
750          }
751
752 size_t BIO_ctrl_get_write_guarantee(BIO *bio)
753         {
754         return BIO_ctrl(bio, BIO_C_GET_WRITE_GUARANTEE, 0, NULL);
755         }
756
757 size_t BIO_ctrl_get_read_request(BIO *bio)
758         {
759         return BIO_ctrl(bio, BIO_C_GET_READ_REQUEST, 0, NULL);
760         }
761
762 int BIO_ctrl_reset_read_request(BIO *bio)
763         {
764         return (BIO_ctrl(bio, BIO_C_RESET_READ_REQUEST, 0, NULL) != 0);
765         }
766
767
768 /* BIO_nread0/nread/nwrite0/nwrite are availabe only for BIO pairs for now
769  * (conceivably some other BIOs could allow non-copying reads and writes too.)
770  */
771 int BIO_nread0(BIO *bio, char **buf)
772         {
773         long ret;
774
775         if (!bio->init)
776                 {
777                 BIOerr(BIO_F_BIO_NREAD0, BIO_R_UNINITIALIZED);
778                 return -2;
779                 }
780
781         ret = BIO_ctrl(bio, BIO_C_NREAD0, 0, buf);
782         if (ret > INT_MAX)
783                 return INT_MAX;
784         else
785                 return (int) ret;
786         }
787
788 int BIO_nread(BIO *bio, char **buf, int num)
789         {
790         int ret;
791
792         if (!bio->init)
793                 {
794                 BIOerr(BIO_F_BIO_NREAD, BIO_R_UNINITIALIZED);
795                 return -2;
796                 }
797
798         ret = (int) BIO_ctrl(bio, BIO_C_NREAD, num, buf);
799         if (ret > 0)
800                 bio->num_read += ret;
801         return ret;
802         }
803
804 int BIO_nwrite0(BIO *bio, char **buf)
805         {
806         long ret;
807
808         if (!bio->init)
809                 {
810                 BIOerr(BIO_F_BIO_NWRITE0, BIO_R_UNINITIALIZED);
811                 return -2;
812                 }
813
814         ret = BIO_ctrl(bio, BIO_C_NWRITE0, 0, buf);
815         if (ret > INT_MAX)
816                 return INT_MAX;
817         else
818                 return (int) ret;
819         }
820
821 int BIO_nwrite(BIO *bio, char **buf, int num)
822         {
823         int ret;
824
825         if (!bio->init)
826                 {
827                 BIOerr(BIO_F_BIO_NWRITE, BIO_R_UNINITIALIZED);
828                 return -2;
829                 }
830
831         ret = BIO_ctrl(bio, BIO_C_NWRITE, num, buf);
832         if (ret > 0)
833                 bio->num_read += ret;
834         return ret;
835         }