@@ -27,9 +27,21 @@ $ffi->attach('sodium_library_version_major' => [] => 'int');
27
27
$ffi -> attach(' sodium_library_version_minor' => [] => ' int' );
28
28
29
29
our %function = (
30
+ # void
31
+ # sodium_add(unsigned char *a, const unsigned char *b, const size_t len)
32
+ ' sodium_add' => [
33
+ [' string' , ' string' , ' size_t' ] => ' void' ,
34
+ sub {
35
+ my ($xsub , $bin_string1 , $bin_string2 , $len ) = @_ ;
36
+ return unless $bin_string1 && $bin_string2 ;
37
+ $len //= length ($bin_string1 );
38
+ $xsub -> ($bin_string1 , $bin_string2 , $len );
39
+ }
40
+ ],
41
+
30
42
# char *
31
43
# sodium_bin2hex(char *const hex, const size_t hex_maxlen,
32
- # const unsigned char *const bin, const size_t bin_len)
44
+ # const unsigned char *const bin, const size_t bin_len)
33
45
' sodium_bin2hex' => [
34
46
[' string' , ' size_t' , ' string' , ' size_t' ] => ' string' ,
35
47
sub {
@@ -44,7 +56,8 @@ our %function = (
44
56
}
45
57
],
46
58
47
- # int sodium_hex2bin(
59
+ # int
60
+ # sodium_hex2bin(
48
61
# unsigned char *const bin, const size_t bin_maxlen,
49
62
# const char *const hex, const size_t hex_len,
50
63
# const char *const ignore, size_t *const bin_len, const char **const hex_end)
@@ -76,15 +89,116 @@ our %function = (
76
89
return substr ($buffer , 0, $bin_len );
77
90
}
78
91
],
92
+
93
+ # void
94
+ # sodium_increment(unsigned char *n, const size_t nlen)
95
+ ' sodium_increment' => [
96
+ [' string' , ' size_t' ] => ' void' ,
97
+ sub {
98
+ my ($xsub , $bin_string , $len ) = @_ ;
99
+ return unless $bin_string ;
100
+ $len //= length ($bin_string );
101
+ $xsub -> ($bin_string , $len );
102
+ }
103
+ ],
104
+
79
105
);
80
106
81
107
our %maybe_function = (
108
+ # int
109
+ # sodium_compare(const unsigned char *b1_,
110
+ # const unsigned char *b2_, size_t len)
111
+ ' sodium_compare' => {
112
+ added => [1,0,4],
113
+ ffi => [
114
+ [' string' , ' string' , ' size_t' ] => ' int' ,
115
+ sub {
116
+ my ($xsub , $bin_string1 , $bin_string2 , $len ) = @_ ;
117
+ return unless $bin_string1 && $bin_string2 ;
118
+ $len //= length ($bin_string1 );
119
+ my $int = $xsub -> ($bin_string1 , $bin_string2 , $len );
120
+ return $int ;
121
+ }
122
+ ],
123
+ fallback => sub { croak(" sodium_compare not implemented until libsodium v1.0.4" ); },
124
+ },
125
+
126
+ # int
127
+ # sodium_library_minimal(void)
82
128
' sodium_library_minimal' => {
83
129
added => [1,0,12],
84
- # uint64_t uv_get_constrained_memory(void)
85
130
ffi => [[], ' int' ],
86
131
fallback => sub { croak(" sodium_library_minimal not implemented until libsodium v1.0.12" ); },
87
132
},
133
+
134
+ # int
135
+ # sodium_pad(size_t *padded_buflen_p, unsigned char *buf,
136
+ # size_t unpadded_buflen, size_t blocksize, size_t max_buflen)
137
+ ' sodium_pad' => {
138
+ added => [1,0,14],
139
+ ffi => [
140
+ [' size_t' , ' string' , ' size_t' , ' size_t' , ' size_t' ] => ' int' ,
141
+ sub {
142
+ my ($xsub , $unpadded , $block_size ) = @_ ;
143
+ my $SIZE_MAX = Sodium::FFI::SIZE_MAX;
144
+ my $unpadded_len = length ($unpadded );
145
+ $block_size //= 16;
146
+ $block_size = 16 if $block_size < 0;
147
+
148
+ my $xpadlen = $block_size - 1;
149
+ if (($block_size & ($block_size - 1)) == 0) {
150
+ $xpadlen -= $unpadded_len & ($block_size - 1);
151
+ } else {
152
+ $xpadlen -= $unpadded_len % $block_size ;
153
+ }
154
+ if ($SIZE_MAX - $unpadded_len <= $xpadlen ) {
155
+ croak(" Input is too large." );
156
+ }
157
+
158
+ my $xpadded_len = $unpadded_len + $xpadlen ;
159
+ my $padded = " \0 " x ($xpadded_len + 1);
160
+ if ($unpadded_len > 0) {
161
+ my $st = 1;
162
+ my $i = 0;
163
+ my $k = $unpadded_len ;
164
+ for my $j (0..$xpadded_len ) {
165
+ substr ($padded , $j , 1) = substr ($unpadded , $i , 1);
166
+ $k -= $st ;
167
+ $st = (~((((($k >> 48) | ($k >> 32) | ($k >> 16) | $k ) & 0xffff) - 1) >> 16)) & 1;
168
+ $i += $st ;
169
+ }
170
+ }
171
+ my $int = $xsub -> (undef , $padded , $unpadded_len , $block_size , $xpadded_len + 1);
172
+ return $padded ;
173
+ }
174
+ ],
175
+ fallback => sub { croak(" sodium_pad not implemented until libsodium v1.0.14" ); },
176
+ },
177
+
178
+ # int
179
+ # sodium_unpad(size_t *unpadded_buflen_p, const unsigned char *buf,
180
+ # size_t padded_buflen, size_t blocksize)
181
+ ' sodium_unpad' => {
182
+ added => [1,0,14],
183
+ ffi => [
184
+ [' size_t*' , ' string' , ' size_t' , ' size_t' ] => ' int' ,
185
+ sub {
186
+ my ($xsub , $padded , $block_size ) = @_ ;
187
+ $block_size //= 16;
188
+ $block_size = 16 if $block_size < 0;
189
+
190
+ my $SIZE_MAX = Sodium::FFI::SIZE_MAX;
191
+ my $padded_len = length ($padded );
192
+ if ($padded_len < $block_size ) {
193
+ croak(" Invalid padding." );
194
+ }
195
+ my $unpadded_len = 0;
196
+ my $int = $xsub -> (\$unpadded_len , $padded , $padded_len , $block_size );
197
+ return substr ($padded , 0, $unpadded_len );
198
+ }
199
+ ],
200
+ fallback => sub { croak(" sodium_unpad not implemented until libsodium v1.0.14" ); },
201
+ },
88
202
);
89
203
90
204
foreach my $func (keys %function ) {
0 commit comments