@@ -113,6 +113,74 @@ def test_already_finalized(self, backend):
113113 with pytest .raises (AlreadyFinalized ):
114114 kdf .verify (b"material" , key )
115115
116+ def test_derive_into (self , backend ):
117+ kdf = KBKDFHMAC (
118+ hashes .SHA256 (),
119+ Mode .CounterMode ,
120+ 32 ,
121+ 4 ,
122+ 4 ,
123+ CounterLocation .BeforeFixed ,
124+ b"label" ,
125+ b"context" ,
126+ None ,
127+ backend = backend ,
128+ )
129+ buf = bytearray (32 )
130+ n = kdf .derive_into (b"material" , buf )
131+ assert n == 32
132+ # Verify the output matches what derive would produce
133+ kdf2 = KBKDFHMAC (
134+ hashes .SHA256 (),
135+ Mode .CounterMode ,
136+ 32 ,
137+ 4 ,
138+ 4 ,
139+ CounterLocation .BeforeFixed ,
140+ b"label" ,
141+ b"context" ,
142+ None ,
143+ backend = backend ,
144+ )
145+ expected = kdf2 .derive (b"material" )
146+ assert buf == expected
147+
148+ @pytest .mark .parametrize (("buflen" , "outlen" ), [(31 , 32 ), (33 , 32 )])
149+ def test_derive_into_buffer_incorrect_size (self , buflen , outlen , backend ):
150+ kdf = KBKDFHMAC (
151+ hashes .SHA256 (),
152+ Mode .CounterMode ,
153+ outlen ,
154+ 4 ,
155+ 4 ,
156+ CounterLocation .BeforeFixed ,
157+ b"label" ,
158+ b"context" ,
159+ None ,
160+ backend = backend ,
161+ )
162+ buf = bytearray (buflen )
163+ with pytest .raises (ValueError , match = "buffer must be" ):
164+ kdf .derive_into (b"material" , buf )
165+
166+ def test_derive_into_already_finalized (self , backend ):
167+ kdf = KBKDFHMAC (
168+ hashes .SHA256 (),
169+ Mode .CounterMode ,
170+ 32 ,
171+ 4 ,
172+ 4 ,
173+ CounterLocation .BeforeFixed ,
174+ b"label" ,
175+ b"context" ,
176+ None ,
177+ backend = backend ,
178+ )
179+ buf = bytearray (32 )
180+ kdf .derive_into (b"material" , buf )
181+ with pytest .raises (AlreadyFinalized ):
182+ kdf .derive_into (b"material2" , buf )
183+
116184 def test_key_length (self , backend ):
117185 error = OverflowError if sys .maxsize <= 2 ** 31 else ValueError
118186 with pytest .raises (error ):
0 commit comments