126 return digestLength;
127 }
128
129 private void fetchSession() {
130 token.ensureValid();
131 if (state == S_BLANK) {
132 try {
133 session = token.getOpSession();
134 state = S_BUFFERED;
135 } catch (PKCS11Exception e) {
136 throw new ProviderException("No more session available", e);
137 }
138 }
139 }
140
141 // see JCA spec
142 protected void engineReset() {
143 token.ensureValid();
144
145 if (session != null) {
146 if (state == S_INIT && token.explicitCancel == true) {
147 session = token.killSession(session);
148 } else {
149 session = token.releaseSession(session);
150 }
151 }
152 state = S_BLANK;
153 bufOfs = 0;
154 }
155
156 // see JCA spec
157 protected byte[] engineDigest() {
158 try {
159 byte[] digest = new byte[digestLength];
160 int n = engineDigest(digest, 0, digestLength);
161 return digest;
162 } catch (DigestException e) {
163 throw new ProviderException("internal error", e);
164 }
165 }
166
247 if (key instanceof P11Key == false) {
248 throw new InvalidKeyException("Not a P11Key: " + key);
249 }
250 P11Key p11Key = (P11Key)key;
251 if (p11Key.token != token) {
252 throw new InvalidKeyException("Not a P11Key of this provider: " +
253 key);
254 }
255
256 fetchSession();
257 try {
258 if (state == S_BUFFERED) {
259 token.p11.C_DigestInit(session.id(), mechanism);
260 state = S_INIT;
261 }
262
263 if (bufOfs != 0) {
264 token.p11.C_DigestUpdate(session.id(), 0, buffer, 0, bufOfs);
265 bufOfs = 0;
266 }
267 token.p11.C_DigestKey(session.id(), p11Key.keyID);
268 } catch (PKCS11Exception e) {
269 engineReset();
270 throw new ProviderException("update(SecretKey) failed", e);
271 }
272 }
273
274 // see JCA spec
275 protected void engineUpdate(ByteBuffer byteBuffer) {
276 int len = byteBuffer.remaining();
277 if (len <= 0) {
278 return;
279 }
280
281 if (byteBuffer instanceof DirectBuffer == false) {
282 super.engineUpdate(byteBuffer);
283 return;
284 }
285
286 fetchSession();
287 long addr = ((DirectBuffer)byteBuffer).address();
|
126 return digestLength;
127 }
128
129 private void fetchSession() {
130 token.ensureValid();
131 if (state == S_BLANK) {
132 try {
133 session = token.getOpSession();
134 state = S_BUFFERED;
135 } catch (PKCS11Exception e) {
136 throw new ProviderException("No more session available", e);
137 }
138 }
139 }
140
141 // see JCA spec
142 protected void engineReset() {
143 token.ensureValid();
144
145 if (session != null) {
146 if (state == S_INIT && token.explicitCancel == true
147 && session.hasObjects() == false) {
148 session = token.killSession(session);
149 } else {
150 session = token.releaseSession(session);
151 }
152 }
153 state = S_BLANK;
154 bufOfs = 0;
155 }
156
157 // see JCA spec
158 protected byte[] engineDigest() {
159 try {
160 byte[] digest = new byte[digestLength];
161 int n = engineDigest(digest, 0, digestLength);
162 return digest;
163 } catch (DigestException e) {
164 throw new ProviderException("internal error", e);
165 }
166 }
167
248 if (key instanceof P11Key == false) {
249 throw new InvalidKeyException("Not a P11Key: " + key);
250 }
251 P11Key p11Key = (P11Key)key;
252 if (p11Key.token != token) {
253 throw new InvalidKeyException("Not a P11Key of this provider: " +
254 key);
255 }
256
257 fetchSession();
258 try {
259 if (state == S_BUFFERED) {
260 token.p11.C_DigestInit(session.id(), mechanism);
261 state = S_INIT;
262 }
263
264 if (bufOfs != 0) {
265 token.p11.C_DigestUpdate(session.id(), 0, buffer, 0, bufOfs);
266 bufOfs = 0;
267 }
268 p11Key.incNativeKeyRef();
269 try {
270 token.p11.C_DigestKey(session.id(), p11Key.keyID);
271 } finally {
272 p11Key.decNativeKeyRef();
273 }
274 } catch (PKCS11Exception e) {
275 engineReset();
276 throw new ProviderException("update(SecretKey) failed", e);
277 }
278 }
279
280 // see JCA spec
281 protected void engineUpdate(ByteBuffer byteBuffer) {
282 int len = byteBuffer.remaining();
283 if (len <= 0) {
284 return;
285 }
286
287 if (byteBuffer instanceof DirectBuffer == false) {
288 super.engineUpdate(byteBuffer);
289 return;
290 }
291
292 fetchSession();
293 long addr = ((DirectBuffer)byteBuffer).address();
|