2 * Copyright 2013 Alexander Peslyak
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted.
8 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
9 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
10 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
11 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
12 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
13 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
14 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
15 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
16 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
17 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
21 #ifdef HAVE_SYS_MMAN_H
22 # include <sys/mman.h>
27 #include "crypto_scrypt.h"
30 #if !defined(MAP_ANON) && defined(MAP_ANONYMOUS)
31 # define MAP_ANON MAP_ANONYMOUS
35 alloc_region(escrypt_region_t
* region
, size_t size
)
37 uint8_t * base
, * aligned
;
38 #if defined(MAP_ANON) && defined(HAVE_MMAP)
39 if ((base
= (uint8_t *) mmap(NULL
, size
, PROT_READ
| PROT_WRITE
,
41 MAP_ANON
| MAP_PRIVATE
| MAP_NOCORE
,
43 MAP_ANON
| MAP_PRIVATE
,
45 -1, 0)) == MAP_FAILED
)
46 base
= NULL
; /* LCOV_EXCL_LINE */
48 #elif defined(HAVE_POSIX_MEMALIGN)
49 if ((errno
= posix_memalign((void **) &base
, 64, size
)) != 0)
53 base
= aligned
= NULL
;
56 else if ((base
= (uint8_t *) malloc(size
+ 63)) != NULL
) {
58 aligned
-= (uintptr_t)aligned
& 63;
62 region
->aligned
= aligned
;
63 region
->size
= base
? size
: 0;
68 init_region(escrypt_region_t
* region
)
70 region
->base
= region
->aligned
= NULL
;
75 free_region(escrypt_region_t
* region
)
78 #if defined(MAP_ANON) && defined(HAVE_MMAP)
79 if (munmap(region
->base
, region
->size
))
80 return -1; /* LCOV_EXCL_LINE */
90 escrypt_init_local(escrypt_local_t
* local
)
97 escrypt_free_local(escrypt_local_t
* local
)
99 return free_region(local
);